侦听器接口
机器人框架有一个侦听器接口,可以用于接收 对测试执行通知。 示例用法包括 外部测试监控,测试失败时发送邮件消息, 与其他系统进行通信。 侦听器API版本3也使得 它可以修改测试在测试执行和结果。
接收 通知,图书馆是活跃的。
监听使用
。 可以把多个侦听器 通过多次使用这个选项使用:
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
)作为 替代参数分隔符。 这是有用的侦听器参数 包含冒号,但是需要周围的整个价值 引用在类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或3,作为字符串或作为 整数,这取决于它所使用的API版本。 也有一个年长的 侦听器版本1,但是它不支持了由机器人框架3.0。
更多的 信息的听众能做什么。
另一个版本2和3之间的区别是,前者支持 Python和Java,但后者只支持Python。
侦听器接口方法
机器人框架测试执行时创建侦听器类的实例 直接启动和使用监听器实现模块。 在测试期间 执行不同的侦听器方法时调用测试套件、测试用例 和关键词的开始和结束。 额外的方法被称为当图书馆或 资源或变量文件导入,当输出文件准备好了, 最后整个测试执行结束时。 不需要一个侦听器 实现任何官方接口,它只需要它的方法 实际的需求。
。
侦听器版本2
可以使用。
| 方法 | 参数 | 文档 |
|---|---|---|
| start_suite | 名称、属性 |
当一个测试套件的开始。 内容属性字典:
|
| end_suite | 名称、属性 |
当一个测试套件。 内容属性字典:
|
| start_test | 名称、属性 |
当一个测试用例开始。 内容属性字典:
|
| end_test | 名称、属性 |
当测试用例结束。 内容属性字典:
|
| start_keyword | 名称、属性 |
当一个字开始。
内容属性字典:
|
| end_keyword | 名称、属性 |
一个关键字结束的时候叫。
内容属性字典:
|
| log_message | 消息 |
当执行一个字写一个日志消息。
。 |
| 消息 | 消息 |
消息。
|
| library_import | 名称、属性 |
时调用一个图书馆已导入。
内容属性字典:
2.9新机器人框架。 |
| resource_import | 名称、属性 |
当一个资源文件导入。
内容属性字典:
2.9新机器人框架。 |
| variables_import | 名称、属性 |
时调用一个变量文件导入。
内容属性字典:
2.9新机器人框架。 |
| output_file | 路径 |
已经准备好了。
|
| log_file | 路径 |
已经准备好了。
|
| report_file | 路径 |
已经准备好了。
|
| xunit_file | 路径 |
已经准备好了。
|
| debug_file | 路径 |
已经准备好了。
|
| 关闭 |
整个测试执行结束时调用。 外出时调用图书馆 的范围。 |
需要 实现任何显式接口或者所有这些方法。
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
但相关参数的方法测试执行是不同的。 这个API得到实际运行和结果模型对象所使用的机器人 框架本身,听众可以直接查询信息 他们需要和动态变化的模型对象。
方法和方法相关的输出文件被称为完全 在两个版本一样。
| 方法 | 参数 | 文档 |
|---|---|---|
| start_suite | 数据,结果 |
当一个测试套件的开始。
|
| end_suite | 数据,结果 |
当一个测试套件。 。 |
| start_test | 数据,结果 |
当一个测试用例开始。
|
| end_test | 数据,结果 |
当测试用例结束。 。 |
| start_keyword | N /一个 | 在射频3.0中没有实现。 |
| end_keyword | N /一个 | 在射频3.0中没有实现。 |
| log_message | 消息 |
。 。 |
| 消息 | 消息 |
消息。
|
| library_import | N /一个 | 在射频3.0中没有实现。 |
| resource_import | N /一个 | 在射频3.0中没有实现。 |
| variables_import | N /一个 | 在射频3.0中没有实现。 |
| output_file | 路径 |
已经准备好了。
|
| log_file | 路径 |
已经准备好了。
|
| report_file | 路径 |
已经准备好了。
|
| xunit_file | 路径 |
已经准备好了。
|
| debug_file | 路径 |
已经准备好了。
|
| 关闭 |
整个测试执行结束时调用。 外出时调用图书馆 的范围。 |
4.3.4听众日志
听众可以 利用。 有一些局限性,然而,不同的听众 方法可以日志消息在下面的表格说明。
| 方法 | 解释 |
|---|---|
| start_keyword, end_keyword, log_message | 根据关键字执行。 |
| start_suite, end_suite, start_test,end_test | 的部分 正常的日志文件。 |
| 消息 | syslog消息通常是记录。 如果 这个方法用于执行关键字时, 消息记录到日志文件正常。 |
| 其他方法 | 只记录到syslog的消息。 |
请注意
。
侦听器的例子
本节包含的例子使用侦听器接口。 有 第一个例子,刚从机器人框架,然后接收信息 示例修改执行测试并创建的结果。
获取信息
。
"""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.')
文件,可以使用它从命令行如下:
robot --listener path/to/PauseExecution.py tests.robot
和使用完全相同的方式从命令行。
"""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.')
是 可能比这个例子更有用。
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(