Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Python测试框架pytest(28)测试报告Allure - 动态生成标题、动态生成功能、报告添加用例失败截图

Python测试框架pytest(28)测试报告Allure - 动态生成标题、动态生成功能、报告添加用例失败截图

作者头像
wangmcn
发布于 2022-07-26 06:40:46
发布于 2022-07-26 06:40:46
91300
代码可运行
举报
文章被收录于专栏:AllTests软件测试AllTests软件测试
运行总次数:0
代码可运行

Python测试框架pytest(28)

测试报告Allure

动态生成标题、动态生成功能、报告添加用例失败截图

目录

  • 1、动态生成标题
    • 1.1、示例一:参数化无标题
    • 1.2、示例二:参数化有标题
    • 1.3、示例三:参数化使用ids
    • 1.4、示例四:参数化动态生成标题
    • 1.5、示例五:参数化动态生成标题优化
  • 2、动态生成功能
    • 2.1、示例一:allure.dynamic.title()
    • 2.2、示例二:allure.dynamic.description()
    • 2.3、示例三:结合@pytest.mark.parametrize()
    • 2.4、示例四:全部方法示例
  • 3、报告添加用例失败截图

1、动态生成标题

默认 allure 报告上的测试用例标题不设置就是用例名称,其可读性不高;当结合 @pytest.mark.parametrize 参数化完成数据驱动时,如标题写死,其可读性也不高。

那如果希望标题可以动态的生成,采取的方案是:

参数化 @pytest.mark.parametrize + @allure.title()

1.1、示例一:参数化无标题

1、创建test_allure_title_parametrize.py文件

脚本代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
微信公众号:AllTests软件测试
"""

import pytest
import allure

@pytest.fixture()
def login(request):
    """登录"""
    param = request.param
    print(f"用户名:{param['username']},密码:{param['password']}")
    # 返回
    return {"code": 0, "msg": "登陆成功"}

datas = [
    {"username": "name1", "password": "pwd1"},
    {"username": "name2", "password": "pwd2"},
    {"username": "name3", "password": "pwd3"}
]

@allure.story('登录功能')
@pytest.mark.parametrize('login', datas, indirect=True)
def test_login(login):
    """
    登录测试用例
    """
    assert login['code'] == 0

2、输入命令运行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pytest test_allure_title_parametrize.py --alluredir=./allure
allure serve allure

如图所示:用例标题就是函数名+参数化的数据

1.2、示例二:参数化有标题

1、创建test_allure_title_parametrize2.py文件

脚本代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
微信公众号:AllTests软件测试
"""

import pytest
import allure

@pytest.fixture()
def login(request):
    """登录"""
    param = request.param
    print(f"用户名:{param['username']},密码:{param['password']}")
    # 返回
    return {"code": 0, "msg": "登陆成功"}

datas = [
    {"username": "name1", "password": "pwd1"},
    {"username": "name2", "password": "pwd2"},
    {"username": "name3", "password": "pwd3"}
]

@allure.story('登录功能')
@allure.title('登录测试用例')
@pytest.mark.parametrize('login', datas, indirect=True)
def test_login(login):
    """
    登录测试用例
    """
    assert login['code'] == 0

2、输入命令运行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pytest test_allure_title_parametrize2.py --alluredir=./allure
allure serve allure

如图所示:参数化的三条测试用例都使用同一个title

1.3、示例三:参数化使用ids

1、创建test_allure_title_parametrize3.py文件

脚本代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
微信公众号:AllTests软件测试
"""

import pytest
import allure

@pytest.fixture()
def login(request):
    """登录"""
    param = request.param
    print(f"用户名:{param['username']},密码:{param['password']}")
    # 返回
    return {"code": 0, "msg": "登陆成功"}

datas = [
    {"username": "name1", "password": "pwd1"},
    {"username": "name2", "password": "pwd2"},
    {"username": "name3", "password": "pwd3"}
]

ids = [
    "name1,pwd1",
    "name2,pwd2",
    "name3,pwd3"
]

@allure.story('登录功能')
@pytest.mark.parametrize('login', datas, ids=ids, indirect=True)
def test_login(login):
    """
    登录测试用例
    """
    assert login['code'] == 0

2、输入命令运行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pytest test_allure_title_parametrize3.py --alluredir=./allure
allure serve allure

如图所示:用例标题就是函数名+ids

1.4、示例四:参数化动态生成标题

1、创建test_allure_title_parametrize4.py文件

脚本代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
微信公众号:AllTests软件测试
"""

import pytest
import allure

@pytest.fixture()
def login(request):
    """登录"""
    param = request.param
    print(f"用户名:{param['username']},密码:{param['password']}")
    # 返回
    return {"code": 0, "msg": "登陆成功"}

