前言
pytest的参数化(parametrize)可以实现只需要维护测试数据,就能生成不同的测试用例目的。可以在参数化的时候加ids参数对每个用例说明使用场景。
最终我们希望在allure报告上能详细的展示出每个用例的标题描述,这样才能更直观的知道每个用例是干什么的。
参数化parametrize
先看一个简单的pytest参数化案例演示test_a.py
#test_a.py import allure import pytest def login(uname,pwd): print("账号:{}".format(uname)) print("密码:{}".format(pwd)) return {"code":0,"msg":"success!"} #测试数据 test_datas=[({"name":"admin1","password":"123456"},"success!"), ({"name":"admin2","password":"123456"},"failed!"), ({"name":"admin3","password":"123456"},"success!"),] @allure.story("登录用例") @pytest.mark.parametrize("users,expect",test_datas) def test_login(users,expect): rs=login(users["name"],users["password"]) assert rs["msg"]==expect
cmd 到脚本目录下,执行
pytest --alluredir ./report/a allure serve ./report/a
生成报告
这样生成的报告在用例里面并不能很友好的展示出每个用例的执行场景,只知道哪个用例报错了。于是需要对每个用例加上描述,加一个ids参数。
ids参数使用
在上面用例部分代码里面加个ids参数,用于描述每个用例的运行场景。
#test_a.py import allure import pytest def login(uname,pwd): print("账号:{}".format(uname)) print("密码:{}".format(pwd)) return {"code":0,"msg":"success!"} #测试数据 test_datas=[({"name":"admin1","password":"123456"},"success!"), ({"name":"admin2","password":"123456"},"failed!"), ({"name":"admin3","password":"123456"},"success!"),] @allure.story("登录用例") @pytest.mark.parametrize("users,expect",test_datas, ids=[ "输入正确账号,密码,登录成功", "输入错误账号,密码,登录失败", "输入正确账号,密码,登录成功", ]) def test_login(users,expect): rs=login(users["name"],users["password"]) assert rs["msg"]==expect
cmd命令行运行用例
pytest --alluredir ./report/a allure serve ./report/a
报告结果
allure.title描述用例
上面是通过在parametrize里面添加ids参数解决,接下来再讲一个用allure.title("用例描述")添加用例描述的方式解决。
使用@allure.title(“用例描述”)时,可以加上传入的参数,如传入的参数“users,expect”,需拼接users参数的值,可以这样写
@allure.title("用例描述,测试输入:{users}")
在allure_pytest/utils.py源码里面可以找到对应的代码
当没有加allure.title()时候,用例的描述就是item.name值(也就是上面的ids用例的名称),如果加了allure.title(),那么用例的描述就是添加的title值,这两个地方取其中的一个。
#test_a.py import allure import pytest def login(uname,pwd): print("账号:{}".format(uname)) print("密码:{}".format(pwd)) return {"code":0,"msg":"success!"} #测试数据 test_datas=[({"name":"admin1","password":"123456"},"success!"), ({"name":"admin2","password":"123456"},"failed!"), ({"name":"admin3","password":"123456"},"success!"),] @allure.story("登录用例") @pytest.mark.parametrize("users,expect",test_datas, ) @allure.title("用例描述,测试输入:{users}") def test_login(users,expect): rs=login(users["name"],users["password"]) assert rs["msg"]==expect
cmd命令行运行用例
pytest --alluredir ./report/a allure serve ./report/a
报告结果
优化用例title
结合上面两种实现方式,把用例描述当成一个测试输入的参数,继续优化后如下需注意的是parametrize里面三个参数 users,expect,titles跟test_login(users,expect,titles)里面三个参数保持一致。
#test_a.py import allure import pytest def login(uname,pwd): print("账号:{}".format(uname)) print("密码:{}".format(pwd)) return {"code":0,"msg":"success!"} #测试数据 test_datas=[({"name":"admin1","password":"123456"},"success!","输入正确账号、密码,登录成功"), ({"name":"admin2","password":"123456"},"failed!","输入错误账号、密码,登录失败"), ({"name":"admin3","password":"123456"},"success!","输入正确账号、密码,登录成功"),] @allure.story("登录用例") @allure.title("{titles}") @pytest.mark.parametrize("users,expect,titles",test_datas, ) def test_login(users,expect,titles): rs=login(users["name"],users["password"]) assert rs["msg"]==expect