4.2远程库接口
远程库接口提供了在运行Robot Framework本身的机器上运行测试库的方法,以及使用除本机支持的Python和Java之外的其他语言实现库的方法。对于测试库,用户远程库看起来与任何其他测试库几乎相同,使用远程库接口开发测试库也非常接近于创建普通测试库。
4.2.1简介
使用远程库API有两个主要原因:
- 与运行Robot Framework的机器不同,可以在不同的机器上安装实际库。这为分布式测试提供了有趣的可能性
- 可以使用支持XML-RPC协议的任何语言来实现测试库 。Robot Framework 2.1包含用于Python / Jython和Ruby的通用远程服务器,计划将来为其他语言(如Java和Perl)实现通用服务器。
远程库接口由Remote库提供,Remote库是从Robot Framework 2.1开始的标准库之一。该库没有自己的任何关键字,但它作为核心框架和其他地方实现的关键字之间的代理。远程库通过远程服务器与实际库实现交互,远程库和服务器使用XML-RPC通道上的简单远程协议进行通信。所有这些的高级架构如下图所示:
4.2.2使用远程库
导入远程库
远程库需要知道远程服务器的地址,否则导入它并使用它提供的关键字与其他库的使用方式没有什么不同。如果您需要在测试套件中多次使用远程库,或者只是想为其提供更具描述性的名称,则可以使用WITH NAME语法导入它。
Setting | Value | Value | Value | Value |
---|---|---|---|---|
Library | Remote | http://localhost:8270 | WITH NAME | Example1 |
Library | Remote | http://10.0.0.42:7777 | WITH NAME | Example2 |
上面第一个示例使用的URL也是远程库在没有给出地址时使用的默认地址。同样,端口 8270是提供的远程服务器使用的默认端口。(82和70分别是字母R和F的ASCII码。)
启动和停止远程服务器
在导入远程库之前,必须启动提供实际关键字的远程服务器。如果在启动测试执行之前启动服务器,则可以使用常规 库设置,如上例所示。或者,其他关键字(例如来自OperatingSystem或SSH库)可以启动服务器,但是您可能需要使用Import Library关键字, 因为在测试执行开始时库不可用。
如何停止远程服务器取决于它的实现方式。以下方法适用于随Robot Framework分发的服务器:
- 无论使用何种库,远程服务器都提供可以从测试数据中使用的Stop Remote Server关键字。
- 远程服务器在其XML-RPC接口中具有stop_remote_server方法。
- 如果服务器在终端窗口上运行,Ctrl-C将停止服务器。不幸的是,这不适用于所有操作系统上的所有服务器。
- 可以使用操作系统提供的工具终止服务器进程(例如kill)。
注意
可以配置服务器,以便用户无法使用Stop Remote Server关键字或stop_remote_server 方法停止它 。
4.2.3支持的参数和返回值类型
由于XML-RPC协议不支持所有可能的对象类型,因此必须将远程库和远程服务器之间传输的值转换为兼容类型。这适用于远程库传递给远程服务器的关键字参数,以及返回值服务器返回远程库的关键字参数。
转换使用以下规则完成:
- 字符串,数字和布尔值无需修改即可传递。
- 在无/无值被转换为一个空字符串。
- 列表(和Python中的元组)作为列表传递,以便递归地转换它们的内容。
- 传递字典/映射,以便递归地将它们的值转换为支持的类型,并将键转换为字符串。
- 其他类型转换为字符串。
4.2.4使用远程服务器
Robot Framework 2.1包括用Python和Ruby编写的远程服务器实现。这些服务器以及下面显示的示例库和示例测试用例文件都包含在tools / remoteserver 目录下的源代码发行版中,也可以在 http://code.google.com/p/robotframework/wiki/RemoteLibrary中找到。
提供的服务器经过精心设计,因此可以轻松地使用它们创建测试库。使用这两个服务器的基本过程如下:
- 使用静态库API创建与普通测试库类似的测试库模块或类。使用Python服务器,也可以使用混合库API。
- 导入远程服务器类并创建它的实例,将库实例或模块作为参数提供给它。可能从命令行获取的侦听地址和端口可以作为可选参数给出。
这两个步骤都可以在相同的模块中完成,如下面的例子所示。从命令行执行这些模块作为脚本将启动远程服务器,以便它提供库中实现的关键字。
Python远程库示例
此示例演示如何使用远程服务器的Python版本。示例库实现关键字目录中的计数项和字符串应该相等。
#!/usr/bin/env python
import os
import sys
class ExampleRemoteLibrary:
"""Example library to be used with Robot Framework's remote server.
This documentation is visible in docs generated by _libdoc.py_
starting from Robot Framework 2.6.2.
"""
def __init__(self):
"""Also this doc should be in shown in library doc."""
def count_items_in_directory(self, path):
"""Returns the number of items in the directory specified by `path`."""
return len([i for i in os.listdir(path) if not i.startswith('.')])
def strings_should_be_equal(self, str1, str2):
print "Comparing '%s' to '%s'" % (str1, str2)
if str1 != str2:
raise AssertionError("Given strings are not equal")
if __name__ == '__main__':
from robotremoteserver import RobotRemoteServer
RobotRemoteServer(ExampleRemoteLibrary(), *sys.argv[1:])
Ruby远程库示例
此示例使用Ruby远程服务器并提供与前一个Python示例完全相同的关键字:
#!/usr/bin/env ruby
class ExampleRemoteLibrary
def count_items_in_directory(path)
Dir.entries(path).find_all{|i| not i.match('^.')}.length
end
def strings_should_be_equal(str1, str2)
puts "Comparing '#{str1}' to '#{str2}'"
if str1 != str2
raise RuntimeError, "Given strings are not equal"
end
end
end
if __FILE__ == $0
require "robotremoteserver"
RobotRemoteServer.new(ExampleRemoteLibrary.new, *ARGV)
end
4.2.5远程协议
本节介绍远程库和远程服务器之间使用的协议。此信息主要针对想要创建新远程服务器的用户。提供的Python和Ruby服务器也可以用作示例。
远程协议是在XML-RPC之上实现的,XML-RPC是一种使用XML over HTTP的简单远程过程调用协议。大多数主流语言(Python,Java,C,Ruby,Perl,Javascript,PHP,...)都支持XML-RPC内置或扩展。
所需方法
远程服务器是XML-RPC服务器,其公共接口必须具有与动态库API相同的方法。只有 get_keyword_names和run_keyword实际需要,但get_keyword_arguments和 get_keyword_documentation还建议。请注意,目前无法在方法名称中使用camelCase格式。如何实现实际关键字与远程库无关。远程服务器可以充当真实测试库的包装器,就像提供的Python和Ruby服务器那样,或者它可以自己实现关键字。
远程服务器还应 在其公共接口中具有stop_remote_server方法,以便于停止它们。他们还应该自动将此方法公开为Stop Remote Server关键字,以便无论测试库如何都可以在测试数据中使用它。允许用户使用这些方法停止服务器并不总是可取的,服务器可以选择允许通过某些配置参数禁用它们。
提供的Python远程服务器可用作参考实现。
获取远程关键字名称和其他信息
Remote库获取远程服务器使用get_keyword_names方法提供的关键字列表。此方法必须将关键字名称作为字符串列表返回。
远程服务器可以而且应该实现 get_keyword_arguments和get_keyword_documentation 方法,以提供有关关键字的更多信息。这两个关键字都将关键字的名称作为参数。必须以与动态库相同的格式将参数作为字符串列表返回,并且必须将文档作为字符串返回。
从Robot Framework 2.6.2开始,远程服务器还可以提供 在使用libdoc工具生成文档时使用的通用库文档。
执行远程关键字
当远程库希望服务器执行某些关键字时,它会调用远程服务器的run_keyword方法并向其传递关键字名称和参数列表。基类型可以直接用作参数,但更复杂的类型可以转换为支持的类型。
服务器必须在包含下表中说明的项的结果字典(或映射,具体取决于术语)中返回执行结果。
名称 | 说明 |
---|---|
状态 | 强制执行状态。通过或失败。 |
产量 | 写入日志文件的可能输出。必须作为单个字符串给出,但可以包含多个消息和格式的 不同日志级别* INFO *第一条消息 n * INFO *秒 n * WARN *另一条消息。 |
返回 | 可能的返回值。必须是受支持的类型之一。 |
错误 | 可能的错误消息。仅在执行失败时使用。 |
追溯 | 执行失败时,可能使用DEBUG级别写入日志文件的堆栈跟踪。 |
Name | Explanation |
---|---|
status | Mandatory execution status. Either PASS or FAIL. |
output | Possible output to write into the log file. Must be given as a single string but can contain multiple messages and different log levels in format *INFO* First message *INFO* Second *WARN* Another message. |
return | Possible return value. Must be one of the supported types. |
error | Possible error message. Used only when the execution fails. |
traceback | Possible stack trace to write into the log file using DEBUG level when the execution fails. |