Robot Framework是一款python編寫的功能自動化測試框架。具備良好的可擴展性,支持關鍵字驅動,可以同時測試多種類型的客戶端或者接口,可以進行分布式測試執(zhí)行。主要用于輪次很多的驗收測試和驗收測試驅動開發(fā)(ATDD)。
同樣為自動化測試框架,和Robot Framework齊名的是另一款框架Cucumber,兩者的對比如下:

由于現(xiàn)在Python3里面對RIDE和Selenium2Library的支持還不好(應該說就是不支持。。。浪費了我一下午的時間查如何能裝上Selenium2Library,暈啊),所以在Python3的環(huán)境下雖然有對應的RobotFramework3.x,使用上還是有些不方便,不過基于 「契可尼效應」(也就是輕微強迫癥啦),我還是嘗試了在Python3下面小玩了一下RF。
安裝環(huán)境
Python 3.5.2
robotframework-3.0(安裝命令:pip install robotframework)
robotframework_requests-0.4.7(安裝命令:pip install robotframework-requests)
PyCharm Community Edition 2016.3.2
測試需求:(這次我們先實現(xiàn)一個接口測試的小目標,也就是模擬一下Get和Post請求)

上圖是運行成功后的結果。
被測試的系統(tǒng):Django搭建的一個Web系統(tǒng),其中有兩個接口為: http://127.0.0.1:8000/api/get_event_list (GET請求來獲取會議列表)
http://127.0.0.1:8000/api/add_event(POST請求來新增一個會議)
1 Pycharm上新建一個項目rf_test,然后右鍵新建一個robot的文件,可以新建Test Suites的,也可以新建Keywords的,前提是你的pycharm里面需要加上robotframework的插件)


