受け入れテストのフレームワークRobot Frameworkで、組込機能であるBuiltin Libraryを使ってみた

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!

なお、昔からあるコマンド

  • pybot
  • jybot
  • ipybot

などは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

 
なお、

もあります。

 

キーワードまわり

キーワードを自作する

今までは*** 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を使います。

ポイントは

です。

キーワードの定義は以下となります。

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', '常に失敗する')

 

Pythonコードを実行する

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