data1 = [
    {"username": "name1", "password": "pwd1"},
    {"username": "name2", "password": "pwd2"},
    {"username": "name3", "password": "pwd3"}
]

data2 = [
    ("admin1", "123456"),
    ("admin2", "123456"),
    ("admin3", "123456")
]

@allure.story('字典参数化')
@allure.title('登录测试用例1-{dict}')
@pytest.mark.parametrize('dict', data1)
def test_login1(dict):
    """
    登录测试用例1
    """
    print(dict['username'], dict['password'])

@allure.story('传值进fixture')
@allure.title('登录测试用例2{login}')
@pytest.mark.parametrize('login', data1, indirect=True)
def test_login2(login):
    """
    登录测试用例2
    """
    assert login['code'] == 0

@allure.story('分别传值')
@allure.title('登录测试用例3-用户名:{username}-密码:{password}')
@pytest.mark.parametrize('username, password', data2)
def test_login3(username, password):
    """
    登录测试用例3
    """
    print(username, password)

2、输入命令运行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pytest test_allure_title_parametrize4.py --alluredir=./allure
allure serve allure

如图所示:三种方式传入参数

1.5、示例五:参数化动态生成标题优化

1、创建test_allure_title_parametrize5.py文件

脚本代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
微信公众号:AllTests软件测试
"""

import pytest
import allure

data = [
    ("admin1", "123456", "admin1 登录成功"),
    ("admin2", "123456", "admin2 登录失败"),
    ("admin3", "123456", "admin3 登录成功")
]

@allure.story('分别传值')
@allure.title('登录测试用例-{title}')
@pytest.mark.parametrize('username, password, title', data)
def test_login(username, password, title):
    """
    登录测试用例
    """
    print(username, password)

2、输入命令运行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pytest test_allure_title_parametrize5.py --alluredir=./allure
allure serve allure

如图所示:测试用例标题可读性比较好,易于维护

2、动态生成功能

@allure.title() 和 @allure.description() 都是装饰器,给测试用例提供标题和描述的,其实 allure 提供了在测试用例执行过程中动态指定标题和描述等标签的方法。如:allure.dynamic.title()、allure.dynamic.description()

allure.dynamic 提供的方法:

2.1、示例一:allure.dynamic.title()

用例标题

1、创建test_allure_dynamic.py文件

脚本代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
微信公众号:AllTests软件测试
"""

import allure

@allure.title("装饰器标题")
def test_case():
    print("AllTests软件测试")
    allure.dynamic.title("动态标题")

2、输入命令运行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pytest test_allure_dynamic.py --alluredir=./allure
allure serve allure

如图所示:

2.2、示例二:allure.dynamic.description()

用例描述

1、创建test_allure_dynamic2.py文件

脚本代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
微信公众号:AllTests软件测试
"""

import allure

@allure.title("装饰器标题")
def test_case():
    """
    动态设置描述
    """
    print("AllTests软件测试")
    allure.dynamic.description("动态描述")
    allure.dynamic.title("动态标题")

2、输入命令运行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pytest test_allure_dynamic2.py --alluredir=./allure
allure serve allure

如图所示:

2.3、示例三:结合@pytest.mark.parametrize()

1、创建test_allure_dynamic3.py文件

脚本代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
微信公众号:AllTests软件测试
"""

import pytest
import allure

data = [
    ("admin1", "123456", "admin1 登录成功"),
    ("admin2", "123456", "admin2 登录失败"),
    ("admin3", "123456", "admin3 登录成功")
]

@pytest.mark.parametrize('username, password, title', data)
def test_case(username, password, title):
    """
    测试用例
    """
    print(username, password)
    allure.dynamic.title(title)

2、输入命令运行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pytest test_allure_dynamic3.py --alluredir=./allure
allure serve allure

如图所示:

2.4、示例四:全部方法示例

1、创建test_allure_dynamic4.py文件

脚本代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
微信公众号:AllTests软件测试
"""

import allure

def test_case1():
    """
    测试用例1
    """
    allure.dynamic.title("动态title")
    allure.dynamic.description_html("动态description_html")
    allure.dynamic.severity("blocker")
    allure.dynamic.feature("动态feature")
    allure.dynamic.story("动态story")
    allure.dynamic.tag("动态tag")
    allure.dynamic.link("https://www.baidu.com/?wd=1", "动态link")
    allure.dynamic.issue("https://www.baidu.com/?wd=2", "动态issue")
    allure.dynamic.testcase("https://www.baidu.com/?wd=3", "动态testcase")

def test_case2():
    """
    测试用例2
    """
    allure.dynamic.description("动态description")

2、输入命令运行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pytest test_allure_dynamic4.py --alluredir=./allure
allure serve allure

如图所示:

测试用例1

测试用例2

3、报告添加用例失败截图

在进行 UI 自动化的时候,执行测试用例失败时,想把用例失败的截图展现在 allure 报告里面。

可以使用 pytest 的钩子函数 pytest_runtest_makereport,用来获取用例的执行结果,当用例失败则进行截图操作。之后添加截图到allure报告里,可以使用 allure.attach 方法。

1、创建conftest.py文件

使用钩子函数pytest_runtest_makereport,并判断用例失败时截图操作。

脚本代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
微信公众号:AllTests软件测试
"""

