この記事は「Robot Framework Advent Calendar 2017 - Qiita」の7日目の記事です。
Robot Frameworkを使っている中で、Robot Frameworkのライブラリを自作したいことがあるかもしれません。
ユーザーガイドにて方法を調べてみると、以下に記載がありました。
4.1 Creating test libraries - Robot Framework User Guide
そこで今回は、ユーザーガイドに従ってライブラリを自作してみます。
目次
環境
- Robot Framework 3.0.2
- Python 3.6.3
ライブラリの作成
ユーザーガイドによると、ライブラリはPythonとJava、どちらでも作成できるようです。今回はPythonで作成してみます。
また、今回はターミナルにログを出力するライブラリを作ります。
Robot Frameworkの Programmatic logging APIs
を使うことで、ターミナルにログが出力できるようです。
Programmatic logging APIs - Robot Framework User Guide
今回は、
- logging APIのモジュール
robot.api.logger
を使用 - Robot Frameworkのテストで使うためのキーワードは、英語と日本語の両方を用意
- ライブラリ名は
MyLibrary.py
- PascalCaseで書く慣習のようですが、小文字だけでも問題ない
- MyLibraryでもmy_libraryでも動作
とします。
MyLibrary.py
from robot.api import logger def hello_world(key='default'): logger.console(f'{key} de hello world') def ハロー_ワールド(key='デフォルト'): logger.console(f'{key} を使ったハローワールド')
完成したライブラリをRobot Frameworkで使うためには、PYTHONPATH
など module search path
と呼ばれる所にライブラリを置く必要があります。
3.4.5 Configuring where to search libraries and other extensions - Robot Framework User Guide
その場所に
- 自作ライブラリファイルをそのまま
- setuptoolsなどを使ってパッケージング
のいずれかで置けば良いようです。
Packaging libraries - Robot Framework User Guide
今回は、自作ライブラリをそのまま置くことにします。
ライブラリを使用するテストファイルを用意
自作したライブラリはSettingsで指定します。
なお、今回のテストファイルでは、ライブラリで定義したキーワードはどの程度まで認識されるかを調べるため、キーワードの区切り文字として
- スペースなし
- アンダースコア
- 半角スペース
- 全角スペース1つ
- 全角スペース複数
- タブ文字
をそれぞれ試してみます。
*** Settings *** Library MyLibrary *** Test Cases *** 英語のキーワードをテストする # 見やすいように改行する Log To Console ${EMPTY} # キーワード、引数の順(キーワードと引数の間は半角スペース2個空けている) hello_world アンダースコア hello world 半角スペース helloworld スペースなし 日本語のキーワードをテストする # 見やすいように改行する Log To Console ${EMPTY} # キーワード、引数の順(キーワードと引数の間は半角スペース2個空けている) ハロー_ワールド アンダースコア ハロー ワールド 半角スペース ハローワールド スペースなし ハロー ワールド 全角スペース1個 ハロー ワールド 全角スペース2個 ハロー ワールド タブ文字
実行
ファイルの配置
現在のファイルの配置は以下の通りです。
自作ライブラリとテストファイルを同じディレクトリに入れてあります。
$ pwd /path/to/create_library_sample $ tree -L 1 . ├── MyLibrary.py └── test_hello_using_my_library.robot
実行コマンド
robotコマンド
普通に robot
コマンドで実行した場合、
$ robot test_hello_using_my_library.robot [ ERROR ] Error in file '/path/to/test_hello_using_my_library.robot': Importing test library 'MyLibrary' failed: ModuleNotFoundError: No module named 'MyLibrary' Traceback (most recent call last): None PYTHONPATH: /path/to/venv/bin /path/to/.pyenv/versions/3.6.3/lib/python36.zip /path/to/.pyenv/versions/3.6.3/lib/python3.6 /path/to/.pyenv/versions/3.6.3/lib/python3.6/lib-dynload /path/to/venv/lib/python3.6/site-packages ========================== Test Hello Using My Library ========================== 英語のキーワードをテストする 英語のキーワードをテストする | FAIL | No keyword with name 'hello_world' found. ------------------------------------ 日本語のキーワードをテストする 日本語のキーワードをテストする | FAIL | No keyword with name 'ハロー_ワールド' found. ------------------------------------ Test Hello Using My Library | FAIL | 2 critical tests, 0 passed, 2 failed 2 tests total, 0 passed, 2 failed ==========================
と、キーワードが見つからないというエラーになります。
PYTHONPATHなどで自作ライブラリが見つからないためです。
robotコマンド + --pythonpath (-P) オプション
Robot Frameworkの実行コマンド robot
には、指定したパスをmodule search pathに追加してくれる --pythonpath (-P)
オプションがあります。
試してみます。
$ robot -P . test_hello_using_my_library.robot =============================== Test Hello Using My Library =============================== 英語のキーワードをテストする .アンダースコア de hello world .半角スペース de hello world .スペースなし de hello world 英語のキーワードをテストする | PASS | ------------------------------------------- 日本語のキーワードをテストする .アンダースコア を使ったハローワールド .半角スペース を使ったハローワールド .スペースなし を使ったハローワールド .全角スペース1個 を使ったハローワールド .全角スペース2個 を使ったハローワールド 日本語のキーワードをテストする | FAIL | No keyword with name 'ハロー' found. ------------------------------------------- Test Hello Using My Library | FAIL | 2 critical tests, 1 passed, 1 failed 2 tests total, 1 passed, 1 failed ===============================
自作ライブラリを認識してくれたようです。
ただ、キーワードが一つ失敗しています。タブ文字のキーワード指定っぽいです。そのため、
日本語のキーワードをテストする #... #ハロー ワールド タブ文字
とコメントアウトして再実行してみます。
$ robot -P . test_hello_using_my_library.robot =============================== Test Hello Using My Library =============================== 英語のキーワードをテストする .アンダースコア de hello world .半角スペース de hello world .スペースなし de hello world 英語のキーワードをテストする | PASS | ------------------------------------------- 日本語のキーワードをテストする .アンダースコア を使ったハローワールド .半角スペース を使ったハローワールド .スペースなし を使ったハローワールド .全角スペース1個 を使ったハローワールド .全角スペース2個 を使ったハローワールド 日本語のキーワードをテストする | PASS | ------------------------------------------- Test Hello Using My Library | PASS | 2 critical tests, 2 passed, 0 failed 2 tests total, 2 passed, 0 failed ===============================
テストをパスしました。
python -m robot で実行
Robot Frameworkは、Pythonの -m
コマンドラインオプションでも実行できます。
- http://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#executing-installed-robot-module
- http://robotframework-ja.readthedocs.io/ja/latest/userguide/INSTALL.html#robot
このオプションが指定された場合、 sys.argv の最初の要素はモジュールファイルのフルパスになります (モジュールファイルを検索している間、最初の要素は "-m" に設定されます)。 -c オプションと同様に、カレントディレクトリが sys.path の先頭に追加されます。
です。
そのため、テストファイルと自作ライブラリのあるディレクトリに移動してからテストを実行することで、自作ライブラリを認識します。
# ディレクトリへ移動 $ cd /path/to/create_library_sample # ディレクトリの中身を確認 create_library_sample $ tree -L 1 . ├── MyLibrary.py └── test_hello_using_my_library.robot # -m オプションを付けて実行 $ python -m robot test_hello_using_my_library.robot ========================= Test Hello Using My Library ========================= 英語のキーワードをテストする .アンダースコア de hello world .半角スペース de hello world .スペースなし de hello world 英語のキーワードをテストする | PASS | ----------------------------------- 日本語のキーワードをテストする .アンダースコア を使ったハローワールド .半角スペース を使ったハローワールド .スペースなし を使ったハローワールド .全角スペース1個 を使ったハローワールド .全角スペース2個 を使ったハローワールド 日本語のキーワードをテストする | PASS | ----------------------------------- Test Hello Using My Library | PASS | 2 critical tests, 2 passed, 0 failed 2 tests total, 2 passed, 0 failed =========================
ソースコード
GitHubに上げました。create_library_sample
ディレクトリが今回のものです。
thinkAmi-sandbox/RobotFramework-sample: Robot Framewrok samples