この記事は 「Robot Framework Advent Calendar 2017 - Qiita」 の15日目の記事です。
Robot Frameworkのテストケースが増えるにつれ、すべてが終わるまでに時間がかかるようになります。
この問題を解決する方法の一つとして、テストを並行で流すということが考えられます。
そこで今回は、Robot Frameworkのテストケースを並行で実行する pabot
ライブラリを紹介します。
目次
環境
- Python 3.6.3
- Robot Framework 3.0.2
- pabot 0.43
pabotについて
pabot
はGitHubにて公開されています。
mkorpela/pabot: Parallel executor for Robot Framework test cases.
インストールはpipで可能です。
$ pip install -U robotframework-pabot
READMEには
A parallel executor for Robot Framework tests. With Pabot you can split one execution into multiple and save test execution time.
とあります。
pabotを使うことで、Robot Frameworkのテストスイートが最小の並行処理単位となります。これにより、テストを並行で実行できるようです。
pabotで並行テストしてみる
テストケースがまったく同じである、2つのテストファイルを用意します。
ファイル名は
- test_parallel1.robot
- test_parallel2.robot
とします。
今回、開始時刻と終了時刻をログ出力するテストケースを用意しました。
*** Settings *** Library pabot.PabotLib Library DateTime *** Keywords *** ${timing}時刻を出力する ${start} = Get Current Date result_format=datetime Log To Console ${\n}${timing}:${start} *** TestCases *** 並行処理テスト 開始時刻を出力する 終了時刻を出力する
pabotを使って並行実行してみます。
コマンドラインより、 pabot <テストスイートが含まれるディレクトリ>
にて実行します。
$ pabot . 2017-12-15 12:59:46.495300 [PID:92080] [0] EXECUTING Parallel Test.Test Parallel1 2017-12-15 12:59:46.496719 [PID:92081] [1] EXECUTING Parallel Test.Test Parallel2 2017-12-15 12:59:47.222611 [PID:92080] [0] PASSED Parallel Test.Test Parallel1 in 0.7 seconds 2017-12-15 12:59:47.326672 [PID:92081] [1] PASSED Parallel Test.Test Parallel2 in 0.8 seconds Output: /path/to/parallel_test/output.xml Log: /path/to/parallel_test/log.html Report: /path/to/parallel_test/report.html Elapsed time: 0 minutes 1.103 seconds
通常のRobot Frameworkのテストと同じく、
- output.xml
- log.html
- report.html
が出力されました。
テスト実行ディレクトリを見ると、新しく pabot_results
ディレクトリが作成されました。
その中の stdout.txt
ファイルを開くと、通常ターミナルに出力される内容がテキストファイルとして出力されていました。
======================== Parallel Test ======================== Parallel Test.Test Parallel1 ======================== 並行処理テスト 開始:2017-12-15 12:59:47.016138 終了:2017-12-15 12:59:47.018580 | PASS | --------------------------------- Parallel Test.Test Parallel1 | PASS | 1 critical test, 1 passed, 0 failed 1 test total, 1 passed, 0 failed ======================== Parallel Test | PASS | 1 critical test, 1 passed, 0 failed 1 test total, 1 passed, 0 failed ======================== Output: /path/to/parallel_test/pabot_results/Parallel Test.Test Parallel1/output.xml
pabot.PabotLibの利用
pabotはコマンドラインで利用するだけではありません。
pabot.PabotLib
としてテストケースの中で参照することで、並行処理向けの便利なキーワードが追加されます。
追加されるキーワードについては、以下のドキュメントにまとまっています。 https://cdn.rawgit.com/mkorpela/pabot/master/PabotLib.html
今回は
- テストケース間で設定ファイルを共有する
- テストケース間で処理の排他制御を行う
を試してみます。
テストケース間で設定ファイルを共有する
並行実行するテストケース間で設定ファイルを共有したい場合、キーワード Acquire Value Set
を使います。
テストケースでは
Acquire Value Set
にて、設定ファイルの参照開始Get Value From Set <変数名>
にて、設定ファイルの変数名を取得するRelease Value Set
にて、設定ファイルの参照解除
と使います。
*** Settings *** Library pabot.PabotLib Library DateTime *** Keywords *** ${timing}時刻を出力する ${start} = Get Current Date result_format=datetime Log To Console ${\n}${timing}:${start} *** TestCases *** ハローワールドする # ファイルの参照開始 ${valueset_name} = Acquire Value Set 開始時刻を出力する # 読み込んだファイルの中から、hello を取り出して出力する ${hello} = Get Value From Set hello Log To Console ${hello} # ファイルの参照終了 Release Value Set 終了時刻を出力する
実行時には、--resourcefile
オプションを使用し、設定ファイルを指定します。
また、 --pabotlib
を追加することで、PabotLibのリモートサーバが起動します。これにより、共有設定ファイルの参照や、処理の排他制御が可能になります。
$ pabot --pabotlib --resourcefile valueset.dat .
実行結果は以下となります。
$ pabot --pabotlib --resourcefile valueset.dat . Robot Framework remote server at 127.0.0.1:8270 started. 2017-12-15 12:59:19.913537 [PID:92010] [1] EXECUTING Shared File Test.Test Shared File2 2017-12-15 12:59:19.915366 [PID:92011] [0] EXECUTING Shared File Test.Test Shared File1 2017-12-15 12:59:20.544879 [PID:92011] [0] PASSED Shared File Test.Test Shared File1 in 0.6 seconds 2017-12-15 12:59:22.517075 [PID:92010] [1] PASSED Shared File Test.Test Shared File2 in 2.5 seconds Output: /path/to/shared_file_test/output.xml Log: /path/to/shared_file_test/log.html Report: /path/to/shared_file_test/report.html Stopping PabotLib process Robot Framework remote server at 127.0.0.1:8270 stopped. Elapsed time: 0 minutes 3.394 seconds
各テストスイートのログファイルにも、Log To Consoleで指定した設定ファイルの内容が出力されています。
=========================== Shared File Test.Test Shared File1 =========================== ハローワールドする 開始:2017-12-15 12:59:20.338099 Hello, world! 終了:2017-12-15 12:59:20.345375 | PASS |
テストケース間で、処理の排他制御を行う
テストケースの並行実行時に、複数の処理から同時に処理できないものがある場合、キーワード Acquire Lock
を使って排他制御を行います。
これにより、
- 1つのテストケースの中の処理だけ実行
- 他のテストケースの処理は待機
となります。
なお、 Acquire Lock
の引数で渡すロック名は、どのテストスイートでも同じ値を使用します。
また、ロックが終わったら、忘れずに Release Lock
を実行します。
*** Settings *** Library pabot.PabotLib Library DateTime *** Keywords *** ${timing}時刻を出力する ${start} = Get Current Date result_format=datetime Log To Console ${\n}${timing}:${start} *** TestCases *** ロック待ちをするテスト # ロック開始 Acquire Lock MyLock1 開始時刻を出力する sleep 5s 終了時刻を出力する # ロック終了 Release Lock MyLock1
同じ内容のファイルを2つ用意し、実行してみます。
$ pabot --pabotlib . Robot Framework remote server at 127.0.0.1:8270 started. 2017-12-15 12:47:10.654487 [PID:90778] [0] EXECUTING Lock Test.Test Pabot Lock1 2017-12-15 12:47:10.657422 [PID:90779] [1] EXECUTING Lock Test.Test Pabot Lock2 2017-12-15 12:47:16.572726 [PID:90778] [0] PASSED Lock Test.Test Pabot Lock1 in 5.7 seconds 2017-12-15 12:47:21.552718 [PID:90779] [1] PASSED Lock Test.Test Pabot Lock2 in 10.5 seconds Output: /path/to/lock_test/output.xml Log: /path/to/lock_test/log.html Report: /path/to/lock_test/report.html Stopping PabotLib process Robot Framework remote server at 127.0.0.1:8270 stopped. Elapsed time: 0 minutes 12.257 seconds
それぞれのテストスイートが5秒以上の差を持って終了しています。
出力されたログを見てみると、
===================== Lock Test.Test Pabot Lock1 ===================== ロック待ちをするテスト 開始:2017-12-15 12:47:11.369327 終了:2017-12-15 12:47:16.372781 | PASS |
と
===================== Lock Test.Test Pabot Lock2 ===================== ロック待ちをするテスト 開始:2017-12-15 12:47:16.386501 終了:2017-12-15 12:47:21.388838 | PASS |
でした。
きちんとロック待ちをしていました。
ソースコード
GitHubに上げました。ディレクトリ pabot_sample
の中が今回のファイルです。
thinkAmi-sandbox/RobotFramework-sample: Robot Framewrok samples