httprunner 4.x 实现参数化使用parameters 关键字,数据源有三种方式
对于已有参数列表,并且数据量比较大的情况,比较适合的方式是将参数列表值存储在 CSV 数据文件中。 对于 CSV 数据文件,需要遵循如下几项约定的规则:
例如,user 的参数取值范围为 test1,test2,test3, test4,那么我们就可以创建 user.csv,放到项目根目录下的data目录下,并且在文件中按照如下形式进行描述。 data/ user.csv
user
test1
test2
test3
test4
然后在 YAML/JSON 测试用例文件中,就可以通过内置的 parameterize(可简写为 P)函数引用 CSV 文件。 test_csv.yml
config:
name: login case
parameters:
user: ${P(data/user.csv)}
teststeps:
-
name: post
request:
method: GET
url: http://www.example.com/
params:
username: ${user}
password: "12345"
validate:
- eq: [status_code, 200]
即 P 函数的参数(CSV 文件路径)是相对于项目根目录的相对路径。 当然,这里也可以使用 CSV 文件在系统中的绝对路径,不过这样的话在项目路径变动时就会出现问题,因此推荐使用相对路径的形式。
使用命令行执行
hrp run test_csv.yml --gen-html-report
会自动生成4个测试用例
data/user_password.csv 文件测试数据
# 作者-上海悠悠 wx:283340479
# blog地址 https://www.cnblogs.com/yoyoketang/
config:
name: login case
parameters:
user-password: ${P(data/user_password.csv)}
teststeps:
-
name: post
request:
method: GET
url: http://www.example.com/
params:
username: ${user}
password: ${password}
validate:
- eq: [status_code, 200]
用 debugtalk.py 中自定义的函数生成参数列表,生成的参数列表必须为 list of dict 的数据结构。
需对 user_id 进行参数化数据驱动,参数取值范围为 1001~1004,那么就可以在 debugtalk.py 中定义一个函数,返回参数列表。 debugtalk.py
# 作者-上海悠悠 wx:283340479
# blog地址 https://www.cnblogs.com/yoyoketang/
def get_user_id():
return [
{"user_id": 1001},
{"user_id": 1002},
{"user_id": 1003},
{"user_id": 1004}
]
然后,在 YAML/JSON 的 parameters 中就可以通过调用自定义函数的形式来指定数据源。
config:
name: "demo"
parameters:
user_id: ${get_user_id()}
另外,通过函数的传参机制,还可以实现更灵活的参数生成功能,在调用函数时指定需要生成的参数个数。
对于具有关联性的多个参数,实现方式也类似。
例如,在 debugtalk.py 中定义函数 get_account,生成指定数量的账号密码参数列表。
# 作者-上海悠悠 wx:283340479
# 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)}
在 debugtalk.py 中定义 get_user_password 函数,返回 4 个用户名和密码数据。
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'}
]
params_func.yml 文件内容
# 作者-上海悠悠 wx:283340479
# blog地址 https://www.cnblogs.com/yoyoketang/
config:
name: login case
parameters:
user-password: ${get_account(4)}
teststeps:
-
name: post
request:
method: GET
url: http://www.example.com/
params:
username: ${user}
password: ${password}
validate:
- eq: [status_code, 200]