前言
httprunner 參數化數據源指定支持三種方式:
- 在 YAML/JSON/py 中直接指定參數列表:該種方式最為簡單易用,適合參數列表比較小的情況
- 通過內置的 parameterize(可簡寫為P)函數引用 CSV 文件:該種方式需要准備 CSV 數據文件,適合數據量比較大的情況
- 調用 debugtalk.py 中自定義的函數生成參數列表:該種方式最為靈活,可通過自定義 Python 函數實現任意場景的數據驅動機制,當需要動態生成參數列表時也需要選擇該種方式
本篇講解調用 debugtalk.py 中自定義的函數生成參數列表,生成的參數列表必須為 list of dict 的數據結構。
單個參數
需對 user_id 進行參數化數據驅動,參數取值范圍為 1001~1004,那么就可以在 debugtalk.py 中定義一個函數,返回參數列表。
def get_user_id():
return [
{"user_id": 1001},
{"user_id": 1002},
{"user_id": 1003},
{"user_id": 1004}
]
然后,在 YAML/JSON 的 parameters 中就可以通過調用自定義函數的形式來指定數據源。
config:
name: "demo"
base_url: ${ENV(base_url)}
parameters:
user_id: ${get_user_id()}
另外,通過函數的傳參機制,還可以實現更靈活的參數生成功能,在調用函數時指定需要生成的參數個數。
引用自定義函數
對於具有關聯性的多個參數,實現方式也類似。
例如,在 debugtalk.py
中定義函數 get_account
,生成指定數量的賬號密碼參數列表。
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/
def get_account(num):
accounts = []
for index in range(1, num+1):
accounts.append(
{"user": "test%s" % index, "password": "123456"},
)
return accounts
那么在 YAML/JSON 的 parameters 中就可以調用自定義函數生成指定數量的參數列表。
config:
name: "demo"
parameters:
username-password: ${get_account(4)}
testcases:
-
name: login-參數化
使用案例
在 debugtalk.py
中定義 get_user_password
函數,返回 4 個用戶名和密碼數據。
# debugtalk.py
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/
def get_account(num):
accounts = []
for index in range(1, num+1):
accounts.append(
{"user": "test%s" % index, "password": "123456"},
)
return accounts
if __name__ == '__main__':
print(get_account(4))
生成 list of dict
數據格式
[
{'user': 'test1', 'password': '123456'},
{'user': 'test2', 'password': '123456'},
{'user': 'test3', 'password': '123456'},
{'user': 'test4', 'password': '123456'}
]
testcases/params_func.yml
文件內容
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/
config:
name: login case
base_url: ${ENV(base_url)}
parameters:
user-password: ${get_account(4)}
teststeps:
-
name: step login
request:
url: /api/v1/login
method: POST
json:
username: $user
password: $password
validate:
- eq: [status_code, 200]
- eq: [content.code, 0]
- eq: [content.msg, login success!]
- len_eq: [content.token, 40]
pytest 腳本
# NOTE: Generated By HttpRunner v3.1.4
# FROM: testcases\params_func.yml
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/
import pytest
from httprunner import Parameters
from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase
class TestCaseParamsFunc(HttpRunner):
@pytest.mark.parametrize(
"param", Parameters({"user-password": "${get_account(4)}"})
)
def test_start(self, param):
super().test_start(param)
config = Config("login case").base_url("${ENV(base_url)}")
teststeps = [
Step(
RunRequest("step login")
.post("/api/v1/login")
.with_json({"username": "$user", "password": "$password"})
.validate()
.assert_equal("status_code", 200)
.assert_equal("body.code", 0)
.assert_equal("body.msg", "login success!")
.assert_length_equal("body.token", 40)
),
]
if __name__ == "__main__":
TestCaseParamsFunc().test_start()