pytest-参数化parametrize结合allure.title()动态生成用例标题
前言
使用参数化,allure报告默认的用例标题为用例名称,这样可读性较差
参数化使用ids,也并不能完全解决问题(还是会保留用例名称)
使用allure.title()装饰器写死标题的方式,用例维护成本较高
所以希望能把parametrize参数化数据驱动结合title使用,下面会以登录用例为例来详细介绍
参数化默认的标题
代码
data_login = [ {"username": "name1", "pwd": "pwd1"}, {"username": "name2", "pwd": "pwd2"}, {"username": "name3", "pwd": "pwd3"} ] @pytest.fixture() def login(request): """登录fixture""" param = request.param print(f"账号是:{param['username']},密码是:{param['pwd']}") # 返回 return {"code": 0, "msg": "success!"} # 参数化默认的标题 @pytest.mark.parametrize("login", data_login, indirect=True) def test_parametrize_without_title(login): assert login['code'] == 0
测试报告

用例标题为方法名+参数化数据,可读性较差
参数化使用id
代码
data_login = [ pytest.param({"username": "name1", "pwd": "pwd1"}, id="name1登录成功"), pytest.param({"username": "name2", "pwd": "pwd2"}, id="name2登录失败"), pytest.param({"username": "name3", "pwd": "pwd3"}, id="name3用户名不存在") ] @pytest.fixture() def login(request): """登录fixture""" param = request.param print(f"账号是:{param['username']},密码是:{param['pwd']}") # 返回 return {"code": 0, "msg": "success!"} # 参数化使用id @pytest.mark.parametrize("login", data_login, indirect=True) def test_parametrize_without_id(login): assert login['code'] == 0
测试报告

使用pytest.param(id=xxx) 的方法只是将参数化的id自定义化,并未达到修改用例标题的效果
参数化+allure.title()写死标题
代码
data_login = [ {"username": "name1", "pwd": "pwd1"}, {"username": "name2", "pwd": "pwd2"}, {"username": "name3", "pwd": "pwd3"} ] # 参数化+allure.title()写死标题 @allure.title("登录测试用例:name1成功,name2失败,name3用户名不存在") @pytest.mark.parametrize("login", data_login, indirect=True) def test_parametrize_without_id(login): assert login['code'] == 0
测试报告

- 达到了标题的效果
- 但是三条用例的标题都相同,可见并不适合结合参数化使用
- 且用例的标题都是写死到用例文件内,未实现数据和用例的解耦,可维护性较差
参数化使用ids
代码
# 数据驱动 data_login = [ {"username": "name1", "pwd": "pwd1"}, {"username": "name2", "pwd": "pwd2"}, {"username": "name3", "pwd": "pwd3"} ] login_ids = ["name1登录成功", "name2登录失败", "name3用户名不存在"] # 参数化使用ids @pytest.mark.parametrize("login", data_login, ids=login_ids, indirect=True) def test_parametrize_without_id(login): assert login['code'] == 0
测试报告

效果和使用pytest.param(id=xxx) 的方法,完全一致,未达到预期效果
参数化+allure.title()动态生成标题
代码
data_login_with_fixture = [ {"username": "name1", "pwd": "pwd1"}, {"username": "name2", "pwd": "pwd2"}, {"username": "name3", "pwd": "pwd3"} ] # 参数化+allure.title()动态生成标题,结合fixture @allure.title("登录用例-{login}") @pytest.mark.parametrize("login", data_login_with_fixture, indirect=True) def test_parametrize_without_id(login): assert login['code'] == 0 data_login_without_fixture = [ ("name1", "123456", "name1 登录成功"), ("name2", "123456", "name2 登录失败"), ("name3", "123456", "name3 账号不存在") ] # 参数化+allure.title()动态生成标题,不结合fixture @allure.title("登录-{title}") @pytest.mark.parametrize("username,pwd,title", data_login_without_fixture) def test_parametrize_without_id(username, pwd, title): pass
测试报告

小结
- 如果有入参传入fixture,尽量不要使用title动态生成
- 无上述条件,使用参数化+allure.title()可动态生成用例标题,更加灵活
- 用例标题可以直接放到数据驱动内去维护,可维护性较高
- 不会影响测试报告的可读性,可以看到和写死的title效果一致
浙公网安备 33010602011771号