前言
pytest 的参数化 (parametrize) 可以实现只需维护测试数据, 就能生成不同的测试用例目的. 可以在参数化的时候加 ids 参数对每个用例说明使用场景.
最终我们希望在 allure 报告上能详细的展示出每个用例的标题描述, 这样才能更直观的知道每个用例是干什么的.
参数化 parametrize
先看一个简单的 pytest 参数化案例演示 test_a.py
- # test_a.py
- import pytest
- import allure
- # 作者: 上海 - 悠悠 QQ 交流群: 779429633
- def login(username, password):
- '''登录'''
- print("输入账号:%s" % username)
- print("输入密码:%s" % password)
- # 返回
- return {"code": 0, "msg": "success!"}
- # 测试数据
- test_datas = [
- ({"username": "yoyo1", "password": "123456"}, "success!"),
- ({"username": "yoyo2", "password": "123456"}, "failed!"),
- ({"username": "yoyo3", "password": "123456"}, "success!"),
- ]
- @allure.story("登录用例")
- @pytest.mark.parametrize("test_input,expected",
- test_datas
- )
- def test_login(test_input, expected):
- '''测试登录用例'''
- # 获取函数返回结果
- result = login(test_input["username"], test_input["password"])
- # 断言
- assert result["msg"] == expected
cmd 命令行运行用例
- > pytest --alluredir ./report test_a.py
- > allure serve ./report
生成报告
这样生成的报告在用例列表里面并不能很友好的展示出每个用例的执行场景, 只知道哪个用例报错了.
于是需要对每个用例加上描述, 加一个 ids 参数
ids 参数使用
在上面用例部分代码里面加个 ids 参数, 用于描述每个用例的运行场景.
- # 作者: 上海 - 悠悠 QQ 交流群: 779429633
- @allure.story("登录用例")
- @pytest.mark.parametrize("test_input,expected",
- test_datas,
- ids=[
- "输入正确账号, 密码, 登录成功",
- "输入错误账号, 密码, 登录失败",
- "输入正确账号, 密码, 登录成功",
- ]
- )
- def test_login(test_input, expected):
- '''测试登录用例'''
- # 获取函数返回结果
- result = login(test_input["username"], test_input["password"])
- # 断言
- assert result["msg"] == expected
cmd 命令行运行用例
- > pytest --alluredir ./report test_a.py
- > allure serve ./report
生成报告
allure.title 描述用例
上面是通过在 parametrize 里面添加 ids 参数解决, 接下来再讲一个用 allure.title("用例描述") 添加用例描述的方式解决.
使用 @allure.title("用例描述") 时, 可以加上传入的参数, 如传入的参数 "test_input,expected" , 需拼接 test_input 参数的值, 可以这样写
@allure.title("用例描述, 测试输入:{test_input}")
在 allure_pytest/utils.py 源码里面可以找到对应的代码
- # allure_pytest/utils.py
- def allure_name(item, parameters):
- name = escape_name(item.name)
- title = allure_title(item)
- return title.format(**parameters) if title else name
当没有加 allure.title()时候, 用例的描述就是 item.name 值(也就是上面的 ids 用例的名称),
如果加了 allure.title(), 那么用例的描述就是添加的 title 值, 这两个地方取其中的一个.
- import pytest
- import allure
- # 作者: 上海 - 悠悠 QQ 交流群: 779429633
- def login(username, password):
- '''登录'''
- print("输入账号:%s" % username)
- print("输入密码:%s" % password)
- # 返回
- return {"code": 0, "msg": "success!"}
- # 测试数据
- test_datas = [
- ({"username": "yoyo1", "password": "123456"}, "success!"),
- ({"username": "yoyo2", "password": "123456"}, "failed!"),
- ({"username": "yoyo3", "password": "123456"}, "success!"),
- ]
- @allure.story("登录用例")
- @allure.title("用例描述, 测试输入:{test_input}")
- @pytest.mark.parametrize("test_input,expected",
- test_datas,
- ids=[
- "输入正确账号, 密码, 登录成功",
- "输入错误账号, 密码, 登录失败",
- "输入正确账号, 密码, 登录成功",
- ]
- )
- def test_login(test_input, expected):
- '''测试登录用例'''
- # 获取函数返回结果
- result = login(test_input["username"], test_input["password"])
- # 断言
- assert result["msg"] == expected
cmd 命令行运行用例
- > pytest --alluredir ./report test_a.py
- > allure serve ./report
生成报告
优化用例 title
结合上面两种实现方式, 把用例描述当成一个测试输入的参数, 继续优化后如下
需注意的是 parametrize 里面三个参数 test_input,expected,title 跟 test_login(test_input, expected, title) 里面三个参数保持一致
- import pytest
- import allure
- # 作者: 上海 - 悠悠 QQ 交流群: 779429633
- def login(username, password):
- '''登录'''
- print("输入账号:%s" % username)
- print("输入密码:%s" % password)
- # 返回
- return {"code": 0, "msg": "success!"}
- # 测试数据
- test_datas = [
- ({"username": "yoyo1", "password": "123456"}, "success!", "输入正确账号, 密码, 登录成功"),
- ({"username": "yoyo2", "password": "123456"}, "failed!", "输入错误账号, 密码, 登录失败"),
- ({"username": "yoyo3", "password": "123456"}, "success!", "输入正确账号, 密码, 登录成功"),
- ]
- @allure.story("登录用例")
- @allure.title("{title}")
- @pytest.mark.parametrize("test_input,expected,title",
- test_datas
- )
- def test_login(test_input, expected, title):
- '''测试登录用例'''
- # 获取函数返回结果
- result = login(test_input["username"], test_input["password"])
- # 断言
- assert result["msg"] == expected
来源: http://blog.51cto.com/15249893/2849559