Robot Framework(十五) 扩展RobotFramework框架——远程库接口
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\n*INFO* Second\n*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. |
Robot Framework(十五) 扩展RobotFramework框架——远程库接口的更多相关文章
- Robot Framework(十六) 扩展RobotFramework框架——使用监听器接口
4.3使用监听器接口 Robot Framework有一个侦听器接口,可用于接收有关测试执行的通知.监听器是具有某些特殊方法的类或模块,它们可以用Python和Java实现.监听器接口的示例用法包括外 ...
- Robot Framework(十四) 扩展RobotFramework框架——创建测试库
4.1创建测试库 Robot Framework的实际测试功能由测试库提供.有许多现有的库,其中一些甚至与核心框架捆绑在一起,但仍然经常需要创建新的库.这个任务并不复杂,因为正如本章所示,Robot ...
- Robot Framework(五)使用测试库
使用测试库 测试库包含那些最低级别的关键字,通常称为 库关键字,实际上与被测系统交互.所有测试用例总是使用某些库中的关键字,通常是通过更高级别的用户关键字.本节介绍如何使用测试库以及如何使用它们提供的 ...
- Robot Framework(十七) 扩展RobotFramework框架——扩展Robot Framework Jar
4.4扩展Robot Framework Jar 使用标准JDK安装中包含的jar命令,可以非常简单地向Robot Framework jar添加其他测试库或支持代码.Python代码必须放在jar里 ...
- robotframework的学习笔记(十五)----robotframework标准库Collections
Collections库是RobotFramework用来处理列表和字典的库,官方文档是这样介绍的:A test library providing keywords for handling lis ...
- robot framework用python扩展编写自定义library
我的utils.py文件 #!/usr/bin/env python #-*- coding:utf8 -*- __version__ = '0.1' import sys reload(sys) s ...
- Android Multimedia框架总结(十五)Camera框架之Camera2补充
转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52751055 前言:监于5.0之 ...
- Robot framework(RF) Builti,Screenshot和Collections标准库介绍
1.1 Builti标准类库 在学习一门编程语言的时候,大多教材都是从打印“hello world”开始.我们可以像编程语言一样来学习Robot Framework.虽然通过RIDE 提供“填表”一 ...
- Robot Framework学习笔记(四)------Screenshot 库屏幕截图
Scrennshot 同样为 Robot Framework 标准类库,我们只将它提供的其它中一个关键字"TakeScreenshot",它用于截取到当前窗口. 1.导入Scren ...
随机推荐
- (八)SpringBoot之freeMarker基本使用
一.案例 1.1 pom.xml <dependencies> <!-- 除去logback支持 --> <dependency> <groupId>o ...
- WPF 自定义一个控件,当点击按钮是触发到ViewModel(业务逻辑部分)和Xaml路由事件(页面逻辑部分)
#region - 用于绑定ViewModel部分 - public ICommand Command { get { return (ICommand)GetValue(CommandPropert ...
- Django admin 外键关联默认显示用户的username
使用默认User表.默认显示用户username,转换成get_full_name() /home/labsmith/venv_labsmit/lib/python3.6/site-packages/ ...
- python运行报错:cannot import name 'InteractiveConsole'
ModuleNotFoundError: No module named '_pydevd_bundle.pydevd_cython' ImportError: cannot import name ...
- [书籍翻译] 《JavaScript并发编程》 第二章 JavaScript运行模型
本文是我翻译<JavaScript Concurrency>书籍的第二章 JavaScript运行模型,该书主要以Promises.Generator.Web workers等技术来讲解J ...
- 补充:Python安装
需要安装Python2.7.Numpy和Matplotlib.由于Python不支持向下兼容,因此在Python3.×下你一定能正常运行Python2.×的代码.上述模块最简单的安装方法就是用软件包安 ...
- javascript实现Html Table数据表分页
直接调用: <style type="text/css"> th { font-size:18px; ...
- Vs2017 FrameWork EF Mysql 控制台应用
1 运行环境 vs2017 Net FromWork 4.6.2 手动版 没有 ado.net 实体数据模型 2 NuGet MySql.Data.Entity 6.10.9, MySq ...
- Bert-util安装
转载:https://blog.csdn.net/u013109501/article/details/91987180 https://blog.csdn.net/Vancl_Wang/articl ...
- Java字节码常量池深度剖析与字节码整体结构分解
常量池深度剖析: 在上一次[https://www.cnblogs.com/webor2006/p/9416831.html]中已经将常量池分析到了2/3了,接着把剩下的分析完,先回顾一下我们编译的源 ...