侦听器接口

机器人框架有一个侦听器接口,可以用于接收 对测试执行通知。 示例用法包括 外部测试监控,测试失败时发送邮件消息, 与其他系统进行通信。 侦听器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

可以使用。

在侦听器API方法2
方法 参数 文档
start_suite 名称、属性

当一个测试套件的开始。

内容属性字典:

  • 对于第二个 孩子,等等。 在射频2.8.5新。
  • :套件名称包括父套件。
  • :套件文档。
  • 作为一个字典/地图。
  • :文件/目录的绝对路径 被创建的。 新在射频2.7。
  • :直接儿童套房此套件的名称 作为一个列表。
  • :测试此套件的名称列表。 不包括测试可能的儿童套房。
  • :在此套件测试的总数。 及其所有sub-suites作为一个整数。
  • :套件执行开始时间。
end_suite 名称、属性

当一个测试套件。

内容属性字典:

  • :套件执行结束时间。
  • :总执行时间以毫秒为单位 一个整数
  • :套件统计(传递的数量 和失败的测试套件)作为一个字符串。
  • :错误消息如果套件安装或拆卸 没有,否则空。
start_test 名称、属性

当一个测试用例开始。

内容属性字典:

  • ,在那里 一开始是父组件id和最后一部分 显示测试套件的指数。 在射频2.8.5新。
  • 父套件包括:测试名称。
  • :测试文档。
  • :测试标签作为一个字符串列表。
  • 根据测试被认为是 至关重要的。
  • :用于测试模板的名称。 一个空字符串如果测试没有模板化。
  • 测试执行:执行开始时间。
end_test 名称、属性

当测试用例结束。

内容属性字典:

  • 测试执行:执行结束时间。
  • :总执行时间以毫秒为单位 一个整数
  • :状态信息。 通常一个错误 消息或一个空字符串。
start_keyword 名称、属性

当一个字开始。

内容属性字典:

  • 获取详细信息。
  • :没有库或关键字的名字 资源前缀。 新在射频2.9。
  • :图书馆或资源的名称 关键词属于,或一个空字符串 关键字在一个测试用例文件。 新在射频2.9。
  • :关键字的文档。
  • :关键字参数作为一个字符串列表。
  • :一个变量名,关键字的列表 返回值分配给。 新在射频2.9。
  • 作为一个字符串列表。 新在射频3.0。
  • :关键字执行开始时间。
end_keyword 名称、属性

一个关键字结束的时候叫。

内容属性字典:

  • :关键字执行结束时间。
  • :总执行时间以毫秒为单位 一个整数
log_message 消息

当执行一个字写一个日志消息。

是一个字典,以下内容:

  • :消息的内容。
  • 用于日志消息。
  • 表示消息是否 应该解释为HTML或不是。

消息 消息

消息。

方法。

library_import 名称、属性

时调用一个图书馆已导入。

是 指定的别名。

内容属性字典:

  • :参数传递给库列表。
  • 与库与Java或者得到实现 源库失败的一些原因。
  • 关键字。

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得到实际运行和结果模型对象所使用的机器人 框架本身,听众可以直接查询信息 他们需要和动态变化的模型对象。

方法和方法相关的输出文件被称为完全 在两个版本一样。

在侦听器API方法3
方法 参数 文档
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(

相关文章: