rebotを用いRobotFrameworkの結果を編集する


ターゲット

RF中級者向けの内容である

概要

RobotFramework(RF)を用い自動検証・テストを実施する際、しばしば出力した html ログ・レポートを編集したいことがある。例えば、試験の中に流しすぎる項目を消すこと、実施失敗した試験項目だけやり直したい、全体レポートでまとめることなどが挙げられる。

一般的に、pybot(テスト実施)とrebotは以下の関係である

今回、あるプロジェクトで、試験でSeleniumLibraryでキャプチャした画像のURLを変えたい。具体的はこの状態である。

複数テストケースで実施して、result_001, result_002 ... のようなフォルダーが作成された。各フォルダーの中にいつものRFの結果が log.html が作成され、その中に、SeleniumLibraryでキャプチャーされた画像が href で挿入されている。

各ログresult_XXX/log.html をブラウザーで開くと、正しくlogが確認されて、画像も表示されている。

次に、rebotを使い、すべてのresult_XXXのoutput.xmlをまとめ、一つのレポートファイルを作成する。

shell
rebot -d result result_001/output.xml result_002/output.xml result_003/output.xml

うまくいくようだったが、確認するとキャップチャーされた画像がうまく表示されていない。原因は、元々xmlの中に、画像の情報は各実行フォルダーに対する相対的なパスである。全体のlogファイルをrebotで作成された時、そのまま別フォルダー(result)に対する相対パスを使ってしまうので、画像のソースが正しくなくなった。

rebotのマニュアルをよく見ると、各output.xmlの処理の前後にユーザの制御を入れられる。以下のようにrebotで実現したい。

各キーワードの出力にあるimg src情報を親フォルダーに対する相対的なパスへ変更する

まず、このようなPythonクラス(modifier)を作成する。

RebotRebaseImg.py
import re
from robot.api import SuiteVisitor
from robot.result.model import TestSuite
from robot.result.model import TestCase
class RebotRebaseImg(SuiteVisitor):
    """ Rebases embeded img in output with new `base`

    Rebased folder is extract from `Log Folder` meta of the suite
    Sample
    $ rebot  --prerebotmodifier ./RebotRebaseImg.py -N xxx -L info -d result result_001/output.xml
    """
    def __init__(self):
        self.base = None

    def start_suite(self,suite):
        if 'Log Folder' in suite.metadata:
            log_folder=suite.metadata['Log Folder']
            self.base = log_folder.replace('[','').replace(']','').split('|')[0]

    def end_message(self,msg):
        if msg.html and re.match(r'.*<img src=.*>.*',msg.message):
            new_msg = re.sub(r'="([^"]*?.png)"','="%s/\\1"' % self.base, msg.message)
            msg.message = new_msg

ポイントは2つある。一つ目は、start_suiteはテストが開始する際、呼ばれている。このとき、meta dataを使い、ベース・フォルダーのパスを取得する。このやり方は、このケース限りであるが、他の手法(手動でも)ベース・フォルダーのパスを取得可能である。

二つ目は、end_messageである。これはキワードが 終了する際、ログに書き出す前に 呼ばれる。このように、end_messageで渡されたパラメータ msgをいじり、最終的にログに出力される情報を変更可能になる。

このクラス(modifier)を用い、もう一回rebotを実施する

shell
rebot --prerebotmodifier RebotRebaseImg.py -d result result_001/output.xml result_002/output.xml result_003/output.xml

結果として、全体まとめられた result/log.htmlにも、キャプチャーされた画像が正しく表示できるようになった。

※modifierの中に扱っている関数やクラスの内容についてマニュアルなどにはあまり書かれていない。その時、msgの詳細 は役に立つ。

まとめ

rebotおよび --prerebotmodifierの使い方について説明した。特集なケースであるが、マニュアルとあわせ、rebotの使い方、とくに--prerebotmodifierを用い、最終ログを編集する方法は参考になると思う。

参考