from selenium import webdriver
import pytest
import allure
import os

my_driver = None

@pytest.hookimpl(tryfirst=True, hookwrapper=True)
def pytest_runtest_makereport(item, call):
    """钩子函数:获取每个用例的状态"""
    # 获取钩子方法的调用结果
    my_results = yield
    rep = my_results.get_result()
    # 获取用例call,执行结果是失败的,不包含 setup/teardown
    if rep.when == "call" and rep.failed:
        mode = "a" if os.path.exists("failures") else "w"
        with open("failures", mode) as f:
            # let's also access a fixture for the fun of it
            if "tmpdir" in item.fixturenames:
                extra = " (%s)" % item.funcargs["tmpdir"]
            else:
                extra = ""
            f.write(rep.nodeid + extra + "\n")
        # 添加allure报告截图
        if hasattr(my_driver, "get_screenshot_as_png"):
            with allure.step("添加失败截图"):
                allure.attach(my_driver.get_screenshot_as_png(), "失败截图", allure.attachment_type.PNG)

@pytest.fixture(scope='session')
def browser():
    global my_driver
    if my_driver is None:
        my_driver = webdriver.Chrome()
    yield my_driver
    print("退出登陆")
    my_driver.quit()

2、创建test_allure_screenshot.py文件,为测试用例。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
微信公众号:AllTests软件测试
"""

from selenium import webdriver
import pytest
import allure

def test_case(browser):
    with allure.step("打开首页"):
        browser.get("https://www.cnblogs.com/alltests/")
    # 断言-标题
    assert browser.title == "AllTests软件测试"

3、输入命令运行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pytest test_allure_screenshot.py --alluredir=./allure
allure serve allure

如图所示:

用例失败时截图,并将截图展现在allure报告里。

截图文件在报告目录里。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-09-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AllTests软件测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python测试框架pytest(26)测试报告Allure - 特性
Environment 是环境变量,报告默认是没有任何变量参数的,是需要自己配置的。
wangmcn
2022/07/26
7470
Python测试框架pytest(26)测试报告Allure - 特性
pytest文档44-allure.dynamic动态生成用例标题
pytest 结合 allure 描述用例的时候我们一般使用 @allure.title 和 @allure.description 描述测试用例的标题和详情。 在用例里面也可以动态更新标题和详情,使用allure.dynamic方法实现。
上海-悠悠
2020/07/30
1.3K0
pytest文档44-allure.dynamic动态生成用例标题
Pytest 系列(28)- 参数化 parametrize + @allure.title() 动态生成标题
https://www.cnblogs.com/poloyy/category/1690628.html
小菠萝测试笔记
2020/10/30
1.3K0
Pytest 系列(28)- 参数化 parametrize + @allure.title() 动态生成标题
pytest文档39-参数化(parametrize)结合allure.title()生成不同标题报告
pytest的参数化(parametrize)可以实现只需维护测试数据,就能生成不同的测试用例目的。可以在参数化的时候加 ids 参数对每个用例说明使用场景。 最终我们希望在 allure 报告上能详细的展示出每个用例的标题描述,这样才能更直观的知道每个用例是干什么的。
上海-悠悠
2020/05/13
1.2K0
pytest文档39-参数化(parametrize)结合allure.title()生成不同标题报告
Python测试框架pytest(25)测试报告Allure - 简介、安装、示例、报告结构
1、Allure 框架是一个灵活的轻量级多语言测试报告工具,它不仅以简洁的 web 报告形式展示了测试内容,而且允许参与开发过程的每个人从日常测试执行中提取最大限度的有用信息。
wangmcn
2022/07/26
6530
Python测试框架pytest(25)测试报告Allure - 简介、安装、示例、报告结构
Pytest 系列(29)- 详解 allure.dynamic 动态生成功能
https://www.cnblogs.com/poloyy/category/1690628.html
小菠萝测试笔记
2020/11/03
1.2K1
Pytest 系列(29)- 详解 allure.dynamic 动态生成功能
Allure2添加用例标题、用例步骤
应用场景:为了让生成的测试报告便于阅读,可以为每条用例添加一个便于阅读的标题(可以使用中文标题)。生成的报告展示用例时,就会以设置的标题名展示出来。
霍格沃兹测试开发Muller老师
2024/05/14
2060
Pytest和Allure测试框架-超详细版+实战
:1. 简单灵活,容易上手;支持参数化; 测试用例的skip和xfail 处理; 2. 能够支持简单的单元测试和复杂的功能测试,还可以用来做 selenium/appium等自动化测试、接口自动化测试 (pytest+requests); 3. pytest具有很多第三方插件,并且可以自定义扩展, 比较好 用的如 pytest-allure(完美html测试报告生成) pytest-xdist (多CPU分发)等; 4. 可以很好的和jenkins集成;** 5. **
全栈程序员站长
2022/09/17
2.3K0
Pytest和Allure测试框架-超详细版+实战
Python测试框架pytest(17)参数化parametrize
@pytest.mark.parametrize 允许在测试函数或类中定义多组参数和 fixtures。
wangmcn
2022/07/26
7060
Python测试框架pytest(17)参数化parametrize
Pytest 学习(二十五)- 解决pytest参数化测试标题都一样问题
一、前言 使用参数化测试化后,allure的报告如下显示: 源代码如下: # -*- coding: utf-8 -*- # @Time : 2020/12/13 17:27 # @Author
软件测试君
2020/12/22
3360
Python测试框架pytest(22)插件 - pytest-xdist(分布式执行)
当测试用例非常多的时候,一条条按顺序执行测试用例,是很浪费测试时间的。这时候就可以用到 pytest-xdist,让自动化测试用例可以分布式执行,从而大大节省测试时间。
wangmcn
2022/07/26
1.2K0
Python测试框架pytest(22)插件 - pytest-xdist(分布式执行)
基于Pytest+Requests+Allure实现接口自动化测试
1、工具层 将get、post等常用行为进行二次封装。 代码(api_key.py)如下:
测试开发技术
2023/08/21
5480
基于Pytest+Requests+Allure实现接口自动化测试
Pytest自动化测试 - allure报告进阶
如果你想对测试用例进行严重等级划分,可以使用 @allure.severity 装饰器,它可以应用于函数,方法或整个类。
huofo
2022/03/18
3160
Pytest自动化测试 - allure报告进阶
怎么基于Pytest+Requests+Allure实现接口自动化测试?
1、工具层 将get、post等常用行为进行二次封装。 代码(api_key.py)如下:
科技新语
2024/06/12
1660
怎么基于Pytest+Requests+Allure实现接口自动化测试?
Pytest框架集成Allure定制测试报告详解(一)
Allure是一款非常轻量级并且非常灵活的开源测试报告生成框架。它支持绝大多数测试框架, 例如TestNG、Pytest、JUint等。它简单易用,易于集成。下面就Pytest如何与Allure集成做详细介绍。
王大力测试进阶之路
2020/02/19
1.8K0
Pytest框架集成Allure定制测试报告详解(一)
Pytest+Allure美化测试报告
在学习pytest的时候,生成的html报告觉得实在不是很美观,查到资料有很多测试报告的第三方插件,不仅美观而且查看测试用例也很方便,那我们一起来学习下吧~
小雯子打豆豆
2020/06/16
1.3K0
Pytest+Allure美化测试报告
Python测试框架pytest(07)fixture - 参数化params、和parametrize结合、ids
@pytest.mark.parametrize添加indirect=True参数是为了把login当成一个函数去执行,而不是一个参数,并且将data当做参数传入函数。
wangmcn
2022/07/26
5060
Python测试框架pytest(07)fixture - 参数化params、和parametrize结合、ids
如何利用Allure报告提升你的测试效率?
安装步骤:- 安装 Java,环境变量配置教程。- 安装 Allure 环境变量配置教程 - 安装插件:pip install allure-pytest。
霍格沃兹测试开发Muller老师
2024/02/28
2160
Python测试框架pytest(15)skip、skipif、xfail跳过用例
@pytest.mark.skip 可以标记无法在某些平台上运行的测试功能,或者希望失败的测试功能。
wangmcn
2022/07/26
6910
Python测试框架pytest(15)skip、skipif、xfail跳过用例
Pytest系列(21)- allure的特性,@allure.description()、@allure.title()的详细使用
https://www.cnblogs.com/poloyy/category/1690628.html
小菠萝测试笔记
2020/06/09
1.1K0
Pytest系列(21)- allure的特性,@allure.description()、@allure.title()的详细使用
推荐阅读
相关推荐
Python测试框架pytest(26)测试报告Allure - 特性
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验