HttpRunner 概念
HttpRunner 是一款面向 HTTP(S) 協議的通用測試框架,只需編寫維護一份 YAML/JSON 腳本,即可實現自動化測試、性能測試、線上監控、持續集成等多種測試需求。
相關操作
- 參數提取(extract)和參數引用($var)
# 第一個接口/api/get-token的響應結果為:
{"success": true, "token":"ZQkYhbaQ6q8UFFNE"}
# 提取 token,采用 content.token
'extract':[
{'token':'content.token'}
]
# token 作為提取后的參數名稱,可以在后續使用 $token 進行引用
'headers':{
'token':'$token',
"Content-Type": "application/json",
"device_sn": "FwgRiO7CNA50DSU",
}
- 公共配置全局化
{
"config": {
"name": "testcase description",
"variables": [],
"request": {
"base_url":"http://127.0.0.1:5000",
"headers": {
"User-Agent":"python-requests/2.18.4",
"device_sn": "FwgRiO7CNA50DSU",
"Content-Type":"application/json"
}
}
}
}
# 其中 name 為測試用例的名稱,在測試報告中將作為標題
- debugtalk.py 文件中定義相關變量和函數
import hashlib
import hmac
import random
import string
SECRET_KEY = "DebugTalk"
def gen_random_string(str_len):
random_char_list = []
for _ in range(str_len):
random_char = random.choice(string.ascii_letters + string.digits)
random_char_list.append(random_char)
random_string = ''.join(random_char_list)
return random_string
def get_sign(*args):
content = ''.join(args).encode('ascii')
sign_key = SECRET_KEY.encode('ascii')
sign = hmac.new(sign_key, content, hashlib.sha1).hexdigest()
return sign
- 變量的申明(variables)、引用($var)和調用函數(${func($var)})
# 申明變量:生成 15 位長度的隨機字符串並賦值給 device_sn 的代碼為:
"variables": [
{"device_sn": "${gen_random_string(15)}"}
]
# 引用變量:使用 $user_agent、$device_sn、$os_platform、$app_version 根據簽名算法生成 sign 值的代碼
"json": {
"sign": "${get_sign($user_agent, $device_sn, $os_platform, $app_version)}"
}
- 數據驅動
# 創建用戶的接口中對 user_id 進行參數化,參數化列表為 1001~1004,並且取值方式為順序取值
"config": {
"parameters": [
{"user_id": [1001, 1002, 1003, 1004]}
]
}
- 測試運行
# 運行單個測試用例( hrun 命令外加單個測試用例文件的路徑)
$ hrun filepath/testcase.yml
# 運行多個測試用例使用 (hrun 命令外加多個測試用例文件的路徑)
$ hrun filepath1/testcase1.yml filepath2/testcase2.yml
# 運行指定文件夾下所有的測試用例(使用 hrun 命令外加文件夾的路徑):
$ hrun testcases_folder_path
# 測試用例在運行過程中,遇到失敗時不再繼續運行后續用例
$ hrun filepath/testcase.yml --failfast
# 顯示指定日志級別以上的日志
$ hrun tests/data/demo_parameters.yml --log-level debug
- 測試報告生成
# 指定報告名稱
$ hrun docs/data/demo-quickstart-2.yml --html-report-name demo
- hook 機制,hook 函數定義在 debugtalk.py 里
- 用例層,config 新增關鍵字 setup_hooks 和 teardown_hooks,為全局的,setup_hooks 在所有測試前執行,teardown_hooks 所有用例執行后執行一次。
- config: name: basic test with httpbin request: base_url: http://127.0.0.1:3458/ setup_hooks: - ${hook_print(setup)} teardown_hooks: - ${hook_print(teardown)}- 測試步驟層,test 中新增關鍵字 setup_hooks 和 teardown_hooks,為局部變量,當前測試用例測試前后執行
"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)}"
}
},
"validate": [
{"eq": ["status_code", 200]}
],
"setup_hooks": [
"${setup_hook_prepare_kwargs($request)}",
"${setup_hook_httpntlmauth($request)}"
],
"teardown_hooks": [
"${teardown_hook_sleep_N_secs($response, 2)}"
]
}
# test 中 name 為測試步驟的名稱,在測試報告中將作為測試步驟的名稱
- 參數定義和數據源指定
- 參數名稱的定義分為兩種情況:
- 獨立參數單獨進行定義;
- 多個參數具有關聯性的參數需要將其定義在一起,采用短橫線(-)進行連接。
- 數據源指定支持三種方式:
- 在 YAML/JSON 中直接指定參數列表
- 通過內置的 parameterize(可簡寫為P)函數引用 CSV 文件
- 調用 debugtalk.py 中自定義的函數生成參數列表
- 參數名稱的定義分為兩種情況:
# user_id 通過引用 csv 文件
- config:
name: "demo"
parameters:
- user_agent: ["iOS/10.1", "iOS/10.2", "iOS/10.3"]
- user_id: ${P(user_id.csv)}
- username-password: ${get_account(10)}
# 關聯性的多個參數
- config:
parameters:
- username-password:
- ["user1", "111111"]
- ["user2", "222222"]
- ["user3", "333333"]
