測試用例另一個重要部分——teststeps
一、測試用例分層模型
一個testcase里(就是一個pytest格式的Python文件)可以有一個或者多個測試步驟,就是teststeps[]列表里的Step。
每一個Step可以類比成pytest框架下的def test_xxx()的用例函數,在Step里通常都會要請求API完成測試,也可以調用其他測試用例來完成更多的需求。
可以來看下官方的測試用例邏輯圖(2.x版本不同,3.x棄用了2.x的API概念):
testsuite包含了testcase,testcase1需要依賴testcase2才可以完成,那么就可以在teststep12對其進行引用;而testcase2又依賴於testcase3,那么也可以在teststep22進行引用。
但是在整個testsuite下,這3個testcase都是相互獨立的,可以獨自運行。如果需要相互調用,則是在testcase內部去完成處理。
可能看起來有點繞,其實官方想表達的就是測試用例分層的一個思想:
- 測試用例(testcase)應該是完整且獨立的,每條測試用例應該是都可以獨立運行的
- 測試用例是測試步驟(teststep)的有序集合
- 測試用例集(testsuite)是測試用例的無序集合,集合中的測試用例應該都是相互獨立,不存在先后依賴關系的;如果確實存在先后依賴關系,那就需要在測試用例中完成依賴的處理
其實這一點,在我們自己使用pytest框架編寫測試用例的時候同樣貫徹到了。為了自動化測試的穩定性和可維護性,每個測試用例之間相互獨立是非常有必要的。
二、teststeps-RunRequest
先上一段Step的代碼,結合下面的點對照着看:
teststeps = [
Step(
RunRequest("get with params") .with_variables( **{"foo1": "bar11", "foo2": "bar21", "sum_v": "${sum_two(1, 2)}"} ) .get("/get") .with_params(**{"foo1": "$foo1", "foo2": "$foo2", "sum_v": "$sum_v"}) .with_headers(**{"User-Agent": "HttpRunner/${get_httprunner_version()}"}) .extract() .with_jmespath("body.args.foo2", "foo3") .validate() .assert_equal("status_code", 200) .assert_equal("body.args.foo1", "bar11") .assert_equal("body.args.sum_v", "3") .assert_equal("body.args.foo2", "bar21") ),
從上面的代碼可以看出,RunRequest的作用就是在測試步驟中請求API,並且可以對於API的響應結果進行提取、斷言。
1.RunRequest(name)
RunRequest的參數名用於指定teststep名稱,它將顯示在執行日志和測試報告中。
2. .with_variables
用於存放變量,但是這里的是Step步驟里的變量,不同的Step的變量是相互獨立的。所以對於多個Step都要使用的變量,我們可以放到config的變量里去。
另外,如果config和Step里有重名的變量,那么當你引用這個變量的時候,Step變量會覆蓋config變量。
3. .method(url)
這里就是指定請求API的方法了,常用的get、post等等。如圖所示,就是用的get方法,括號里的url就是要請求的地址了。
這里要注意的是,如果在config里設置了基礎url,那么步驟里的url就只能設置相對路徑了。
4. .with_params
這個就簡單了,測接口不都得要傳參么,對於params類型的傳參,就放這就行了,key-value鍵值對的形式。對於body形式的傳參,看后面。
5. .with_headers
同樣,有header要帶上的就放這里。
6. .with_cookies
需要帶cookie的,可以用.with_cookies方法。
7. .with_data
對於body類型的傳參,可以用.with_data。
8. .with_json
如果是json類型的body請求體,可以用.with_json。
9. .extract
這里就是要做提取操作了,使用.with_jmespath(jmes_path: Text, var_name: Text)。
這里是采用了JMESPath語言,JMESPath是JSON的查詢語言,可以便捷的提取json中你需要的元素。
第一個參數是你的目標元素的jmespath表達式,第二個元素則是用來存放這個元素的變量,供有需要的引用。
這里不展開,后面單講。
10. .validate
斷言,我們測試最終就是要驗證接口返回是否符合預期。
那在httprunner框架中,可以使用assert_XXX(jmes_path: Text, expected_value: Any)來進行提取和驗證。
第一個參數還是jmespath表達式,第二個參數則是預期值。
assert_XXX這種方式相信用過自動化測試框架的都不會陌生,所以也非常容易上手。目前httprunner還是封裝了非常豐富的斷言方法的,相信可以滿足絕大多數的需求了。
例子:
到這里,一個接口的請求和驗證就完成了
來源:https://www.cnblogs.com/pingguo-softwaretesting/p/13214443.html