介紹Robot Framework中的Listener

Robot Framework測試框架中提供了多種用例執(zhí)行的方法,最常用的是Setup和Teardown户辞,今天嘗試該框架提供了Listener方法泌类,該方法提供了一種類似回調(diào)的機(jī)制,可以監(jiān)控測試執(zhí)行底燎,在執(zhí)行失敗時(shí)發(fā)送信息和調(diào)用其他系統(tǒng)刃榨。

Robot Framework框架提供了兩個(gè)版本的接口,2和3双仍,版本2支持JAVA和Python枢希,版本3只支持Python。同時(shí)版本3還支持修改測試數(shù)據(jù)朱沃,而版本2只能讀取苞轿。
接口版本由ROBOT_LISTENER_API_VERSION屬性定義茅诱。

本文主要介紹接口3的使用,同時(shí)會(huì)提供兩個(gè)使用示例搬卒,拋磚引玉之用瑟俭。

接口介紹

下表為第三版接口提供的方法,可以讀取和寫入測試數(shù)據(jù)秀睛。

方法 參數(shù) 描述
start_suite data, result Called when a test suite starts. data and result are model objects representing the executed test suite and its execution results, respectively.
end_suite data, result Called when a test suite ends.
start_test data, result Called when a test case starts.data and result are model objects representing the executed test case and its execution results, respectively.
end_test data, result Called when a test case ends.Same arguments as with start_test.
log_message message Called when an executed keyword writes a log message. message is a model object representing the logged message.This method is not called if the message has level below the current threshold level.
message message Called when the framework itself writes a syslog message. message is same object as with log_message.
output_file path Called when writing to an output file is ready.path is an absolute path to the file.
log_file path Called when writing to a log file is ready.path is an absolute path to the file.
report_file path Called when writing to a report file is ready.path is an absolute path to the file.
xunit_file path Called when writing to an xunit file is ready.path is an absolute path to the file.
debug_file path Called when writing to a debug file is ready.path is an absolute path to the file.
close Called when the whole test execution ends.With library listeners called when the library goes out of scope.

接口中的日志

Listener中的日志在不同接口中有一些限制尔当,下表給出詳細(xì)的介紹莲祸,重點(diǎn)關(guān)注是輸出到log文件還是控制臺(tái)蹂安。

方法 解釋
start_keyword, end_keyword, log_message 日志打印到日志log文件中的執(zhí)行關(guān)鍵字下面。
start_suite, end_suite, start_test, end_test 日志打印到系統(tǒng)日志中锐帜,如果日志級(jí)別為Warnings田盈,日志將打印到日志log文件中的相應(yīng)位置中。
message 日志打印到系統(tǒng)日志中缴阎,如果日志是在關(guān)鍵字中調(diào)用允瞧,日志將打印到日志log文件中的相應(yīng)位置中。
Other methods 日志打印到系統(tǒng)日志中蛮拔。

Listener的例子

獲取執(zhí)行信息

  • 使用函數(shù)
"""Listener that stops execution if a test fails."""

ROBOT_LISTENER_API_VERSION = 3

def end_test(data, result):
    if not result.passed:
        print('Test "{0}" failed: {1}'.format(result.name, result.message))
  • 使用類
import os.path
import tempfile


class PythonListener:
    ROBOT_LISTENER_API_VERSION = 3

    def end_test(self, name, attrs):
        if not result.passed:
            print('Test "{0}" failed: {1}'.format(result.name, result.message))

使用類要注意類名要和文件名一樣述暂,否則不能調(diào)用成功。

修改執(zhí)行信息

  • 修改執(zhí)行測試套
    下邊的例子將在測試套中添加一個(gè)測試用例New Test并添加關(guān)鍵字Log建炫。
ROBOT_LISTENER_API_VERSION = 3

def start_suite(suite, result):
    suite.tests.create(name='New test')

