pytest文档39-参数化(parametrize)结合allure.title()生成不同标题报告

前言

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

(0)

相关推荐

  • Python Requests Pytest YAML Allure实现接口自动化

    作者:wintest 链接:https://www.cnblogs.com/wintest/p/13423231.html 本项目实现接口自动化的技术选型:Python+Requests+Pytest ...

  • pytest文档42-fixture参数化params

    前言 参数化是自动化测试里面必须掌握的一个知识点,用过 unittest 框架的小伙伴都知道使用 ddt 来实现测试用例的参数化. pytest 测试用例里面对应的参数可以用 parametrize ...

  • pytest文档9-参数化parametrize

    前言 pytest.mark.parametrize装饰器可以实现测试用例参数化. parametrizing 1.这里是一个实现检查一定的输入和期望输出测试功能的典型例子 # content of ...

  • pytest文档67-在 pytest.mark.parametrize 中使用 fixture

    前言 测试用例参数化的时候,使用 pytest.mark.parametrize 参数化传测试数据,如果我们想引用前面 不同fixture 返回的数据当测试用例的入参,目前没好的解决办法. 可以用fi ...

  • pytest文档69-Hook函数之参数化pytest_generate_tests

    前言 pytest 实现参数化有三种方式 pytest.fixture() 使用 fixture 传 params 参数实现参数化 @ pytest.mark.parametrize 允许在测试函数或 ...

  • pytest文档74-参数化parametrize加marks标记(pytest.param)

    前言 pytest 使用 parametrize 参数化的时候,有多组测试数据,需要对其中的一些测试数据加标记跳过,可以用pytest.param实现. pytest.param 先看下 pytest ...

  • pytest文档1-环境准备与入门

    前言 首先说下为什么要学pytest,在此之前相信大家已经掌握了python里面的unittest单元测试框架,那再学一个框架肯定是需要学习时间成本的. 刚开始我的内心是拒绝的,我想我用unittes ...

  • pytest文档2-用例运行规则

    用例设计原则 文件名以test_*.py文件和*_test.py 以test_开头的函数 以Test开头的类 以test_开头的方法 所有的包pakege必须要有__init__.py文件 help帮 ...

  • pytest文档3-pycharm运行pytest

    前言 上一篇pytest文档2-用例运行规则已经介绍了如何在cmd执行pytest用例,平常我们写代码在pycharm比较多 写完用例之后,需要调试看看,是不是能正常运行,如果每次跑去cmd执行,太麻 ...

  • pytest文档5-fixture之conftest.py

    前言 前面一篇讲到用例加setup和teardown可以实现在测试用例之前或之后加入一些操作,但这种是整个脚本全局生效的,如果我想实现以下场景: 用例1需要先登录,用例2不需要登录,用例3需要先登录. ...