http://chuansong.me/n/1858477
1、RF框架
1.1 RF框架介紹
Robot Framework 框架是一個通用的測試框架,一直是由諾西網絡(Nokia Siemens Networks Oyj)的人員在維護的。后來諾基亞賣掉了手機業務后,現在更名成諾基亞解決方案網絡(Nokia Solutions and Networks)了。現在還是那幫子老外們在維護,已經到 2.9 了,不過 2.9 碰到很多問題,暫時還是用 2.8.7 比較好。
下面介紹一下 RF 的特性:
易於使用,采用表格式語法,統一測試用例格式;
可以使用關鍵字驅動(keyword-driven)、數據驅動(data-driven)和行為驅動開發 (BDD) 完成;
重用性好,可以利用現有關鍵字來組合新關鍵字;
結果報告和日志采用 HTML 格式,易於閱讀;
平台和應用無關聯性;
模塊結構支持使用不同的接口來測試你的應用;
易於擴展,提供了簡單 API,用戶可以自定義的基於 Python 或者 Java 的測試庫;
易於集成,提供了命令行接口和基於 XML 的輸出文件;
功能全面,支持WEB測試(Selenium)、Java GUI 測試,啟動線程、Telnet、SSH 等;
RemoteLibrary 接口可以支持分布測試和使用其他編程語言實現測試庫;
提供tag標簽來分類和選擇你的案例執行;
內置支持變量variables,支持不同的環境進行測試;
根據我的理解,整理了一個比較形象的Robotframework框架圖,如圖:
Robotframework作為框架平台,上面可以加載各種Library,通過測試套件、資源文件集成起來,然后可以針對被測系統進行不同角度的測試,圖中只列了三種Library,實際上還有很多種不同方向的Library,這里只是方便大家理解。
1.2 安裝Robotframework
接下來我們說說怎么安裝相關軟件來用Robotframework
a. 首先要安裝Python,如果是Mac電腦已經自帶了Python了,如果是其他平台需要下載2.7.x系列的。目前RF整體還不支持Python3。windows平台在安裝完Python后記得要把Python的兩個路徑加到環境變量Path里,一個是Python安裝目錄,一個是Python安裝目錄下的Scripts目錄,然后重新打開命令行進行后面的安裝操作。
b. 接着安裝兩個工具,setuptools和pip,打開瀏覽器訪問pypi.python.org官方下載地址,搜索setuptools和pip找到最新的tar.gz文件下載,安裝方法:先解壓縮,然后在命令行窗口進入setup.py文件所在目錄,輸入python setup.py install進行安裝。
c. 安裝Robotframework框架。從這里開始包括后續的測試庫安裝一般有兩種方式,一個是手工安裝,前面安裝setuptools和pip就是手工方式,另一種是pip安裝。對於測試庫安裝來說,我推薦pip安裝方式,不需要本地提前下載安裝包,pip會自動從pypi.python.org上搜索安裝包並下載安裝。
這里我們用命令pip install robotframework就可以了,如果不想安裝最新的版本,可以通過使用==, >=, <=, >, <來指定一個版本號。比如pip install ‘robotframework==2.8.7’來指定安裝2.8.7的版本。
d. 安裝wxPython。我基本上沒有試過用pip安裝這個,因為他自身有一個獨立的安裝包,版本目前只建議使用2.8.12.1。官網是http://sourceforge.net/projects/wxpython/files/wxPython/2.8.12.1/,要下載unicode版本的。
e. 安裝RIDE,可以用pip install robotframework-ride安裝。
Windows一般沒啥問題,Mac上通常第一次安裝后,在終端輸入ride.py回車,會提示Python要運行在32位模式下: ”python should be executedin 32-bit mode to support wxPython on mac. Check BUILD.rest for details”。
因為Mac默認是64位運行,所以Python也默認運行64位,此時需要調整一下默認Python為32位,具體方式有兩種:
(1).在終端里執行下面這句:
defaultswrite com.apple.versioner.python Prefer-32-Bit -bool yes
(2).或者在~/.bash_profile里增加下面這句:
exportVERSIONER_PYTHON_PREFER_32_BIT=yes
保存退出后運行source ~/.bash_profile后再輸入ride.py回車就可以正常打開RIDE了。
f.安裝測試庫,可以用pip install LibraryName 進行相應測試庫的在線安裝,前面已經有相應例子了。
完整的pip命令請在命令行輸入pip —help (注意是2個-)查看。
g. 本次接口測試要用到requests和robotframework-requests,前者是一個Python庫,一般直接寫Python腳本測試接口會importrequests來使用。后者是對requests做了一層封裝,使其更好的應用在robotframework框架上。請根據這兩個庫的名字自己進行pip安裝。
PS:如果熟悉pip安裝的同學其實只要一個安裝命令就可以了,因為后者依賴前者的存在才能安裝,所以只需要pip安裝后者,然后他會自動幫你把前者安裝好的。
2、創建測試案例
2.1 第一個案例
為了讓大家有個直觀的認識,這里直接介紹一下怎么創建一個測試案例,暫時先不進行細致的介紹,RIDE和Robotframework的基礎知識可以到http://blog.csdn.net/tulituqi看我的博客。
2.1.1打開RIDE
windows下直接雙擊界面的Robot機器人圖標即可,或者進入到Python目錄的scripts子目錄下雙擊ride.py文件,也可以在命令行輸入ride.py然后回車,就可以看到RIDE界面,如圖。
mac下直接在終端命令行輸入ride.py回車,就可以看到如圖的界面。
由於Mac上和Windows上基本一致,所以這里主要以Windows的截圖為主。這里因為大部分截圖是之前做的,所以都是windows的,實際上我目前使用Mac環境更多一些。
2.1.2創建工程和測試套
選擇File→New Project,如圖
在Name的文本框里輸入一個名字,例如testproject,右邊選擇Directory,如圖
然后點擊OK按鈕,如圖
右鍵點擊testproject,在彈出菜單里點擊“New Suite”,在Name的文本框里輸入一個名字,例如testsuite1,如圖
然后點擊OK按鈕,之后界面如圖
2.1.3創建案例
右鍵點擊testsuite1,在彈出菜單里點擊“New Test Case”,在Name的文本框里輸入一個名字,例如case1,如圖
然后點擊OK按鈕,界面如圖
2.1.4寫一行腳本
我們第一個腳本就用log命令吧,這個命令是用來打印日志的,對比C語言,你可以理解為printf,我們來打印一個“hello world”吧
腳本寫完如圖
2.1.5運行案例
點擊工具欄像播放按鈕的圖標 運行案例,運行結果如圖
2.1.6查看運行結果
點擊Report或Log圖標查看報告,report和log分別是兩種報告,展示的信息不一樣,Report報告如圖
Log報告如圖
Report報告主要是概括性的報告,總體案例執行情況。Log報告則是更為詳細的案例步驟的報告。
3、Requests接口自動化測試介紹
主要介紹幾種常見的接口如何進行自動化測試,重點是get request和post request。
這部分測試案例可以在這里找到:https://github.com/qitaos/rf-demos/tree/master/RequestsDemo
3.1 接口測試
接口測試通常是系統之間交互的接口,或者某個系統對外提供的一些接口服務,我之前接觸的大部分都是RESTful,還有一些webservice的接口。現在大家也越來越多的關注接口測試了,因為有時候可能界面上的功能還沒有實現,我們可以先一步對接口進行驗證,提早發現一些和預期不一致的錯誤。這方面的工具應該也有一些,基於RF的接口測試庫我們首推requests和requestsLibrary。
3.2requestsLibrary、requests安裝
前面介紹了pip安裝,如果pip不好用或者網絡不好的同學,可以本地安裝,到下面官網下載進行手動安裝。
requests的官方下載地址: https://pypi.python.org/pypi/requests
requestsLibrary的官方下載地址:
https://pypi.python.org/pypi/robotframework-requests/
如果是下載tar.gz包安裝,先要安裝requests,再安裝requestsLibrary
3.3 requestsLibrary關鍵字
requestsLibrary的關鍵字不多,我常用的就幾個。
Create Session: 創建一個session,連接某個服務器
Create Ntlm Session: 也是創建一個session,只不過加上了域、用戶名、密碼用於NTLM認證。
Get Request: 通過GET方式發起請求。
Post Request: 通過POST方式發起請求。
Head Request: 發送一個HEAD請求。
TO Json: 將文本轉換成json對象。
3.4 測試案例
這里的demo我們是用到了flask的網站,做了幾種例子,大家了解一下,如果需要更完整的了解,建議看一下RequestsLibrary在github上的測試案例。
3.4.0 使用demo前的准備
我用了flask來實現了一個demo網站,它可以快速建立起一個網站,只用一些簡單的語句。
如果使用pip安裝會比較方便,特別是在mac電腦上,為了保證例子能正常運行,大家需要安裝四個東東,flask、flask-httpauth、flask_restful、python-simplexml。
只需要運行如下命令:
mac
sudo pip install flask
sudo pip install flask-httpauth
sudo pip install flask_restful
sudo pip installpython-simplexml
windows
pip install flask
pip install flask-httpauth
pip install flask_restful
pip install python-simplexml
安裝完成之后就可以運行我們的demo-website了,我的書里全部的demo的地址是:
https://github.com/qitaos/rf-demos
具體說明可以看網站上的README,所有的demo都會放到這里,同時書籍出版后也會繼續更新,所以你看到github上rf-demos的內容可能會比書上的多。
demo-website的地址是:https://github.com/qitaos/rf-demos/tree/master/demo-website
下載整個工程之后,進入demo-website目錄,
運行命令
python flaskdemo.py
運行成功后會有提示信息
python flaskdemo.py
Running onhttp://127.0.0.1:8000/ (Press CTRL+C to quit)
Restarting with stat
這里提示我們服務器已經啟動,訪問http://127.0.0.1:8000/ 或者 http://localhost:8000/ 就可以打開頁面了。
如果有任何出錯信息,有可能是前面的測試庫沒有安裝完整。
1、get request json
訪問http://localhost:8000/users/1 的時候,它會返回一個json:
{“1”: “john”}
如果把1換成5,它會返回一個404的json:
{
“message”: “NotFound: http://localhost:8000/users/5“,
“status”: 404
}
所以這里第一個案例就是來測試這2個接口請求。
首先要先Create Session創建一個連接到服務器的host,然后通過Get Request發起請求,請求的返回是個Request對象${addr},所以在這里的變量是個對象,而對象的屬性值的有${addr.status_code}和${addr.content},使用了To Json后,就把返回的content格式化成Json串,然后就可以用Dictionary的方法獲取其中的值了。腳本見表格
2、getrequest xml
前面一個例子是接口返回json進行處理的,這個例子是接口返回xml格式內容。訪問http://localhost:8000/hello/qitao,會返回一個xml格式的內容:
qitao
案例比較長,分兩個部分說,第一個部分其實還是用json來處理,雖然返回的是xml,但是requestslibrary自動把它處理成json了。所以它的這部分處理其實和前面的案例一樣。腳本見表格
那么想要返回xml怎么處理呢?這里就要在Request的essay-header里加上一個accept=application/xml,此時返回的就是一個xml格式的內容qitao
所以這里用到了XML庫的關鍵字Get Element Text來獲取xml節點的文本,使用Get Element獲取到一個Element對象${hello},既然是對象,那么它也有屬性值${hello.text}。再后面的幾行就是用XML庫的關鍵字新增Element,然后取值,這也算是提前准備好來XML的demo了。
這里為什么要做xml的例子呢,其實是因為有一種接口測試就是測試Web Service的,通常Web Service都是返回一個xml格式的內容。這里demo網站沒有做Web Service的例子,所以就用這個xml的例子來代替Web Service了。腳本見表格
運行案例結果如圖:
3、增加登錄態
有些接口是需要用戶密碼登錄后才能訪問的,如果直接訪問http://localhost:8000/401
會提示要輸入用戶名密碼
輸入正確的用戶名密碼ok/python,會得到一個返回的信息
{
“pass”:”Authorized access”
}
但是我們做自動化腳本的時候不能去手動輸入的,所以我們可以在Create Session的時候加上用戶名密碼,就可以直接訪問了。
用戶名ok,密碼python,我們用${auth}創建個List存起來,然后在Create Session時加上${auth}參數,后面的過程就是前面一樣了,不需要自己再手動輸入用戶密碼了。腳本見表格
運行結果如圖
4、postrequest
前面幾個都是get方式的,這個例子是post方式的。
這里主要是在essay-header加了一項Content-Type=application/x-www-form-urlencoded,這是最常見的post提交數據的方式,另外還有幾種我不太常用的,大家可以根據自己的實際情況來使用。
然后我們向 http://localhost:8000/post, 發起請求,並將${data}作為post的data傳過去。demo網站對post請求做了個處理,將username的值獲取到然后以json格式返回。腳本見表格
3.5 小結
接口測試其實比我們前面的UI自動化測試要有價值的多,而且投入也不是很高,維護成本也低很多,一般來說接口上不會特別頻繁的變更。即使有變更,正好也可以用這些案例來回歸其他接口是否受到了影響。所以推薦大家將接口自動化測試優先做起來,一定要在上線前跑接口自動化回歸測試,某些時候能夠避免一些接口變更導致的問題。
順便打個小廣告:我的新書《Robotframework自動化測試修煉寶典》即將在10月底11月初面市,歡迎感興趣的朋友屆時到各大網上書店購買。
答疑環節
1. RF對Java 和c#是一樣適用嗎?
這里不確定你說的是底層還是說Java和C#開發的程序。如果是底層,RF是支持java的,如果程序,java應該有swing庫,C#貌似可以用autoitlibrary。
2.在Linux可以使用嗎?
可以的。
3.autoit library 可以在mac下使用么?
不可以。因為autoit是針對win32程序的,只有windows上才能用。如果要對mac的ui進行自動化測試,可以研究一下其他的工具,我記得mac自帶就有。
4.Linux 安裝robot framework 直接參照Mac的嗎?
我覺得參考mac的就可以,不過我確實沒有嘗試過。
5.基於RF的接口測試庫我們首推requests和requestsLibrary———請問這是為什么,HttpLibrary.HTTP不好用嗎,最近我們在兩者之間就選擇了后者?
這是我個人使用了requests后覺得比較方便。httplibrary的貌似也不錯,我沒有深入研究,抱歉。
6.可以用於雲測試嗎?若可如何使用?
具體要看你的應用場景。不過我對雲測試了解不多。如果是類似於分布式測試的話,以前我是通過Jenkins來實現的。RF也有remote庫可以把測試庫放在一個統一的服務器上,然后在不同機器上去使用。
7.接口測試可以支持哪些接口?
今天介紹了幾種接口,我理解大部分應該都可以支持了。
8.可不可支持APP或網站前端測試?
我們目前就是在自己的APP項目上用了這個接口測試,因為我們的接口是比較簡單的RESTful接口,json串返回,我們解析json然后驗證。
9.測試代碼是否要求自己寫?若要用啥語言?
測試案例是要自己寫,不需要寫太多代碼,底層代碼是Python的,如果你要寫測試庫可以寫Python來實現。實際上寫測試案例是直接使用各個測試庫提供的關鍵字就可以了。
10.這是個什么接口,沒看懂?404那個。
我這里演示的接口都是比較簡單的請求返回的,自己做的demo的,就沒弄那么復雜的。
11.使用or占整體業務的比例有多少?
我個人認為,接口測試如果可以的話做到100%自動化是最好的。因為他不像UI經常變化,接口大多都比較穩定的,自動化回歸測試是非常有必要的。
12.request.txt這個文件怎么用RF打不開呢?
用RIDE打開就可以了,我這邊演示的也是用RIDE打開的。
13.請問道長近期有沒有計划做性能和app端測試的課程?
性能我不太熟悉,這個monkey來吧。app測試我的新書里寫了使用Robotframework+appium的例子。以后有機會可以再進行相關介紹,不過我對appium還不太熟練,這方面monkey和恆溫是專家
14.比如接口測試登錄…要輸入驗證碼,怎么實現?接口測試,如果要求傳參要求加密怎么做?
驗證碼這個東西最好讓開發給你加萬能碼或者關掉驗證碼,如果自動化實現了錄入驗證碼,那就是bug,因為驗證碼沒起到他的作用。至於傳參要加密的,我們近期也碰到了,我們是用Python實現了加密方法,然后做成library使用。
15.post request之后 返回一個html頁面 要如何進一步獲取他的表單信息?用XML庫嗎?
XML應該可以處理。不過感覺比較麻煩。我做的貌似比較簡單,所以沒考慮到這個情況。我個人在想如果能結合Selenium2Library好像會比較方便,但是要嘗試是否可行。
16.請問道長之前有沒有出過書?書名是什么?
之前沒出過。剛寫了一本《Robotframework自動化測試修煉指南》,即將出版了。
17. 自定義庫怎么寫?
這里一兩句話很難說清楚,在我的github上有個qtlibrary,可以參考一下。我在新書里也用這個來介紹寫測試庫。
18提問,怎樣快速查找當前library里面的方法?rf我記得有些文字的顯示可以糾錯?這塊可不可以簡單說一下。
查看Library關鍵字請按F5,選擇測試庫后就可以看到了。糾錯的你說的是那個內容助手吧,Content Assistance,他在RIDE的tools菜單下,有自己的快捷鍵,比如ctrl+空格。但是很容易和輸入法的沖突,所以你要么選擇另一個快捷鍵,要么自己改一下快捷鍵
19.腳本中的第一個和倒數第二345都沒講過,是干什么用的呢?
這個是說最后一個案例吧?第一行是創建一個字典變量,然后保存了一個值,是post的essay-header里的,倒數那幾個都是用dictionary的方法來解析json,因為json基本上就是和dictionary一樣的。
20.用rf做接口測試,需要哪些編程基礎?沒有編程基礎的怎么學?有什么方法嗎?
對於使用rf做測試,其實只需要比較簡單的編程知識就夠了。如果沒有基礎的可以學習一下算法,比如譚浩強的C語言的算法之類。其實用RF做測試,你要了解你想要怎么測試,然后找到方法去做就好了
21.作為一個高校老師,應該如何給學生開展測試的課程呢?普通高校,測試的課程幾乎可以說沒有,雖然一直很關注測試,但是,坦白說,一直也沒有一個明晰的概念如何跟學生去進行這樣一個課程的教學。可否請老師給指點下迷津,畢竟高校也是未來開發主力軍的一個培養基地。
這個話題有點大。這方面應該請南京大學的陳振宇教授(俗稱陳龍蝦)來給講解。我個人的意見是先介紹基礎的測試知識,培養學生的測試思想和測試意識,測試工具可以晚一些再接觸。