最近幾個月的工作任務都是通過使用RF工具來搭建服務器端接口的自動化測試,使用python作為2次開發的語言,也是第一次去做這種項目,經驗善淺,還是很有可能會走很多的彎路,為此,我希望自己能把每個階段的進展還有點滴的收獲,在此記錄,然后能有個總結。
在15年的時候,我做過java web的接口自動化測試的開發工作,使用的技術比較簡單:webService的XFIRE框架+testNG+Dom+POI,屬於純java代碼構成,結合ant可以單獨部署使用,是基於soap協議的(基於http協議),只需要組織好輸入的參數,然后將參數傳遞給本地的接口,本地接口再調用遠程服務的接口,就能得到實際返回值,實現比較簡單。而這次主要工作如下:組裝成一定格式的xml,然后發送給服務器端,然后從reciv_buf內提取需要進行check的字段的數據(實際結果),再將實際測試結果和預期測試結果進行比較。
由於RF是基於關鍵字進行組織測試用例的,所以在做最初級的demo時,只做了簡單的處理,自定義一個lib,提供createSendBuf這個關鍵字(輸入參數:報文id),能返回符合發送給服務器端格式的報文。然后lib內能調用dll文件,與服務器取得聯系后,直接把報文發送給服務器,並取得返回結果(dll由開發提供,只需要在py腳本內對dll的導出函數進行調用即可封裝成想要的關鍵字),然后再提供關鍵字paraseRecivBuf(輸入參數:報文內的字段),這個關鍵字,可以從RecivBuf中拿到特定字段的取值,最后把這個值跟預期的進行對比即可。
第一次做出來的demo,可以用簡單粗暴形容。xml數據組裝如下:用一個list保存tag的name,然后用一個dict來保存tag的name(key)和tag對應var屬性的值(value)。然后組裝成xml格式的內容。部分代碼如下:
#創建文檔對象,文檔對象用於創建各種節點。 dom1=xml.dom.getDOMImplementation() doc=dom1.createDocument(None,"cmd",None) # 得到根節點 root = doc.documentElement root.setAttribute('id',iid) elements={'ClientType':'1','TerminalType':'1','UserType':'1','AppType':'20','UserLoginType':'1','UserName':'tes','ProductName':'FMS101','UserPassword':'000000','LoginServerAddr':'192.168.5.195:1089'} key=['ClientType','TerminalType','UserType','AppType','UserLoginType','UserName','ProductName','UserPassword','LoginServerAddr'] for i in range(len(key)): #elementNode=create_element(doc,element,'var',elements[element]) elementNode=doc.createElement(key[i]) elementNode.setAttribute('val',elements[key[i]]) root.appendChild(elementNode) return root.toxml()
后面返回的xml格式如下:
{send_buf}=<cmd id="30000"><UserName var="loleina"/><UserType var="1"/><UserLoginType var="1"/><AppType var="11"/><ClientType var="1"/><LoginServerAddr var="www.fsmeeting.com:1089"/><UserPassword var="000000"/><TerminalType var="1"/><ProductName var=" FMS101"/></cmd>
就把{send_buf}給底層py發送給服務器就完成了,在rf內的測試用例如下:
簡單粗暴的demo就這樣完成了,跟領導演示了下,就大致敲定了使用這個框架來完成服務器接口測試了,接下來我就可以展開更細致的工作了。后面問題就來了:
1. 步驟這么多,難道每寫一個腳本都要重復一次么?
2. 每個接口的sendbuf的xml的格式是不一樣的,id不一樣,里面的tag的nodename也是不一樣的,這要怎么辦?難道每個接口都給寫一個createSendBuf么,肯定不是這樣的,那要怎樣去做?
其實還有很多的問題,比如連接數據庫的考慮,執行前連接服務器,數據與測試用例分離考慮,底層py調用導出函數的封裝,接口之間的邏輯關系處理等等一系列問題,但是現在急需解決的問題是上面的2個問題,腳本怎么簡化,每個接口xml該怎么組織起來(服務器知道xml格式,能將用戶輸入的參數放到xml里去)。然后看了下網上的各種教程,接下來確定需要做的就是對RF框架的熟悉和python語言本身的學習。