*** Settings ***
Library RequestsLibrary
Library Collections
*** Test Cases ***
testget
${payload}= Create Dictionary eid=1
Create Session event http://127.0.0.1:8000/api
${r}= Get Request event /get_event_list/ params=${payload}
Should Be Equal As Strings ${r.status_code} 200
log ${r.json()}
${dict} Set variable ${r.json()}
#斷言結果
${msg} Get From Dictionary ${dict} message
Should Be Equal ${msg} success
${sta} Get From Dictionary ${dict} status
${status} Evaluate int(200)
Should Be Equal ${sta} ${status}
testpost
Create Session event http://127.0.0.1:8000/api
&{headers} Create Dictionary Content-Type=application/x-www-form-urlencoded
&{payload}= Create Dictionary eid=1
${r}= Post Request event /add_event/ data=${payload} headers=${headers}
Should Be Equal As Strings ${r.status_code} 200
log ${r.json()}
${dict} Set variable ${r.json()}
#斷言結果
${msg} Get From Dictionary ${dict} message
Should Be Equal ${msg} parameter error
${sta} Get From Dictionary ${dict} status
${status} Evaluate int(10021)
Should Be Equal ${sta} ${status}
在Pycharm中裝robotframework插件最簡單的方式是把上述的代碼用Pycharm打開,則Pycharm會智能的檢測到你需要安裝robotframework的插件。
2 從新建的模板上我們可以看到第一個段落是 Settings(設置)
Settings包含的內(nèi)容是需要引用的標準庫或者自己寫的庫文件。
比如 如下的寫法表示需要引用RequestsLibrary 和Collections庫(前提就是需要裝robotframework和robotframework-requests的第三方包,Collections庫是用于操作字典,在這個場景中,接口的返回數(shù)據(jù)格式為Json,需要轉化以后才能進行斷言)
*** Settings ***
Library RequestsLibrary
Library Collections
還可以在Settings里面寫的是關于這個文件的描述(Documentation)和引用自己寫的庫(Resource),比如:
*** Settings ***
Documentation A test suite with a single test for valid login.
...
... This test has a workflow that is created using keywords in
... the imported resource file.
Resource resource.robot
*** 3 Test Cases里面寫和測試用例相關的內(nèi)容***
*** Test Cases ***
testget
${payload}= Create Dictionary eid=1
Create Session event http://127.0.0.1:8000/api
${r}= Get Request event /get_event_list/ params=${payload}
Should Be Equal As Strings ${r.status_code} 200
log ${r.json()}
${dict} Set variable ${r.json()}
#斷言結果
${msg} Get From Dictionary ${dict} message
Should Be Equal ${msg} success
${sta} Get From Dictionary ${dict} status
${status} Evaluate int(200)
Should Be Equal ${sta} ${status}
testget 表示這個測試用例的名稱為testget,當然你也可以取一個另外的名字來標示。
測試用例的代碼解讀:
第一行:通過“Create Dictionary”關鍵字定義字典變量${payload},字典有一個鍵值 eid=1。該字典將會作為接口的參數(shù)。
第二行:“Create Session”關鍵字用來創(chuàng)建一個 HTTP 會話服務器。event 為該會話的別名,http://127.0.0.1:8000/api為該會話的基本 url.
第三行:“Get Requests”關鍵字用來發(fā)起一個 GET 請求,接口 URL 為 event + /get_event_list/,接口參數(shù)為${payload}。最后將接口返回信息賦值給變量${r}
第四行:通過${r.status_code}可以得到請求的 HTTP 狀態(tài)碼,通過“Should Be Equal As Strings”關鍵字判斷其是否為 200(200表示Http請求返回是正常的狀態(tài)碼)。
第五行:通過${r.json()}可得將 json 格式的返回值轉化為字典,并通過 log 關鍵字打印。
第六行:對返回字典的驗證。將${r.json()}通過定義變量關鍵字“Set Variable”賦值給變量
${dict}。
第七行:同樣的可以用 # 來進行注釋
第八行:“Get From Dictionary”關鍵字由前面的引入的 Collections 庫提供,可以取到字典中 key 對應 value。這里獲取 key 為“message”對應的 value 賦值給變量${msg}。
第九行:“Should Be Equal”關鍵字用于比較${msg}是否等于“success”。
第十行:取到字典 key 為“status”對應的 value??墒堑玫降?value 200 是整數(shù)類型。然而,在 Robot Framework 中直接編寫的內(nèi)容為字符串。
第十一行:借助強大的 Evaluate,它可以直接調(diào)用 Python所提供的方法。例如,這里調(diào)用 Python 的 int()方法把 200 轉整數(shù)類型,并與字典中的取出來的整數(shù) 200 進行比較。
第十二行:比較status和sta的值來做斷言。
POST 接口用例基本與前面介紹的 GET 接口用例相似,但略有不同。
${header} Create Dictionary Content-Type=application/json
${payload}= Create Dictionary eid=1
Create Session event http://127.0.0.1:8000/api ${header}
${r}= Post Request event /add_event/ data=${payload}
在POST 請求需要創(chuàng)建 header 報頭,用來指定請求信息的內(nèi)容類型。在創(chuàng)建 HTTP 會話服務器時指定。另外,POST 請求所用到的關鍵字為“Post Request”。
從上面的例子中我們可以看出來,RobotFramework比較難一點的地方其實就在于你要熟悉其提供的關鍵字。
關于 RequestsLibrary 中所提供的關鍵字,可以在下面的文檔中查看。
http://bulkan.github.io/robotframework-requests/
如果是用的Python2.7,可以使用RIDE的情況下,直接編寫測試用例也是很方便的。

當然在熟悉以后,直接使用代碼方式編寫,也是一樣一樣。
寫完測試用例后在當前的目錄直接運行命令: pybot 測試用例文件名
可看到如下的運行結果:


同時,可以看到已經(jīng)有3個文件,log.html,output.xml和report.html,從report.html可以很好的看到這次的運行結果。
robotframework是一款很好很強大的自動化測試框架,對于ATDD的這種方式來說,它的支持已經(jīng)很方便的了,很多公司也在使用這個框架,有興趣的朋友可以多看看咯。