Robot Frameworkのライブラリを自作する

この記事は「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

 

ライブラリの作成

ユーザーガイドによると、ライブラリはPythonJava、どちらでも作成できるようです。今回は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 コマンドラインオプションでも実行できます。

 
Python-m コマンドラインオプションは、

このオプションが指定された場合、 sys.argv の最初の要素はモジュールファイルのフルパスになります (モジュールファイルを検索している間、最初の要素は "-m" に設定されます)。 -c オプションと同様に、カレントディレクトリが sys.path の先頭に追加されます。

-m <module-name> - 1. コマンドラインと環境 — Python 3.6.3 ドキュメント

です。

そのため、テストファイルと自作ライブラリのあるディレクトリに移動してからテストを実行することで、自作ライブラリを認識します。

# ディレクトリへ移動
$ 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