Robot Framework测试框架中提供了多种用例执行的方法,最常用的是Setup和Teardown,今天尝试该框架提供了Listener方法,该方法提供了一种类似回调的机制,可以监控测试执行,在执行失败时发送信息和调用其他系统。
Robot Framework框架提供了两个版本的接口,2和3,版本2支持JAVA和Python,版本3只支持Python。同时版本3还支持修改测试数据,而版本2只能读取。
接口版本由ROBOT_LISTENER_API_VERSION属性定义。
本文主要介绍接口3的使用,同时会提供两个使用示例,抛砖引玉之用。
接口介绍
下表为第三版接口提供的方法,可以读取和写入测试数据。
方法 | 参数 | 描述 |
---|---|---|
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中的日志在不同接口中有一些限制,下表给出详细的介绍,重点关注是输出到log文件还是控制台。
方法 | 解释 |
---|---|
start_keyword, end_keyword, log_message | 日志打印到日志log文件中的执行关键字下面。 |
start_suite, end_suite, start_test, end_test | 日志打印到系统日志中,如果日志级别为Warnings,日志将打印到日志log文件中的相应位置中。 |
message | 日志打印到系统日志中,如果日志是在关键字中调用,日志将打印到日志log文件中的相应位置中。 |
Other methods | 日志打印到系统日志中。 |
Listener的例子
获取执行信息
- 使用函数
"""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))
使用类要注意类名要和文件名一样,否则不能调用成功。
修改执行信息
- 修改执行测试套
下边的例子将在测试套中添加一个测试用例New Test并添加关键字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!'])
- 修改测试结果
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.'
上述接口实现了如果测试用例执行时间大于10s后将用例结果设置为Fail。
使用Listener
- 不带参数的调用
robot --listener lister.py test.robot
- 带参数的调用
robot --listener lister.py:arg1:arg2 test.robot
应用示例
- 保存执行中的监控日志
如果测试用例执行失败,我们可能需要保存用例执行过程中的所有日志信息,如下代码可以简单实现此功能。
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
总结
Listener为我们提供了一个在用例执行过程中和框架通讯的机制,通过这个机制可以实现很多意想不到的功能。
Robot Framework自带的编辑器在执行器在执行用例的时候就是通过Listener来实现输出更多的信息的功能。