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"

testcases:
-
name: login-参数化
testcase: /path/to/testcase1
parameters:
username-password: ${get_account(4)}

使用案例

在  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()

2021年第八期《python接口web自动化+测试开发》7.17号开学(课程全面升级!) 加量不加价(新增postman, 赠送selenium和python基础2个课)

本期上课时间:7月17号-10月16号,每周六、周日晚上20:30-22:30

(0)

相关推荐