Python的ATDD框架-robotframework

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

同樣為自動化測試框架,和Robot Framework齊名的是另一款框架Cucumber,兩者的對比如下:

1.png

由于現(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請求)

3.png

上圖是運行成功后的結果。
被測試的系統(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的插件)

Test suite.png
keywords.png
*** 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的情況下,直接編寫測試用例也是很方便的。

4.png

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

3.png
5.png

同時,可以看到已經(jīng)有3個文件,log.html,output.xml和report.html,從report.html可以很好的看到這次的運行結果。

robotframework是一款很好很強大的自動化測試框架,對于ATDD的這種方式來說,它的支持已經(jīng)很方便的了,很多公司也在使用這個框架,有興趣的朋友可以多看看咯。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容