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

news2025/1/17 14:02:10

一、动态生成标题

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

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

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

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

1、创建
test_allure_title_parametrize.py文件

脚本代码:
 

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
"""
 
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、输入命令运行:

pytest test_allure_title_parametrize.py --alluredir=./allure
allure serve allure

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

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

1、创建
test_allure_title_parametrize2.py文件

脚本代码:
 

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
"""
 
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、输入命令运行:

pytest test_allure_title_parametrize2.py --alluredir=./allure
allure serve allure

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

1、创建
test_allure_title_parametrize3.py文件

脚本代码:
 

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
"""
 
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、输入命令运行:

pytest test_allure_title_parametrize3.py --alluredir=./allure
allure serve allure

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

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

1、创建test_allure_title_parametrize4.py文件

脚本代码:
 

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
"""
 
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、输入命令运行:

pytest test_allure_title_parametrize4.py --alluredir=./allure
allure serve allure

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

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

1、创建test_allure_title_parametrize5.py文件

脚本代码:
 

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
"""
 
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、输入命令运行:

pytest test_allure_title_parametrize5.py --alluredir=./allure
allure serve allure

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

二、动态生成功能

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

allure.dynamic 提供的方法:

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

用例标题

1、创建test_allure_dynamic.py文件

脚本代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
"""
 
import allure
 
@allure.title("装饰器标题")
def test_case():
    print("AllTests软件测试")
    allure.dynamic.title("动态标题")

2、输入命令运行:

pytest test_allure_dynamic.py --alluredir=./allure
allure serve allure

如图所示:

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

用例描述

1、创建test_allure_dynamic2.py文件

脚本代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
"""
 
import allure
 
@allure.title("装饰器标题")
def test_case():
    """
    动态设置描述
    """
    print("AllTests软件测试")
    allure.dynamic.description("动态描述")
    allure.dynamic.title("动态标题")

2、输入命令运行:

pytest test_allure_dynamic2.py --alluredir=./allure
allure serve allure

如图所示:

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

1、创建test_allure_dynamic3.py文件

脚本代码:
 

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
"""
 
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、输入命令运行:

pytest test_allure_dynamic3.py --alluredir=./allure
allure serve allure

如图所示:

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

1、创建test_allure_dynamic4.py文件

