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

news2024/11/28 18:44:43

一、动态生成标题

默认 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、输入命令运行:

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

 

二、动态生成功能

@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文件

脚本代码:2、输入命令运行:

#!/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")

如图所示:

 

测试用例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报告里。

截图文件在报告目录里。

 

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

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

相关文章

(附3D大屏模板)详解FineVis如何打造智慧医院BIM方案!

近日,又一所三甲医院搭建起了智慧医院,它是深圳大鹏新区人民医院,采用IBM技术,是一家集医疗、科研、预防保健和康复疗养功能的综合体。 这栋建筑包含床位数2000个,总建筑面积417444平方米,建筑高度79.75米…

第四章 法的效力

目录 第一节 法的效力概述 一、法的效力的意义二、法的效力的概念三、法的效力范围 第二节法的时间效力 一、法的生效时间二、法的失效时间三、法律溯及力 第三节法的空间效力 一、法的域内效力二、法的域外效力 第四节 法的对人效力 一、对人效力的原则二、我国法律的对人效力…

epoll 反应堆模型(Libevent库核心思想)

epoll 反应堆模型总述 epoll 反应堆模型是从 libevent 库里面抽取的核心代码。 epoll ET模式 非阻塞、轮询 void *ptr 反应堆的理解:参考理解 加入IO转接之后,有了事件,server才去处理,这里反应堆也是这样,由于网络…

ssm框架之SpringMVC:浅聊获得参数以及获得请求头参数

前面聊过了SpringMVC,以及通过实例演示了SpringMVC如何搭建,如果对环境搭建不太了解的话,可以看一下前面的文章(下面演示的例子,环境都是通过上面的例子进行演示的):传送阵 在使用javaweb项目原…

30天学会《Streamlit》(2)

30学会《Streamlit》是一项编码挑战,旨在帮助您开始构建Streamlit应用程序。特别是,您将能够: 为构建Streamlit应用程序设置编码环境 构建您的第一个Streamlit应用程序 了解用于Streamlit应用程序的所有很棒的输入/输出小部件 第2天 - 构建…

Kubernetes部署Nacos集群

一、k8s架构 master: 11.0.1.3 node: 11.0.1.4,11.0.1.5(nfs) nfs: 11.0.1.5 二、安装nfs 安装nfs-utils和rpcbind nfs客户端和服务端都安装nfs-utils包 yum install nfs-utils rpcbind -y创建共享目录 mkdir -p /nfsdata chmod 777 /nfsdata编辑/etc/exports文件添加如下…

【部署项目】记录一些踩到的坑

这里写自定义目录标题记录一些踩到的坑设置二级域名注意事项文件访问权限记录一些踩到的坑 这个帖子是用来记录自己在windows和linux下进行部署项目时遇到的坑,以及对应的解决办法 设置二级域名 当你只有一个域名又不想买新的域名的时候(域名其实很便宜,贵在租服务器上),二级…

剖析多利熊业务如何基于分布式架构实践稳定性建设

作者 | 百度小程序团队 导读 多利熊稳定性建设,是指为了确保系统或服务,在生产环境中的稳定性而采取的一系列措施和优化。这包括但不限于监控、预警、容错、自动化、规范、质量等方面的优化。通过稳定性建设,可以提高系统的可靠性和可用性&am…

sysbench压测MySQL8问题记录

数据库版本:MySQL8.0.26 sysbench版本:sysbench 1.0.17 CentOS版本:CentOS Linux release 7.9.2009 (Core) 问题一:FATAL: error 2059: Authentication plugin ‘caching_sha2_password’ cannot be loaded 执行 sysbench /usr/…

【论文阅读】3D-LaneNet

【论文阅读】3D-LaneNet 主要要做的事情就是 lane detection。这里提一下 BEV(Bird‘s Eye View) 感知算法,为了将 2D 图像映射到 3D 空间中,能够更准确的检测物体位置,需要 BEV 感知的结果。后续还会继续了解这方面内…

