httprunner學習9-完整的用例結構(yaml&json)
- 2019 年 10 月 8 日
- 筆記
前言
前面幾篇零散的學了一些httprunner的知識點,那麼一個完整的 YAML/JSON 用例文件包含哪些關鍵字呢?
測試用例結構
在 HttpRunner 中,測試用例組織主要基於三個概念:
- 測試用例集(testsuite): 對應一個文件夾,包含單個或多個測試用例(YAML/JSON)文件
- 測試用例(testcase): 對應一個 YAML/JSON 文件,包含單個或多個測試步驟
- 測試步驟(teststep): 對應 YAML/JSON 文件中的一個 test,描述單次介面測試的全部內容,包括發起介面請求、解析響應結果、校驗結果等
對於單個 YAML/JSON 文件來說,數據存儲結構為 list of dict 的形式,其中可能包含一個全局配置項(config)和若干個測試步驟(test)。
- config: 作為整個測試用例的全局配置項
- test: 對應單個測試步驟(teststep),測試用例存在順序關係,運行時將從前往後依次運行各個測試步驟
對應的 JSON 格式如下所示:
[ { "config": {...} }, { "test": {...} }, { "test": {...} } ]
對應的 YAML 格式如下所示
- config: name: xxx - test: name: login case1 request: url: http://127.0.0.1:8000/api/v1/login/ ... - test: name: login case2 request: url: http://127.0.0.1:8000/api/v1/login/ ...
變數空間(context)作用域
在測試用例內部,HttpRunner 劃分了兩層變數空間作用域(context)。
- config: 作為整個測試用例的全局配置項,作用域為整個測試用例;
- test: 測試步驟的變數空間(context)會繼承或覆蓋 config 中定義的內容;
- 若某變數在 config 中定義了,在某 test 中沒有定義,則該 test 會繼承該變數
- 若某變數在 config 和某 test 中都定義了,則該 test 中使用自己定義的變數值
- 各個測試步驟(test)的變數空間相互獨立,互不影響;
- 如需在多個測試步驟(test)中傳遞參數值,則需要使用 extract 關鍵字,並且只能從前往後傳遞
config配置
|
關鍵字 |
是否必須 |
格式類型 |
描述 |
|
|---|---|---|---|---|
|
name |
Yes |
string |
測試用例的名稱,在測試報告中將作為標題 |
|
|
variables |
No |
list of dict |
定義的全局變數,作用域為整個用例 |
|
|
parameters |
No |
list of dict |
全局參數,用於實現數據化驅動,作用域為整個用例 |
|
|
request |
No |
dict |
request 的公共參數,作用域為整個用例;常用參數包括 base_url 和 headers |
|
request相關參數
|
關鍵字 |
是否必須 |
格式類型 |
描述 |
|---|---|---|---|
|
base_url |
No |
string |
測試用例請求 URL 的公共 host,指定該參數後,test 中的 url 可以只描述 path 部分 |
|
headers |
No |
dict |
request 中 headers 的公共參數,作用域為整個用例 |
|
output |
No |
list |
整個用例輸出的參數列表,可輸出的參數包括公共的 variable 和 extract 的參數; 在 log-level 為 debug 模式下,會在 terminal 中列印出參數內容 |
config配置 JSON 格式示例
"config": { "name": "testcase description", "parameters": [ {"user_agent": ["iOS/10.1", "iOS/10.2", "iOS/10.3"]}, {"app_version": "${P(app_version.csv)}"}, {"os_platform": "${get_os_platform()}"} ], "variables": [ {"user_agent": "iOS/10.3"}, {"device_sn": "${gen_random_string(15)}"}, {"os_platform": "ios"} ], "request": { "base_url": "http://127.0.0.1:5000", "headers": { "Content-Type": "application/json", "device_sn": "$device_sn" } }, "output": [ "token" ] }
config配置 YAML 格式示例
- config: name: xxx parameters: - user_agent: ["iOS/10.1", "iOS/10.2", "iOS/10.3"] - app_version: ${P(app_version.csv)} - os_platform: ${get_os_platform()} variables: - user_agent: iOS/10.3 - device_sn: ${gen_random_string(15)} - os_platform: ios request: base_url: http://127.0.0.1:5000 headers: Content-Type: application/json device_sn: $device_sn output: - token
test相關參數
|
關鍵字 |
是否必須 |
格式類型 |
描述 |
|---|---|---|---|
|
namel |
Yes |
string |
測試步驟的名稱,在測試報告中將作為測試步驟的名稱 |
|
request |
Yes |
dict |
HTTP 請求的詳細內容;可用參數詳見 python-requests 官方文檔 |
|
variables |
No |
list of dict |
測試步驟中定義的變數,作用域為當前測試步驟 |
|
extract |
No |
list |
從當前 HTTP 請求的響應結果中提取參數,並保存到參數變數中(例如token),後續測試用例可通過$token的形式進行引用 |
|
validate |
No |
list |
測試用例中定義的結果校驗項,作用域為當前測試用例,用於實現對當前測試用例運行結果的校驗 |
|
setup_hooks |
No |
list |
在 HTTP 請求發送前執行 hook 函數,主要用於準備工作 |
|
teardown_hooks |
No |
list |
在 HTTP 請求發送後執行 hook 函數,主要用戶測試後的清理工作 |
test用例 JSON 格式示例
"test": { "name": "get token with $user_agent, $os_platform, $app_version", "request": { "url": "/api/get-token", "method": "POST", "headers": { "app_version": "$app_version", "os_platform": "$os_platform", "user_agent": "$user_agent" }, "json": { "sign": "${get_sign($user_agent, $device_sn, $os_platform, $app_version)}" }, "extract": [ {"token": "content.token"} ], "validate": [ {"eq": ["status_code", 200]}, {"eq": ["headers.Content-Type", "application/json"]}, {"eq": ["content.success", true]} ], "setup_hooks": [], "teardown_hooks": [] } }
test用例 YAML 格式示例
- test: name: get token with $user_agent, $os_platform, $app_version request: url: /api/get-token method: POST headers: app_version: $app_version os_platform: $os_platform user_agent: $user_agent json: sign: ${get_sign($user_agent, $device_sn, $os_platform, $app_version)} extract: - token: content.token validate: - eq: [status_code, 200] - eq: [headers.Content-Type, application/json] - eq: [content.success, true] setup_hooks: [] teardown_hooks: []
hooks
setup_hooks 函數放置於 debugtalk.py 中,並且必須包含三個參數:
- method: 請求方法,e.g. GET, POST, PUT
- url: 請求 URL
- kwargs: request 的參數字典
teardown_hooks 函數放置於 debugtalk.py 中,並且必須包含一個參數:
- resp_obj: requests.Response 實例