脚本代码:
 

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
"""
 
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、输入命令运行:

pytest test_allure_dynamic4.py --alluredir=./allure
allure serve allure

如图所示:

 测试用例1

测试用例2

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

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

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

1、创建conftest.py文件

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

脚本代码:
 

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
"""
 
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文件,为测试用例。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
"""
 
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、输入命令运行:

pytest test_allure_screenshot.py --alluredir=./allure
allure serve allure

如图所示:

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

截图文件在报告目录里。

 

作为一个软件测试的过来人,我想尽自己最大的努力,帮助每一个伙伴都能顺利找到工作。所以我整理了下面这份资源,现在免费分享给大家,有需要的小伙伴可以关注【公众号:开心螺蛳粉】自提!

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。在这里插入图片描述

在这里插入图片描述

行动吧,在路上总比一直观望的要好,未来的你肯定会感谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入群:1150305204,里面有各种测试开发资料和技术可以一起交流哦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1513315.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大型文物三维扫描抄数服务3d建模造型设计逆向贴图等比例制作仿制

大型文物三维扫描数字化建模是一项前沿的技术,它运用高精度的扫描设备,将文物的三维形态精确地捕捉下来,再通过专业的建模软件,将这些数据转化为数字化的三维模型。这一技术的出现,不仅极大地提升了文物保护的效率和精…

爬虫案例2:playwright 超爽体验

参考链接:https://playwright.bootcss.com/python/docs/intro 目标网站:https://spa6.scrape.center/通过观察,页面的信息是通过Ajax请求后返回的信息 下面使用playwright实现绕过token的获取直接拿到返回的数据import asyncio import json f…

WebGIS开发0基础必看教程:清空功能和地图定位功能的设计以及实现

1.背景 当地图中增加了很多元素后,对不同的元素需要进行一定的控制,最简单的控制就是能对元素有选择的进行清空删除。在本节中,还将介绍WebGIS中另外一个常用功能,即地图定位功能。具体描述便是:当输入一个坐标点后&a…

LiveGBS流媒体服务器中海康摄像头GB28181公网语音对讲、语音喊话的配置

LiveGBS海康摄像头国标语音对讲大华摄像头国标语音对讲GB28181语音对讲需要的设备及服务准备 1、背景2、准备2.1、服务端必备条件(注意)2.2、准备语音对讲设备2.2.1、不支持跨网对讲示例2.2.2、 支持跨网对讲示例 3、开启音频开始对讲4、搭建GB28181视频…

[BJDCTF2020]Cookie is so stable

hint提示查看cookies flag.php页面我们先随便输入一个名字 输入后我们重新进一次flag.php,发现cookie里存储了刚刚登陆时输入的用户名,直接猜是ssti 尝试后根据ssti特征判断是twig模板 {{_self.env.registerUndefinedFilterCallback("exec")…

POS 之 验证者如何才能提议区块

验证者提议区块 验证者帐户提议区块。 验证者帐户由节点运营商(可以是AWS等待云服务商)管理,节点运营商运行验证者软件作为其执行和共识客户端的一部分,并且已经向存款合约中存入了至少 32 个以太币 然而,每个验证者只是偶尔负责提议一个区块…

【原创】[新增]ARCGIS之土地报备Txt、征地Xls格式批量导出Por旗舰版

一、软件简介 2024年新增旗舰版软件,本软件全新界面开发,保留原有软件功能及一些使用习惯,并集成了现已有的所有定制格式的支持,并增加自定义格式的导出;做到1N2(即为1种通用版本N种定制格式导出txt、Xls&a…

物理隔离条件下,如何安全高效地进行内外网文件导入导出?

内外网文件导入导出通常指的是在内部网络(内网)和外部网络(外网)之间传输文件的过程。这在企业环境中尤其常见,因为内部网络通常包含敏感数据,而外部网络(如互联网)则允许更广泛的访…

生成器建造者模式(Builder)——创建型模式

生成器/建造者模式——创建型模式 什么是生成器模式? 生成器模式是一种创建型设计模式, 使你能够分步骤创建复杂对象。 该模式允许你使用相同的创建代码生成不同类型和形式的对象。 提炼两个关键点:Ⅰ.分步骤创建复杂对象。Ⅱ.相同创建代码…

linux-MDK can电机带导轨

确保接线正确,这个带导轨的电机需要24V的电压 $ ls /dev //查看端口是什么$ sudo slcand -o -s6 /dev/ttyACM0 can0 //将端口封装为can0 $ sudo ip link set can0 up //打开端口 按照电机说明书,按照需要的指令计算检验和&#xf…

30天学会QT(进阶)--------------第二天(创建项目)

1、如何规范的创建一个项目 由于本人也是从其他的项目上学来的,所以也不算是业界规范,每个公司或者个人都有自己的方式去创建项目,项目的创建是本着简洁,明了,方便而言的,所以对于我来说,不繁琐…

速卖通批量注册买家号安全吗?怎么弄?

在速卖通等跨境电商平台上,买家号的注册与养号过程繁琐而复杂。传统的手动注册方式效率低下,难以满足大规模的需求。而跨境智星系统凭借其全自动化的功能,能够轻松实现买家号的批量注册与养号,大大提高了效率。 使用跨境智星系统进…

计算机基础:一些你必须知道的名词详解,必须要会的理论知识

软件测试 计算机基本特点 计算机硬件组成 内存储器和外存储器特点 计算机软件系统组成 常见的操作系统软件 编码 计算机数据计量单位 浏览器 图片类型 网页打开过程 客户端、服务器、请求和响应 dos 命令 软件测试 在规定的条件下对程序进行操作,以发现…

海豚调度系列之:认识海豚调度

海豚调度系列之:认识海豚调度 一、海豚调度二、特性三、建议配置四、名次解释 一、海豚调度 Apache DolphinScheduler 是一个分布式易扩展的可视化DAG工作流任务调度开源系统。适用于企业级场景,提供了一个可视化操作任务、工作流和全生命周期数据处理过…

MySQL row_number()函数,rank()函数和dense_rank()函数

从MySQL8.0开始引用row_number(), rank()函数和dense_rank()函数,也就是常见的窗口函数,三个函数都是一种用于计算排名的工具,它们根据指定的列对结果集进行排序,并为每一行分配一个排名值(1,2,3,...)。 函…

【ansible】ansible的介绍和安装

前言运维自动化 云计算核心职能 搭建平台架构 日常运营保障 性能效率优化 相关工具 代码管理(SCM):GitHub、GitLab、BitBucket、SubVersion 构建工具:maven、Ant、Gradle 自动部署:Capistrano、CodeDeploy 持续…

insertAdjacentHTML() 作用

insertAdjacentHTML()简介 insertAdjacentHTML() 方法是将文本解析为 element 元素,并将结果节点插入到DOM树中的指定位置。它不会重新解析它正在使用的元素,因此它不会破坏元素内的现有元素。这避免了额外的序列化步骤,使其比直接使用innerH…

京东|淘宝电商API数据采集接口C++/JAVA/python软件API接口调试

多语言环境下API接口的调用,是很多电商企业都要求的。 如何接入京东/淘宝API接口,如何请求? taobao.item_get 公共参数 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_na…

微信小程序上传图片到服务端,springboot项目。避免踩坑保姆教程

多方查找终于搞懂了如何去上传文件到本地服务器 前端代码 <view class"operation_row common_mb0"><view class"upload_btn" bindtap"clickUpload"><image src"../../common/images/icon/icon02.png"></image&g…

Docker 搭建 PaddleOCR

转自PaddleOCR docker模式 - 简书 目的: 公司要放弃第三方的ocr工具(日语),需要自己搭建训练一套,这篇是搭建 图片要标出文字的选取框 因为是日文所以ocr有专门的工具,只需要文字坐标就好如图 日文的账票需要加密一下 我得环境是 Ubuntu 22.04.1 LTS 1,下载代码 cd /hom…