引言:

Robot Framework的四层结构已经极大的提高了它的扩展性。我们可以使用它丰富的扩展库来完成大部分测试工作。可是碰到下面两种情况,仅靠四层结构就不好使了:

1.有些复杂的测试可能跨越多个物理机器,且有的测试库也必须部署在被测系统上。

2.一个测试要使用多个库,但是有的只能用jybot运行,有的只能用pybot运行(这种情况很常见)。

远程库接口的原理:

为了解决上述两个难题,Robot Framework提供了远程库接口技术(remote library interface)。

什么是远程库接口技术呢?其实很简单,远程库接口就是把原来的测试库变成了三部分

一部分我们可以叫他远程库(Remote Library),第二部分叫做远程服务器(Remote Server),第三部分是真正的测试库(Test Library)。 测试库提供真正的测试功能,它被远程服务器包裹起来,通过XML-RPC协议被远程库访问(见下图)。它的实现思路说白了就是设计模式中的Proxy模式。

这样做的好处显而易见。远程库只要遵守XML-RPC协议就可以访问远程服务器,远程服务器的实现方式是什么就无关紧要了,这就意味着我们可以使用任何支持XML-RPC的高级语言为RF写扩展库了,查了查资料,几乎所有的高级语言都支持这个古老的简单协议。

使用远程接口库:

如上文所说,RF把原来的测试库分成了远程库、远程服务器、测试库三部分。那么怎样才能把原有的测试库进行改造呢?我们首先得有个Server。目前RF
提供了Python,Ruby,.Net,Java,Perl和Clojure的Server。在这个链接可以下载它们:

http://code.google.com/p/robotframework/wiki/RemoteLibrary

下载到远程服务器后进行包裹工作,然后在RF调用远程库。

下面我使用Python例子来详细说明如何使用远程库。

Ø  下载Server

Python的server实现的非常简单,只有一个文件,几kb大小。

我们可以在这个网址下载它:

http://robotframework.googlecode.com/hg/tools/remoteserver/robotremoteserver.py

Ø  改造测试库

有人会问,不是用proxy模式么?为什么要改造测试库?不是应该改造做proxy的server么?

其实改造谁都行。但是python有一个非常好的特性就是能够根据是直接被调用或者间接被调用动态决定行为。我们利用这一点,就能改造已有的测试库,使它同时能够当做本地库,也能被远程调用。

拿Robotframework的内建String库为例:

首先我们将robotremoteserver.py拷贝到String.py同一目录下,然后打开String库的源代码并在最后加入下面代码:

if __name__ == '__main__':

import
sys

from
robotremoteserver import RobotRemoteServer

RobotRemoteServer(String(), *sys.argv[1:])

保存。然后一个远程服务器包裹的String库就好了。

分析一下代码,我们只是实例化了一个远程服务器,并且将String类作为参数传了进去。

其实我们在这里还能设置远程服务器IP和端口号。

if __name__ == '__main__':

import
sys

from
robotremoteserver import RobotRemoteServer

RobotRemoteServer(String(),’172.22.xx.xx’,’8081’ *sys.argv[1:])

如果不设置,也可以在运行这个Server的时候设置。

Ø  运行远程库

在命令行模式进入String.py所在的目录,执行

String.py  172.22.22.42 
8081

这时候RF就会告诉你一个包裹着测试库的远程服务器已经被启动了。

Ø  在RF中调用远程库

首先我们要引用Remote Library,引用后就能直接使用了,跟使用本地库没有任何区别。

下面是测试远程String库的脚本。

*** Settings ***

Library          
Remote   
172.22.22.42:8081   
WITH NAME   
RString

*** Test Cases ***

TestFetch

${str}   
Fetchfromleft   
I love test   
5

脚本中引用了刚才我们建立的远程库,所有远程库的名称都叫做Remote,不同的只是后面的ip地址和端口号,我们也可用WITH
NAME 关键字给它起一个别名,这是为了解决多个远程库里有相同关键字的问题(可以使用关键字前加命名空间的方式加以区分)

下面链接是其它高级语言实现的远程库接口的说明,由于原理相似,就不再一一说明了。

JAVA:  http://code.google.com/p/jrobotremoteserver/

Perl:  http://code.google.com/p/plrobotremoteserver/

.NET:   http://code.google.com/p/sharprobotremoteserver/

小结:

利用远程库接口技术,我们几乎可以把所有提供接口的测试工具都粘合起来,外边报个皮就行了。我们也可以用各种高级语言写测试库了。不过值得说明的是,有些
server还不完善,比如Java远程库接口就不能正确的传递Exception,猜测是一些复杂对象不好通过XML-RPC协议进行序列化,感觉这个
可以再包一层皮:)

