使用远程接口库进一步扩展Robot Framework的测试能力
使用远程接口库进一步扩展Robot Framework的测试能力
引言:
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协议进行序列化,感觉这个 可以再包一层皮:)
作者:叉叉敌
博客:https://chasays.github.io/
微信公众号:Chasays, 欢迎关注一起吹牛逼,也可以加个人微信号「xxd_0225」互吹。
本博客大多为学习笔记或读书笔记,本文如对您有帮助,还请多推荐下此文,如有错误欢迎指正,相互学习,共同进步。