httprunner 3.x学习12 - 参数化(parameters)引用 debugtalk 函数
前言
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()
网易云课程地址