使用远程接口库进一步扩展Robot Framework的测试能力的更多相关文章

  1. Robot Framework(十七) 扩展RobotFramework框架——扩展Robot Framework Jar

    4.4扩展Robot Framework Jar 使用标准JDK安装中包含的jar命令,可以非常简单地向Robot Framework jar添加其他测试库或支持代码.Python代码必须放在jar里 ...

  2. Robot Framework - 3 - 测试库API

    08- 创建测试库--发布测试库 ***** 测试库文档 为了便于维护,测试库文档应该从源代码中生成. Robot  Framework 有自己的文档工具 libdoc.py生成 API 文档. 一个 ...

  3. Robot Framework自定义测试库的作用域的理解

    robot framework中,强大的测试库api支持,用户可根据实际需求定义测试库,导入后可使用自定义库中相应的关键字. 当自定义的测试库是类库,则需要考虑一个问题:类实例.用类实现的库可以有内部 ...

  4. Robot Framework web测试demo

    1.Open RIDE: ride.py 2.New Project: "File" -> "New Project" ,click "OK&q ...

  5. Maven 整合 robot framework 进行测试

    1. 在maven pom.xml中先配置robot framework的plugin: <plugin> <!-- integration test runner (robot-f ...

  6. 【转载】扩展Robot Framework,实现失败用例自动再执行(失败重跑)

    使用自动化脚本进行测试,经常受环境影响等各方面导致本能成功的脚本失败,下面介绍了RFS框架下,失败重跑的方法: 通过改写RobotFramework源代码增加--retry选项,实现test级别的失败 ...

  7. Robot Framework(十五) 扩展RobotFramework框架——远程库接口

    4.2远程库接口 远程库接口提供了在运行Robot Framework本身的机器上运行测试库的方法,以及使用除本机支持的Python和Java之外的其他语言实现库的方法.对于测试库,用户远程库看起来与 ...

  8. Robot Framework(十四) 扩展RobotFramework框架——创建测试库

    4.1创建测试库 Robot Framework的实际测试功能由测试库提供.有许多现有的库,其中一些甚至与核心框架捆绑在一起,但仍然经常需要创建新的库.这个任务并不复杂,因为正如本章所示,Robot ...

  9. robotframework的学习笔记(十三)------Robot Framework常用库简介

    标准库 Robot Framework可以直接导入使用的库,包括: Builtin:包含经常需要的关键字.自动导入无需import,因此总是可用的 Dialogs:提供了暂停测试执行和从用户的输入方式 ...

随机推荐

  1. H5 存储数据sessionStorage

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. 【js】react-native Could not find iPhone 6 simulator 和 Entry, ":CFBundleIdentifier", Does Not Exist 两种报错解决办法

    一.在运行rn app应用时,react-native run:ios 报错出现   Could not find iPhone 6 simulator  解决办法: 1.react-native r ...

  3. tf.squeeze()

    转载自:https://www.cnblogs.com/mdumpling/p/8053376.html 原型 tf.squeeze(input, squeeze_dims=None, name=No ...

  4. 2019-8-31-win10-uwp-使用-WinDbg-调试

    title author date CreateTime categories win10 uwp 使用 WinDbg 调试 lindexi 2019-08-31 10:30:35 +0800 201 ...

  5. Linux内核 结构 struct urb

    struct urb 结构中和 USB 设备驱动有关的成员是: struct usb_device *dev 指向这个 urb 要发送到的 struct usb_device 的指针. 这个变量必须被 ...

  6. CP防火墙导入.csv格式的对象

    Step1:将.csv格式的对象上传到管理服务器,本例为/home/admin目录 [Expert@SZ-OFFICE-SMT:0]# pwd/home/admin[Expert@SZ-OFFICE- ...

  7. UI自动化测试框架 ---TestCafe

    UI自动化测试框架 ---TestCafe 官网文档链接: https://devexpress.github.io/testcafe/ https://devexpress.github.io/te ...

  8. tag的使用

    tag = True while tag: print("level") choice = input("level>>>").strip() ...

  9. 如何设置Linux时间

    \(\color{Black}{文/魂皓轩}\) linux系统时钟有两个,一个是硬件时钟,即BIOS时间,就是我们进行CMOS设置时看到的时间,另一个是系统时钟,是linux系统Kernel时间.当 ...

  10. Zeus,一个可以快速使用微服务组件

    去年(上周)一直准备着做一个分布式微服务的组件,可以让使用者用最简单的方式引入,只需要使用简单的注解就能够使用. 用一点一点的空闲时间终于堆出来一个暂时可用的zeus-1.0版本. Zeus,意为宙斯 ...