Python製の受け入れテストのフレームワークとして、Robot Frameworkがあります。
当初、ドキュメントが充実しているのでテストコードが書きやすいかなと思いました。
ただ、いざ書いてみるようとすると「こういう時はどう書けばよいのか」と悩みました。
そこで今回、Robot Frameworkの組込機能であるBuiltin Libraryを使ってみた時のメモを残します。
目次
環境
- Python 3.6.1
- Robot Framework 3.0.2
- pipでインストール可能
pip install robotframework
- テストコードを含むファイル:builtin_lib_test.robot
- Robot Frameworkの対象ファイルは、拡張子が
robot
のもの
コンソール出力まわり
コンソールにHello, world!を出力する
log to console
キーワードを使い、コンソールへと出力します。
*** Settings ***
Documentation ビルトインの機能を使ったテスト
*** TestCases ***
コンソールを使ったテスト
# Hello, world!
log to console Hello, world!
ポイントは
log to console
キーワードに値を渡す場合、半角スペース2つ + 出力したい文字列
- Robot Frameworkでは、半角スペース2個をキーワードの区切りとして認識するため
- キーワードに渡す文字列は、クォートで囲む必要なし
- クォートで囲むと、そのクォートまでコンソールに出力
- コメントはPython同様、文頭に
#
を書く
です。
robot
コマンドを使って実行したところ、Hello, world!が出力されました。
$ robot builtin_library_samples/builtin_lib_test.robot
==============================================================================
Builtin Lib Test :: ビルトインの機能を使ったテスト
==============================================================================
コンソールを使ったテスト Hello, world!
なお、昔からあるコマンド
などはdeprecated & 将来的には削除されると、GitHubのREADMEに記載がありました。
robotframework/robotframework: Generic test automation framework.
日本語をコンソールへ出力する
日本語を出力したい場合も、そのまま書けば良いです。
log to console こんにちは!
# => こんにちは!
文字列まわり
文字列の中にスペースを2つ以上使う
Hello, world!
では、文字列の中にスペースが1つ含まれていました。
ただ、2つ以上のスペースを入れると、文字列の中のスペースではなくキーワードの区切りと認識されてしまいます。
そのため、2つ以上のスペースを入れたい時は、組込定数${SPACE}
を使います。
# スペースが2個以上必要な場合は、組込変数${SPACE}を利用する
log to console スペースが${SPACE}${SPACE}${SPACE}3個必要
# => スペースが 3個必要
# 拡張変数表記も使える
log to console スペースが${SPACE * 3}3個必要
# => スペースが 3個必要
文字列を結合する
Catenate
を使います。
なお、デフォルトでは文字間にスペースが入ります。
文字間にスペースが不要な場合は、SEPARATOR=
という書き方をします。
# 文字間スペースあり
${スペースあり} = Catenate スペース あり
log to console ${スペースあり}
# => スペース あり
# 文字間スペース無し
${スペースなし} = Catenate SEPARATOR= スペース 無し
log to console ${スペースなし}
# => スペース無し
文字列に該当の文字が含まれているか確認する
Should Contain
を使います。
Should Contain 対象の文字列 検索する文字列
の順に指定します。
# Pythonという文字列の中に、thという文字列が含まれるか
Should Contain Python th
なお、
- 何回含まれているかを検証するキーワード
- 1回でも含まれるかを検証するキーワード(リストなどにも使える)
もあります。
キーワードまわり
キーワードを自作する
今までは*** TestCases ***
の下に直接log to console
などを記述しました。しかし、それだと他のテストケースでは再利用できません。
そのため、キーワード(いわゆる関数)の自作を行うため、
*** Keywords ***
コンソールに文字を出力する
log to console Hello, world!
と、*** Keywords ***
に定義します。
*** TestCases ***
では
*** TestCases ***
コンソールを使ったテスト
コンソールに文字を出力する
のように、自作キーワードを利用します。
なお、キーワードには半角スペース1個を含めることもできます。
スペース があるキーワード を実行する
log to console スペースのあるキーワードです
キーワードの仮引数を定義する
[Arguments]を使う
[Arguments]
で、キーワードの仮引数を定義できます。
なお、[Arguments]
は一行で書く必要があります。キーワード内に[Arguments]
が複数あると、used multiple times
エラーが発生します。
引数を受け取ってメッセージを出力する1
[Arguments] ${foo} ${bar}
log to console ${foo}
log to console ${bar}
上記のキーワードは
*** TestCases ***
コンソールを使ったテスト
引数を受け取ってメッセージを出力する1 foo=フー1 bar=バー1
と使うことができます。
実行すると、
フー1
バー1
となります。
継続行を使って[Arguments]を複数行表記にする
[Arguments]
は一行で書く必要があるため、引数が多くある場合は見づらくなってしまいます。
そのため、...
を使って継続行の表記もできます。
python 2.7 - If ElseIf in Robot Framework - Stack Overflow
上記の例の継続行表記は、
引数を受け取ってメッセージを出力する2
[Arguments] ${foo}
... ${bar}
log to console ${foo}
log to console ${bar}
です。
なお、three-dotの後にはスペースを2つ以上入れないと、正しく認識されません。
キーワードの中に仮引数を埋め込む
キーワードの中に仮引数を埋め込むこともできます。
キーワードを埋め込んでコンソールに${メッセージ}を出力する
log to console ${メッセージ}
使う側は
キーワードを埋め込んでコンソールに分かりにくいハローを出力する
#=> 分かりにくいハロー
となります。
これを使う場合は分かりづらくなるため、「」
などで囲んで引数であることを明示したほうがいいかもしれません。
キーワードの戻り値を定義する
[Return]を使う
[Return]で戻り値を定義できます。
Returnで戻り値を取得する
[Return] 戻り値1
使う側は
${foo4} = Returnで戻り値を取得する
となります。
Return From Keywordを使う
Return From Keyword
は[Return]
と同じです。
ReturnFromKeywordで戻り値を取得する
Return From Keyword 戻り値2
Return From Keyword Ifを使う
条件によって戻り値を返す場合は、Return From KeywordIf
を使います。
ReturnFromKeywordIfで戻り値を取得する
Return From Keyword If ${true} 戻り値3
変数まわり
変数に値を設定する
set variable
キーワードで値を設定します。
=
の左側はスペース1つ、右側はスペース2つになります。
また、キーワードと引数を区別するため、set variableと実際に設定する値の間はスペースが2つ必要です。
${variable} = set variable こんばんは!
log to console ${variable}
# => こんばんは!
条件付きで変数に値を設定する
set variable if
キーワードを使います。
以下の書き方は常に「条件を満たさない値」がコンソールに出力されます。
${condition_value} = set variable if False 空データ 条件を満たさない値
log to console ${condition_value}
# => 条件を満たさない値
リスト変数を用意する
変数のタイプとして、${}
の他に、
などがあります。
今回はリスト変数なので、@{FRUIT}
のように、@
を使って定義します。
今回は、*** Variables ***
に記載して、グローバルな変数として使ってみます。
*** Variables ***
@{FRUIT} りんご みかん
*** Keywords ***
コンソールに配列を出力する
log to console ${\n}---$を出力---
log to console ${FRUIT}
log to console ---@を出力---
log to console @{FRUIT}
log to console @{FRUIT}[0]
log to console @{FRUIT}[1]
結果です。
---$を出力---
['りんご', 'みかん']
---@を出力---
りんご
りんご
みかん
また、set variable
でも配列を変数に設定できます。
@{medals} = set variable 金 銀 銅
log to console ${medals}
# => ['金', '銀', '銅']
Ifまわり
条件に応じてキーワードを実行する(クォート版)
Run Keyword If
を使います。
ポイントは
- 引数などの変数が空白かなどの評価をする場合、引数と
${EMPTY}
を'
でクォートする必要がある
ELSE IF
やELSE
を使い場合は、継続行表記(...
)を使う
です。
キーワードの定義は以下となります。
Ifを使って処理を切り替えてログを出力する
[Arguments] ${引数}
Run Keyword If '${引数}' == '${EMPTY}' log to console 空っぽです1
... ELSE IF '${引数}' == '${false}' log to console Falseです1
... ELSE log to console ${引数}
使う側は
# 準備として、空の値を取得する
${empty_value} = ReturnFromKeywordで空の戻り値を取得する
# 実際にキーワードを使うところ
Ifを使って処理を切り替えてログを出力する 引数=${empty_value}
Ifを使って処理を切り替えてログを出力する 引数=${false}
Ifを使って処理を切り替えてログを出力する 引数=値が入ってます1
です。
なお、キーワードで[Arguments]
に引数
という文字列を定義しているため、キーワードを使う側も文字列引数
を指定して値を渡しています。
条件に応じてキーワードを実行する(評価ネームスペース版)
もう一つの書き方として、評価ネームスペースを使う方法があります。
Robot Framework 2.9以降の場合、
Robot Framework 2.9 からは、変数自体を評価ネームスペース (evaluation namespace) の中で使えるようになりました。 ネームスペース中の変数は、波括弧のない $variable のような特殊な変数の書き方で表わせます。 この書き方にした変数はクオートする必要はなく、テストファイル中で一旦文字列に置き換えられたりもしません。
http://robotframework-ja.readthedocs.io/ja/latest/lib/BuiltIn.html#evaluating-expressions
とのことです。
試してみたところ、
${EMPTY}
ではうまく動作しない(クォートする必要がある)
Variable '$EMPTY' not found.
エラー
- 引数や
${false}
などは評価ネームスペースを使ってもうまく動作する
でした。
そのため、書き方は
Ifを使って処理を切り替えてログを出力する(評価ネームスペース版)
[Arguments] ${引数}
Run Keyword If $引数 == '${EMPTY}' log to console 空っぽです2
... ELSE IF $引数 == $false log to console Falseです2
... ELSE log to console ${引数}
となります。
キーワードを使う側は変わりません。
# 準備として、空の値を取得する
${empty_value} = ReturnFromKeywordで空の戻り値を取得する
# 実際にキーワードを使うところ
Ifを使って処理を切り替えてログを出力する(評価ネームスペース版) 引数=${empty_value}
Ifを使って処理を切り替えてログを出力する(評価ネームスペース版) 引数=${false}
Ifを使って処理を切り替えてログを出力する(評価ネームスペース版) 引数=値が入ってます2
Forループまわり
Forループにはいくつか方法があります。
Robot Framework User Guide
今回は IN RANGE
を使う方法と、listを使う方法を記載します。
IN RANGEを使ったForループ
Pythonのfor in rangeと似たようなものです。
ループブロックに関する注意点は
\
(バックスラッシュ)で示す
- バックスラッシュの後ろには、スペースを2つ以上入れる
です。
Forループを使う(InRange版)
:FOR ${i} IN RANGE 1 4
\ log to console ${i}回目
listを使ったForループ
今回はCreate List
キーワードを使ってリストを作成し、そのリストをループしてみます。
使い方は以下です。
@{items} = create list 1 4 6
:FOR ${v} IN @{items}
\ log to console リストの値は${v}
Forループを抜ける
Exit For Loop If
を使います。
:FOR ${v} IN one two three
\ exit for loop if $v == 'two'
\ log to console ${v}
キーワードの実行まわり
今回は
- Fail
- Run Keyword And Return Status
- Run Keyword And Ignore Error
について記載します。
Run Keyword系には、その他にも色々とありますので、公式ドキュメントを読んでみると良いかもしれません。
強制的にキーワードを失敗させる
Fail
を使います。失敗した時のメッセージを引数として渡せます。
Fail 常に失敗する
キーワードの成否を確認する
Run Keyword And Return Status
を使うと、失敗する可能性のあるキーワードの実行に対する成否判定を行うことができます。
そのため、「想定していた失敗であれば、テストが落ちないようにしたい」などの用途に使えます。
${成否} = Run Keyword And Return Status 常に失敗するキーワードを実行する
log to console ${成否}
#=> False
キーワードが失敗しても無視する
Run Keyword And Ignore Error
を使うと、
- キーワードが失敗しても、テストを継続できる
- キーワードが失敗した時のエラーメッセージを取得できる
を行えます。
用途しては、「キーワード失敗時のメッセージにより処理を分けたい」などでしょうか。
${エラーメッセージ} = Run Keyword And Ignore Error 常に失敗するキーワードを実行する
log to console ${エラーメッセージ}
#=> ('FAIL', '常に失敗する')
Evaluate
を使います。
以下では、Pythonコードを使ってゼロ埋めをしています。
python - Robot Framework string padding - Stack Overflow
${結果} = Evaluate '%06d %s' % (1, 'ゼロ埋めです')
log to console ${結果}
条件を満たしていない場合、テストをパスする
Pass Execution If
を使います。
Pass Execution If ${true} テストをパスしました!
なお、常にパスしたい時は Pass Execution
を使います。
現在のテストまわりの情報を取得する
組込変数が用意されています。
例えば、
*** TestCases ***
コンソールを使ったテスト
現在のテスト名を取得する
というテストケースの場合、
*** Keywords ***
現在のテスト名を取得する
log to console ${TEST NAME}
#=> コンソールを使ったテスト
log to console ${SUITE NAME}
#=> Robotframework Sample.Builtin Library Samples.Builtin Lib Test
という結果になります。
GitHubに上げました。builtin_library_samples/builtin_lib_test.robot
ファイルが、今回作成したファイルです。
thinkAmi-sandbox/RobotFramework-sample