robotframework笔记24
侦听器接口
机器人框架有一个侦听器接口,可以用于接收 对测试执行通知。 示例用法包括 外部测试监控,测试失败时发送邮件消息, 与其他系统进行通信。 侦听器API版本3也使得 它可以修改测试在测试执行和结果。
侦听器类或模块与某些特殊的方法,和他们 可以用Python和Java实现。 侦听器监控 整个测试执行必须纳入使用从命令行。 除此之外, 测试库可以注册侦听器 接收 通知,图书馆是活跃的。
监听使用
监听被使用从命令行 ——侦听器 选项,侦听器是给它的名称作为参数。 的 侦听器的名称叫从类或模块实现 监听器接口,同样 测试库的名字 从类 实现它们。 指定监听器必须是相同的 模块搜索 路径 在测试库搜索时都是进口的。 其他 选择是给听众一个绝对或相对路径文件 同样与测试库 。 可以把多个侦听器 通过多次使用这个选项使用:
robot --listener MyListener tests.robot robot --listener com.company.package.Listener tests.robot robot --listener path/to/MyListener.py tests.robot robot --listener module.Listener --listener AnotherListener tests.robot
还可以给侦听器类从命令参数 线。 参数指定侦听器后名称使用冒号(或路径) ( :
)作为分隔符。 如果一个侦听器作为一个绝对Windows路径, 冒号后驱动器并不被视为分隔符。 从 2.8.7机器人框架,可以使用分号( ;
)作为 替代参数分隔符。 这是有用的侦听器参数 包含冒号,但是需要周围的整个价值 引用在类unix操作系统:
robot --listener listener.py:arg1:arg2 tests.robot robot --listener "listener.py;arg:with:colons" tests.robot robot --listener C:\Path\Listener.py;D:\data;E:\extra tests.robot
侦听器接口版本
有两个版本支持侦听器接口。 侦听器版本2 因为机器人框架2.1,支持版本3 机器人3.0和新框架。 一个监听器必须有属性 ROBOT_LISTENER_API_VERSION
值2或3,作为字符串或作为 整数,这取决于它所使用的API版本。 也有一个年长的 侦听器版本1,但是它不支持了由机器人框架3.0。
侦听器版本2和3之间的主要区别是前者 得到执行,但不能直接影响它的信息。 后者 接口获取数据和结果对象机器人框架本身使用,因此 能改变执行和变化的结果。 看到 侦听器的例子 更多的 信息的听众能做什么。
另一个版本2和3之间的区别是,前者支持 Python和Java,但后者只支持Python。
侦听器接口方法
机器人框架测试执行时创建侦听器类的实例 直接启动和使用监听器实现模块。 在测试期间 执行不同的侦听器方法时调用测试套件、测试用例 和关键词的开始和结束。 额外的方法被称为当图书馆或 资源或变量文件导入,当输出文件准备好了, 最后整个测试执行结束时。 不需要一个侦听器 实现任何官方接口,它只需要它的方法 实际的需求。
侦听器版本2和3有基本相同的方法,但是参数 他们接受是不同的。 这些方法及其参数解释道 在接下来的部分。 所有的方法都有一个强调以他们的名义 也 camelCase 的选择。 例如,start_suite
方法可以 也有使用的名字 startSuite
。
侦听器版本2
侦听器API版本2中的方法在下表中列出。 所有方法与测试执行进展具有相同的签名 方法(名称、属性)
,在那里 属性
是一个词典,它包含 事件的细节。 侦听器方法可以自由做任何他们想做的事 他们收到的信息,但他们不能直接改变 它。 如果这是必要的, 侦听器版本3 可以使用。
方法 | 参数 | 文档 |
---|---|---|
start_suite | 名称、属性 |
当一个测试套件的开始。 内容属性字典:
|
end_suite | 名称、属性 |
当一个测试套件。 内容属性字典:
|
start_test | 名称、属性 |
当一个测试用例开始。 内容属性字典:
|
end_test | 名称、属性 |
当测试用例结束。 内容属性字典:
|
start_keyword | 名称、属性 |
当一个字开始。
内容属性字典:
|
end_keyword | 名称、属性 |
一个关键字结束的时候叫。
内容属性字典:
|
log_message | 消息 |
当执行一个字写一个日志消息。
3.0从射频,调用这个方法并不是如果消息 低于当前水平吗 阈值水平 。 |
消息 | 消息 |
框架本身写时调用的方法 syslog 消息。
|
library_import | 名称、属性 |
时调用一个图书馆已导入。
内容属性字典:
2.9新机器人框架。 |
resource_import | 名称、属性 |
当一个资源文件导入。
内容属性字典:
2.9新机器人框架。 |
variables_import | 名称、属性 |
时调用一个变量文件导入。
内容属性字典:
2.9新机器人框架。 |
output_file | 路径 |
当编写一个 输出文件 已经准备好了。
|
log_file | 路径 |
当写作 日志文件 已经准备好了。
|
report_file | 路径 |
当写作 报告文件 已经准备好了。
|
xunit_file | 路径 |
当编写一个 xunit文件 已经准备好了。
|
debug_file | 路径 |
当写作 调试文件 已经准备好了。
|
关闭 |
整个测试执行结束时调用。 与 图书馆的听众 外出时调用图书馆 的范围。 |
可用的方法和他们的论点也正式Java所示 下面的接口规范。 的内容 java.util。 映射属性
是 如上表。 它应该记得一个侦听器 不 需要 实现任何显式接口或者所有这些方法。
public interface RobotListenerInterface {
public static final int ROBOT_LISTENER_API_VERSION = 2;
void startSuite(String name, java.util.Map attributes);
void endSuite(String name, java.util.Map attributes);
void startTest(String name, java.util.Map attributes);
void endTest(String name, java.util.Map attributes);
void startKeyword(String name, java.util.Map attributes);
void endKeyword(String name, java.util.Map attributes);
void logMessage(java.util.Map message);
void message(java.util.Map message);
void outputFile(String path);
void logFile(String path);
void reportFile(String path);
void debugFile(String path);
void close();
}
侦听器版本3
侦听器版本3相同的方法 侦听器版本2 但相关参数的方法测试执行是不同的。 这个API得到实际运行和结果模型对象所使用的机器人 框架本身,听众可以直接查询信息 他们需要和动态变化的模型对象。
侦听器版本3是在机器人框架3.0中引入的。 至少 最初它没有版本2的所有方法。 的 主要原因是 合适的模型对象内部不可用 。 的 关闭
方法和方法相关的输出文件被称为完全 在两个版本一样。
方法 | 参数 | 文档 |
---|---|---|
start_suite | 数据,结果 |
当一个测试套件的开始。
|
end_suite | 数据,结果 |
当一个测试套件。 同样的参数作为 |
start_test | 数据,结果 |
当一个测试用例开始。
|
end_test | 数据,结果 |
当测试用例结束。 同样的参数作为 |
start_keyword | N /一个 | 在射频3.0中没有实现。 |
end_keyword | N /一个 | 在射频3.0中没有实现。 |
log_message | 消息 |
当执行一个字写一个日志消息。 调用这个方法并不是如果消息级别以下 当前的 阈值水平 。 |
消息 | 消息 |
框架本身写时调用的方法 syslog 消息。
|
library_import | N /一个 | 在射频3.0中没有实现。 |
resource_import | N /一个 | 在射频3.0中没有实现。 |
variables_import | N /一个 | 在射频3.0中没有实现。 |
output_file | 路径 |
当编写一个 输出文件 已经准备好了。
|
log_file | 路径 |
当写作 日志文件 已经准备好了。
|
report_file | 路径 |
当写作 报告文件 已经准备好了。
|
xunit_file | 路径 |
当编写一个 xunit文件 已经准备好了。
|
debug_file | 路径 |
当写作 调试文件 已经准备好了。
|
关闭 |
整个测试执行结束时调用。 与 图书馆的听众 外出时调用图书馆 的范围。 |
4.3.4听众日志
机器人提供了一个框架 程序化的日志记录api 听众可以 利用。 有一些局限性,然而,不同的听众 方法可以日志消息在下面的表格说明。
方法 | 解释 |
---|---|
start_keyword, end_keyword, log_message | 消息记录到正常 日志文件 根据关键字执行。 |
start_suite, end_suite, start_test,end_test | 消息记录到 syslog 。 警告 所示的 执行错误 的部分 正常的日志文件。 |
消息 | syslog消息通常是记录。 如果 这个方法用于执行关键字时, 消息记录到日志文件正常。 |
其他方法 | 只记录到syslog的消息。 |
请注意
为了避免递归,听众不发送消息记录 侦听器方法 log_message
和 消息
。
侦听器的例子
本节包含的例子使用侦听器接口。 有 第一个例子,刚从机器人框架,然后接收信息 示例修改执行测试并创建的结果。
获取信息
第一个例子是作为Python模块实现和使用 侦听器 版本2 。
"""Listener that stops execution if a test fails."""
ROBOT_LISTENER_API_VERSION = 2
def end_test(name, attrs):
if attrs['status'] == 'FAIL':
print 'Test "%s" failed: %s' % (name, attrs['message'])
raw_input('Press enter to continue.')
如果上面的例子将被保存,例如, PauseExecution.py 文件,可以使用它从命令行如下:
robot --listener path/to/PauseExecution.py tests.robot
同样的例子也可以使用更新的实现 侦听器版本3 和使用完全相同的方式从命令行。
"""Listener that stops execution if a test fails."""
ROBOT_LISTENER_API_VERSION = 3
def end_test(data, result):
if not result.passed:
print 'Test "%s" failed: %s' % (result.name, result.message)
raw_input('Press enter to continue.')
下一个示例,它仍然使用Python,稍微复杂一些。 它 写它到一个文本文件的所有信息在一个临时目录中 没有格式。 文件名可以从命令行,但是 也有一个默认值。 请注意,在实际使用中, 调试文件 功能可以通过命令行选项 ——debugfile 是 可能比这个例子更有用。
import os.path
import tempfile
class PythonListener:
ROBOT_LISTENER_API_VERSION = 2
def __init__(self, filename='listen.txt'):
outpath = os.path.join(tempfile.gettempdir(), filename)
self.outfile = open(outpath, 'w')
def start_suite(self, name, attrs):
self.outfile.write("%s '%s'\n" % (name, attrs['doc']))
def start_test(self, name, attrs):
tags = ' '.join(attrs['tags'])
self.outfile.write("- %s '%s' [ %s ] :: " % (name, attrs['doc'], tags))
def end_test(self, name, attrs):
if attrs['status'] == 'PASS':
self.outfile.write('PASS\n')
else:
self.outfile.write('FAIL: %s\n' % attrs['message'])
def end_suite(self, name, attrs):
self.outfile.write('%s\n%s\n' % (attrs['status'], attrs['message']))
def close(self):
self.outfile.close()
下面的示例实现了与上一个相同的功能, 但使用Java,而不是Python。
import java.io.*;
import java.util.Map;
import java.util.List;
public class JavaListener {
public static final int ROBOT_LISTENER_API_VERSION = 2;
public static final String DEFAULT_FILENAME = "listen_java.txt";
private BufferedWriter outfile = null;
public JavaListener() throws IOException {
this(DEFAULT_FILENAME);
}
public JavaListener(String filename) throws IOException {
String tmpdir = System.getProperty("java.io.tmpdir");
String sep = System.getProperty("file.separator");
String outpath = tmpdir + sep + filename;
outfile = new BufferedWriter(new FileWriter(outpath));
}
public void startSuite(String name, Map attrs) throws IOException {
outfile.write(name + " '" + attrs.get("doc") + "'\n");
}
public void startTest(String name, Map attrs) throws IOException {
outfile.write("- " + name + " '" + attrs.get("doc") + "' [ ");
List tags = (List)attrs.get("tags");
for (int i=0; i < tags.size(); i++) {
outfile.write(tags.get(i) + " ");
}
outfile.write(" ] :: ");
}
public void endTest(String name, Map attrs) throws IOException {
String status = attrs.get("status").toString();
if (status.equals("PASS")) {
outfile.write