论文阅读【17】Dynamic ensemble learning for multi-label classification

论文十问十答: Q1论文试图解决什么问题? Q2这是否是一个新的问题? Q3这篇文章要验证一个什么科学假设? Q4有哪些相关研究?如何归类?谁是这一课题在领域内值得关注的研究员? Q5论文中提到的解决方…

研究LLMs之前,不如先读读这五篇论文!

目标:了解 LMM 背后的主要思想 ▪️ Neural Machine Translation by Jointly Learning to Align and Translate ▪️ Attention Is All You Need ▪️ BERT ▪️ Improving Language Understanding by Generative Pre-Training ▪️ BART Neural Machine Translati…

引导程序、BIOS中断、检测内存容量、实模式切换到保护模式

初始化引导程序 基本概念 BIOS会将磁盘的第0个扇区(大小为512字节),加载到0x7c00处。 引导程序负责操作系统的加载,主要用于为操作系统运行提供初始化环境,并运行加载操作系统。 BIOS只加载磁盘的第0个扇区(512字节)到内存中,次程…

【论文阅读_序列推荐】Intent Contrastive Learning for Sequential Recommendation

【论文阅读_序列推荐】Intent Contrastive Learning for Sequential Recommendation 文章目录【论文阅读_序列推荐】Intent Contrastive Learning for Sequential Recommendation1. 来源2. 介绍3. 准备工作3.1 问题定义3.2 用于下一个项目预测的深度 SR 模型3.3 SR中的对比SSL …

基于springboot和ajax的简单项目 06 日志界面的delete功能(根据选择的checkbox)

01.这次后台开始&#xff1b; 顺序依次是dao->xml->service->serviceimpl->controller->html 02.dao接口 public int doDeleteObjects(Param("ids") Integer... ids);03.xml文件 <update id"doDeleteObjects" >delete from sys_lo…

七项新发布,亚马逊云科技Amazon S3持续进化

17年前的3月14日&#xff0c;亚马逊云科技推出了一项“非常简单的”对象存储服务&#xff08;Amazon Simple Storage Service&#xff09;。该服务允许开发人员创建、列出和删除私有存储空间&#xff08;称为存储桶&#xff09;、上传和下载文件以及管理其访问权限。当时&#…

C++刷题--选择题1

文章目录选择题选择题 1&#xff0c; 以下for循环的执行次数是&#xff08;&#xff09; for(int x 0, y 0; (y 123) && (x < 4); x);A 是无限循环 B 循环次数不定 C 4次 D 3次 解析 &#xff1a; C&#xff0c;for循环y 123 是赋值语句&#xff0c; 也就是一…

PSO算法

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; 目录1.PSO算法主要步骤&#x1f331;2.PSO更新方法&#x1f33e;3.PSO求解TSP问题&#x1f334;粒子群算法&#xff08;Particle Swarm Optimization&#xff0c;简称PSO&#xff09;是一种优化算法&#xff0c;模拟…

美国全力打击币圈 “一套花式组合拳”,打得从业者透不过气

银行危机“平息”过后&#xff0c;美国监管机构对币圈接连出手&#xff0c;一套花式组合拳打得从业者透不过气&#xff0c;也使得加密行业在政府的拳头之下风声鹤唳。 首先&#xff0c;切断加密货币与传统金融机构的联系。美国金融体系陷入混乱之际&#xff0c;一系列历史性的银…

顺序表(数据结构)

目录 线性表 顺序表 1、顺序表创建 2、初始化 3、扩容 4、尾插 5、尾删 6、头插 7、头删 8、指定位置插入 9、指定位置删除 10、查询 11、打印 12、销毁 顺序表总代码 Leetcode编程题 1、移除元素 题目链接&#xff1a; 题目描述&#xff1a; 题目解析&#xff1a; 2、删除有序…