def start_test(test, result):
    test.keywords.create(name='Log', args=['Keyword added by listener!'])
  • 修改測試結(jié)果
class ResultModifier(object):
    ROBOT_LISTENER_API_VERSION = 3

    def __init__(self, max_seconds=10):
        self.max_milliseconds = float(max_seconds) * 1000

    def end_test(self, data, test):
        if test.status == 'PASS' and test.elapsedtime > self.max_milliseconds:
            test.status = 'FAIL'
            test.message = 'Test execution took too long.'

上述接口實(shí)現(xiàn)了如果測試用例執(zhí)行時(shí)間大于10s后將用例結(jié)果設(shè)置為Fail畦韭。

使用Listener

  • 不帶參數(shù)的調(diào)用
robot --listener lister.py test.robot 
  • 帶參數(shù)的調(diào)用
robot --listener lister.py:arg1:arg2 test.robot 

應(yīng)用示例

  • 保存執(zhí)行中的監(jiān)控日志
    如果測試用例執(zhí)行失敗,我們可能需要保存用例執(zhí)行過程中的所有日志信息肛跌,如下代碼可以簡單實(shí)現(xiàn)此功能艺配。
import os.path
import tempfile


class PythonListener:
    ROBOT_LISTENER_API_VERSION = 3

    def start_test(self, name, attrs):
        start_sys_log()

    def end_test(self, name, attrs):
        if attrs['status'] != 'PASS':
            save_sys_log()
  • 修改日志格式
    如果用例中打印的信息為圖片文件,可以使用Listener修改輸出格式衍慎。
class ResultModifier(object):
    ROBOT_LISTENER_API_VERSION = 3

    def log_message(self, msg):
        if '.png' in msg.message[:-5] and not msg.html:
            msg.message = '<a href = "{0}"><img src="{0}" width="800px"></a>'.format(msg.message)
            msg.html = True

總結(jié)

Listener為我們提供了一個(gè)在用例執(zhí)行過程中和框架通訊的機(jī)制转唉,通過這個(gè)機(jī)制可以實(shí)現(xiàn)很多意想不到的功能。
Robot Framework自帶的編輯器在執(zhí)行器在執(zhí)行用例的時(shí)候就是通過Listener來實(shí)現(xiàn)輸出更多的信息的功能稳捆。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末赠法,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子乔夯,更是在濱河造成了極大的恐慌期虾,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驯嘱,死亡現(xiàn)場離奇詭異镶苞,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)鞠评,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門茂蚓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事聋涨×涝。” “怎么了?”我有些...
    開封第一講書人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵牍白,是天一觀的道長脊凰。 經(jīng)常有香客問我,道長茂腥,這世上最難降的妖魔是什么狸涌? 我笑而不...
    開封第一講書人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮最岗,結(jié)果婚禮上帕胆,老公的妹妹穿的比我還像新娘。我一直安慰自己般渡,他們只是感情好懒豹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著驯用,像睡著了一般脸秽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蝴乔,一...
    開封第一講書人閱讀 51,245評(píng)論 1 299
  • 那天记餐,我揣著相機(jī)與錄音,去河邊找鬼淘这。 笑死剥扣,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的铝穷。 我是一名探鬼主播钠怯,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼曙聂!你這毒婦竟也來了晦炊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤宁脊,失蹤者是張志新(化名)和其女友劉穎断国,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體榆苞,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡稳衬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了坐漏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片薄疚。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡碧信,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出街夭,到底是詐尸還是另有隱情砰碴,我是刑警寧澤,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布板丽,位于F島的核電站呈枉,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏埃碱。R本人自食惡果不足惜猖辫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望乃正。 院中可真熱鬧住册,春花似錦婶博、人聲如沸瓮具。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽名党。三九已至,卻和暖如春挠轴,著一層夾襖步出監(jiān)牢的瞬間传睹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來泰國打工岸晦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留欧啤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓启上,卻偏偏與公主長得像邢隧,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子冈在,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354