引言:
Robot Framework的四層結構已經極大的提高了它的擴展性。我們可以使用它豐富的擴展庫來完成大部分測試工作??墒桥龅较旅鎯煞N情況,僅靠四層結構就不好使了:
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協議進行序列化,感覺這個可以再包一層皮:)
原文轉自:http://www.anti-gravitydesign.com