引言:
Robot Framework的四層結(jié)構(gòu)已經(jīng)極大的提高了它的擴(kuò)展性跑芳。我們可以使用它豐富的擴(kuò)展庫(kù)來(lái)完成大部分測(cè)試工作〉0埽可是碰到下面兩種情況贯要,僅靠四層結(jié)構(gòu)就不好使了:
1.有些復(fù)雜的測(cè)試可能跨越多個(gè)物理機(jī)器,且有的測(cè)試庫(kù)也必須部署在被測(cè)系統(tǒng)上冬念。
2.一個(gè)測(cè)試要使用多個(gè)庫(kù)趁窃,但是有的只能用jybot運(yùn)行,有的只能用pybot運(yùn)行(這種情況很常見(jiàn))急前。
遠(yuǎn)程庫(kù)接口的原理:
為了解決上述兩個(gè)難題醒陆,Robot Framework提供了遠(yuǎn)程庫(kù)接口技術(shù)(remote library interface)。
什么是遠(yuǎn)程庫(kù)接口技術(shù)呢裆针?其實(shí)很簡(jiǎn)單刨摩,遠(yuǎn)程庫(kù)接口就是把原來(lái)的測(cè)試庫(kù)變成了三部分
一部分我們可以叫他遠(yuǎn)程庫(kù)(Remote Library),第二部分叫做遠(yuǎn)程服務(wù)器(Remote Server)据块,第三部分是真正的測(cè)試庫(kù)(Test Library)码邻。 測(cè)試庫(kù)提供真正的測(cè)試功能,它被遠(yuǎn)程服務(wù)器包裹起來(lái)另假,通過(guò)XML-RPC協(xié)議被遠(yuǎn)程庫(kù)訪(fǎng)問(wèn)(見(jiàn)下圖)像屋。它的實(shí)現(xiàn)思路說(shuō)白了就是設(shè)計(jì)模式中的Proxy模式。
這樣做的好處顯而易見(jiàn)边篮。遠(yuǎn)程庫(kù)只要遵守XML-RPC協(xié)議就可以訪(fǎng)問(wèn)遠(yuǎn)程服務(wù)器己莺,遠(yuǎn)程服務(wù)器的實(shí)現(xiàn)方式是什么就無(wú)關(guān)緊要了奏甫,這就意味著我們可以使用任何支持XML-RPC的高級(jí)語(yǔ)言為RF寫(xiě)擴(kuò)展庫(kù)了,查了查資料凌受,幾乎所有的高級(jí)語(yǔ)言都支持這個(gè)古老的簡(jiǎn)單協(xié)議阵子。
使用遠(yuǎn)程接口庫(kù):
如上文所說(shuō),RF把原來(lái)的測(cè)試庫(kù)分成了遠(yuǎn)程庫(kù)胜蛉、遠(yuǎn)程服務(wù)器挠进、測(cè)試庫(kù)三部分。那么怎樣才能把原有的測(cè)試庫(kù)進(jìn)行改造呢誊册?我們首先得有個(gè)Server领突。目前RF 提供了Python,Ruby案怯,.Net君旦,Java,Perl和Clojure的Server嘲碱。在這個(gè)鏈接可以下載它們:
http://code.google.com/p/robotframework/wiki/RemoteLibrary
下載到遠(yuǎn)程服務(wù)器后進(jìn)行包裹工作金砍,然后在RF調(diào)用遠(yuǎn)程庫(kù)。
下面我使用Python例子來(lái)詳細(xì)說(shuō)明如何使用遠(yuǎn)程庫(kù)麦锯。
?? 下載Server
Python的server實(shí)現(xiàn)的非常簡(jiǎn)單恕稠,只有一個(gè)文件,幾kb大小离咐。
我們可以在這個(gè)網(wǎng)址下載它:
http://robotframework.googlecode.com/hg/tools/remoteserver/robotremoteserver.py
?? 改造測(cè)試庫(kù)
有人會(huì)問(wèn)谱俭,不是用proxy模式么?為什么要改造測(cè)試庫(kù)宵蛀?不是應(yīng)該改造做proxy的server么?
其實(shí)改造誰(shuí)都行县貌。但是python有一個(gè)非常好的特性就是能夠根據(jù)是直接被調(diào)用或者間接被調(diào)用動(dòng)態(tài)決定行為术陶。我們利用這一點(diǎn),就能改造已有的測(cè)試庫(kù)煤痕,使它同時(shí)能夠當(dāng)做本地庫(kù)梧宫,也能被遠(yuǎn)程調(diào)用。
拿Robotframework的內(nèi)建String庫(kù)為例:
首先我們將robotremoteserver.py拷貝到String.py同一目錄下摆碉,然后打開(kāi)String庫(kù)的源代碼并在最后加入下面代碼:
if __name__ == '__main__':
import sys
from robotremoteserver import RobotRemoteServer
RobotRemoteServer(String(), *sys.argv[1:])
保存塘匣。然后一個(gè)遠(yuǎn)程服務(wù)器包裹的String庫(kù)就好了。
分析一下代碼巷帝,我們只是實(shí)例化了一個(gè)遠(yuǎn)程服務(wù)器忌卤,并且將String類(lèi)作為參數(shù)傳了進(jìn)去。
其實(shí)我們?cè)谶@里還能設(shè)置遠(yuǎn)程服務(wù)器IP和端口號(hào)楞泼。
if __name__ == '__main__':
import sys
from robotremoteserver import RobotRemoteServer
RobotRemoteServer(String(),’172.22.xx.xx’,’8081’ *sys.argv[1:])
如果不設(shè)置驰徊,也可以在運(yùn)行這個(gè)Server的時(shí)候設(shè)置笤闯。
?? 運(yùn)行遠(yuǎn)程庫(kù)
在命令行模式進(jìn)入String.py所在的目錄,執(zhí)行
String.py? 172.22.22.42? 8081
這時(shí)候RF就會(huì)告訴你一個(gè)包裹著測(cè)試庫(kù)的遠(yuǎn)程服務(wù)器已經(jīng)被啟動(dòng)了棍厂。
?? 在RF中調(diào)用遠(yuǎn)程庫(kù)
首先我們要引用Remote Library颗味,引用后就能直接使用了,跟使用本地庫(kù)沒(méi)有任何區(qū)別牺弹。
下面是測(cè)試遠(yuǎn)程String庫(kù)的腳本浦马。
*** Settings ***
Library?????????? Remote??? 172.22.22.42:8081??? WITH NAME??? RString
*** Test Cases ***
TestFetch
${str}??? Fetchfromleft??? I love test??? 5
腳本中引用了剛才我們建立的遠(yuǎn)程庫(kù),所有遠(yuǎn)程庫(kù)的名稱(chēng)都叫做Remote张漂,不同的只是后面的ip地址和端口號(hào)晶默,我們也可用WITH NAME 關(guān)鍵字給它起一個(gè)別名,這是為了解決多個(gè)遠(yuǎn)程庫(kù)里有相同關(guān)鍵字的問(wèn)題(可以使用關(guān)鍵字前加命名空間的方式加以區(qū)分)
下面鏈接是其它高級(jí)語(yǔ)言實(shí)現(xiàn)的遠(yuǎn)程庫(kù)接口的說(shuō)明鹃锈,由于原理相似荤胁,就不再一一說(shuō)明了。
JAVA:http://code.google.com/p/jrobotremoteserver/
Perl:http://code.google.com/p/plrobotremoteserver/
.NET:http://code.google.com/p/sharprobotremoteserver/
小結(jié):
利用遠(yuǎn)程庫(kù)接口技術(shù)屎债,我們幾乎可以把所有提供接口的測(cè)試工具都粘合起來(lái)仅政,外邊報(bào)個(gè)皮就行了。我們也可以用各種高級(jí)語(yǔ)言寫(xiě)測(cè)試庫(kù)了盆驹。不過(guò)值得說(shuō)明的是圆丹,有些 server還不完善,比如Java遠(yuǎn)程庫(kù)接口就不能正確的傳遞Exception躯喇,猜測(cè)是一些復(fù)雜對(duì)象不好通過(guò)XML-RPC協(xié)議進(jìn)行序列化辫封,感覺(jué)這個(gè) 可以再包一層皮:)