文章目录
一、参数化的三种方式:
(1)脚本中直接指定参数列表, 示例:
yaml格式:
parameters:
uid: [101, 102, 103]
username-password:
- [ "user1", "111111" ]
- [ "user2", "222222" ]
- [ "user3", "333333" ]
pytest格式:
class TestCaseMubuCreatDoc(HttpRunner):
@pytest.mark.parametrize("param", Parameters({
"title": ["demo1"],
"user": ["user1", "user2"],
"title-user": [("demo4", "4"), ("demo5", "5"), ("dmeo6", "6")],
}),)
def test_start(self, param):
super().test_start(param)
(2)通过内置的parameterize(可简写为P)函数引用CSV文件。
该种方式需要准备CSV数据文件,适合数据量比较大的情况。 示例:
parameters:
apkchannel: ${P(data/vip.csv)}
(3)在debugtalk.py中自定义的函数生成参数列表。
该种方式最为灵活,可通过自定义Python函数实现任意场景的数据驱动机制,当需要动态生成参数列表时也需要选择该种方式。 示例:
parameters:
username-password: ${get_account(10)}
# 返回一个列表
def get_user_id():
return [
{"user_id": 1001},
{"user_id": 1002},
{"user_id": 1003},
{"user_id": 1004}
]
# 具有关联性的多个参数
def get_account(num):
accounts = []
for index in range(1, num+1):
accounts.append(
{"username": "user%s" % index, "password": str(index) * 6},
)
return accounts
三种方式可根据实际项目需求进行灵活选择,同时支持多种方式的组合使用。加入测试用例中定义了多个参数,那么测试用例在运行时会对参数进行笛卡尔积组合,覆盖所有参数组合情况。
二、参数化场景实际例子
V1.0 基础版
hrun mubu_creat_doc_test.py
from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase
from testcases.mubu_login_test import TestCaseMubuLogin as MubuLogin
# 如果单独写用例的话,先导入这两个类
import pytest
from httprunner import Parameters
# 【参数组合示例1】title、user、phone-password自由组合,共8种组合。
class TestCaseMubuCreatDoc(HttpRunner):
@pytest.mark.parametrize("param", Parameters({
"title": ["demo1", "demo2"],
"user": ["111", "222"],
# 这个是yml转换换后的,[]也可以换()
"phone-password": [["1", "2"], ["3", "4"]],
}),)
def test_start(self, param):
super().test_start(param)
#【参数组合示例2】
class TestCaseMubuCreatDoc(HttpRunner):
@pytest.mark.parametrize("param", Parameters({
# (1)单参数单值
"title": ["demo1"],
# (2)单参数多值
"title": ["demo2", "demo3"],
"user": ["user1", "user2"],
# (3)多参数多值
"title-user": [("demo4", "4"), ("demo5", "5"), ("dmeo6", "6")],
}),)
def test_start(self, param):
super().test_start(param)
Vn.0 最终版
(1)代码
from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase
from testcases.cookie_manipulation.cookie_push_system_test import TestCaseLogin as Login
import pytest
from httprunner import Parameters
"""
V2.0 将parameters参数化的内容调到debug中
"""
class TestCaseMailPush0052(HttpRunner):
@pytest.mark.parametrize(
"param", Parameters({"a-b": "${mail_001()}",}),
)
def test_start(self, param):
super().test_start(param)
config = Config("xxx").base_url("${ENV(URL)}").verify(False)
teststeps = [
Step(RunTestCase("测试步骤1:登录").call(Login)),
Step(
RunRequest("测试步骤2:xxx")
.post("/xxx/xxx")
.with_headers(**{"xxx": "$token"})
.with_json(
{
"page": 0,
"pageSize": 10,
"reqList": [{"xxx": "$a", "xxx": "$b"}],
"type": 0,
}
)
.validate()
.assert_equal("status_code", 200)
),
]
if __name__ == "__main__":
TestCaseMailPush0052().test_start()
(2)debugtalk.py中导入自定义的函数
from lib.push_system.debug_mail_push import *
(3)目录结构
三、httprunner、pytest的参数化的使用差异
httprunner的参数化:
pytest.mark.parametrize()的参数化:
继承了mark.parametrize()方法,具体参考博客:pytest框架_@pytest.mark.parametrize()
链接:https://blog.csdn.net/weixin_45451320/article/details/113839628
四、问题
问题1:调用参数化的用例,问题点有?
1号脚本做了参数化,示例:
2号脚本调用时候,要加你个parametrize的部分复制过去,不然会加载失败,无法加载100多条参数化的用例