pabot を使って、Robot Framework のテストを並行で実行する

この記事は 「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について

pabotGitHubにて公開されています。
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 ディレクトリが作成されました。

f:id:thinkAmi:20171215194800p:plain:w250

 
その中の 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