pytest(二)

news2024/11/26 4:46:24

1.pytest-html⽣成报告


        Pytest-HTML 是⼀个插件,它可以⽣成漂亮且易于阅读的 HTML 测试报告。下⾯是使⽤ pytest-html ⽣成报告的步骤:

        1. 安装 pytest-html 插件:
        

pip install pytest-html

2. 运⾏测试并⽣成报告

        

pytest --html=report.html

使⽤ --html 选项指定报告⽂件的名称和路径。在上述示例中,报告将⽣成为report.html ⽂件。


3. 查看⽣成的报告:


        打开⽣成的 HTML 报告⽂件,你将看到测试结果的摘要、详细的测试⽤例执⾏信息、失败⽤           例的堆栈跟踪等。报告通常包括以下内容

        

概述信息:显示运⾏的测试数量、通过的测试数量、失败的测试数量等概览信息。

测试⽤例列表:列出每个测试⽤例的名称、状态(通过、失败、跳过等)、执⾏时间等信息。

错误和失败详情:提供失败⽤例的详细信息、堆栈跟踪等,帮助你快速定位和解决问题。

图表和图形化统计信息:可视化展示测试结果、⽤例通过率、执⾏时间等数据。

4. ⾃定义报告的样式和配置:

        pytest-html 提供了许多配置选项,你可以在 pytest.ini ⽂件中添加如下配置来⾃定义报告的样式和⾏为:

        

[pytest] [pytest]
addopts = --html=report.html --self-contained-html
html_title = My Test Repor

addopts :设置⽣成报告的选项,包括报告⽂件的名称和路径。

html_title :设置报告的标题

也可以直接在main上进行设置

2.pytest-html在报告中添加图⽚
 

在 pytest 中,你可以使⽤ extra 参数和 extras 参数来向 pytest-html 报告添加⾃定义的额外信息,包括图⽚。
 


from pytest_html import extras


def test_add_img(extra):  # extra ---》 pytest的默认的外部数据列表
    def image_to_base64(image_path):
        import base64
        """这个函数是将图片转化为base64数据"""
        with open(image_path, "rb") as image_file:
            encoded_string = base64.b64encode(image_file.read())
            return encoded_string.decode('utf-8')

    # # 添加图片文件
    image_path = "E:\Python\资料\QQ浏览器截图20240303180637.jpg"  # 这里你可以换成你的图片路径
    extra.append(extras.jpg(image_path))  # 添加图片

    # 添加base64格式的图片
    base64_data = image_to_base64(image_path)
    extra.append(extras.image(base64_data))

3.Pytest获取⽤例结果流程

pytest_runtest_makereport 是 pytest 的钩⼦函数之⼀。它在每个测试⽤例运⾏完成后被调⽤,并提供了测试结果的详细信息。通过使⽤这个钩⼦函数,你可以⾃定义测试报告的输出,包括添加截图、⽇志等附加信息。
 

# file name: conftest.py
import pytest
@pytest.hookimpl(hookwrapper=True) # 写死的
def pytest_runtest_makereport(item, call): # 写死的
outcome = yield
report = outcome.get_result()
if report.when == "call": # 过滤 前置,和后置,只保留运⾏中的状态
print("⽤例执⾏结果:", report.outcome) # ⽤例执⾏结果

4.pytest-html的异常时添加图⽚实现

        


import pytest
from pytest_html import extras


@pytest.hookimpl(hookwrapper=True)  # 写死的
def pytest_runtest_makereport(item, call):  # 写死的
    def image_to_base64(image_path):
        import base64
        """这个函数是将图片转化为base64数据"""
        with open(image_path, "rb") as image_file:
            encoded_string = base64.b64encode(image_file.read())
            return encoded_string.decode('utf-8')

    outcome = yield
    report = outcome.get_result()
    extra = getattr(report, "extra", [])
    if report.when == "call":  # 过滤 前置,和后置,只保留运行中的状态
        print("用例执行结果:", report.outcome)  # 用例执行结果
        if report.outcome != "passed":
            """失败截图数据"""
            image_path = "E:\Python\资料\QQ浏览器截图20240303180637.jpg"  # 这里你可以换成你的图片路径
            base64_data = image_to_base64(image_path)
            extra.append(extras.image(base64_data))
    report.extra = extra  # 替换数据中的 extra 对象

5.allure-pytest⽣成测试报告

        在官网下载allure

Central Repository: io/qameta/allure/allure-commandline (apache.org)

配置环境


        下载allure-pytest插件

        pip install allure-pytest
 

        环节⼀,得到测试结果数据:

        

import pytest
pytest.main(["--alluredir","./allure_results"])

        --alluredir : ⽤于指定⽣成 Allure 报告所需的数据⽂件的存储⽬录。 -- alluredir 后⾯的参数 ./allure_results 指定了存储⽬录的路径。你可以根据需要更改为其他⽬录路径。
 

环节⼆,根据结果数据⽣成测试报告:
 

import os
os.system(r"allure generate --clean ./allure_results -o
./allure_report")

allure generate : 是 Allure 命令⾏⼯具的命令,⽤于根据测试结果数据⽣成 Allure报告

--clean : 是⼀个选项,⽤于在⽣成报告之前先清理输出⽬录,以确保报告是最新的。

./allure_results : 是存储测试结果数据的⽬录路径。这个命令告诉 Allure ⼯具从该⽬录中读取测试结果数据。

-o ./allure_report : 是指定⽣成的 Allure 报告的输出⽬录路径。这个命令告诉Allure ⼯具将⽣成的报告存储在 ./allure_report ⽬录中。你可以根据需要更改为其他⽬录路径。

我们打开网页如下所示

6.allure-pytest的⾏为驱动标记

        在 Allure 报告中, feature 和 story 被称为⾏为驱动标记,⽤于描述测试⽤例所 属的功能和故事。

        feature 标记⽤于标识测试⽤例所属的功能或模块。它表示被测试的系统中的 ⼀个主要功能。可以将 feature 视为⼀个⼤的分类或主题,⽤于组织和描述相 关的测试⽤例

        story 标记⽤于进⼀步细分 feature ,描述测试⽤例所属的具体故事或场景。 它表示在功能中的⼀个具体情境或使⽤案例。可以将 story 视为 feature 的 ⼦分类,⽤于更详细地描述测试⽤例

例子如下

import allure
@allure.feature("⽤户管理")
@allure.story("创建⽤户")
def test_create_user():
assert True
@allure.feature("⽤户管理")
@allure.story("删除⽤户")
def test_delete_user():
assert True

在 Allure 报告中, feature 和 story 标记将以层次结构的形式显示,帮助你更好 地组织和理解测试⽤例的关系。这样的标记可以提供更丰富的上下⽂信息,使测试报 告更易读、易懂,同时也⽅便进⾏功能和故事的筛选和过滤。

如上图所示 ,我们分成了用户管理和用户管理22 这便是由feture来管理,而用户管理下面的创建用户和创建用户1 这些则是由story来进行管理

7.allure-pytest的步骤管理

        Allure-pytest 提供了步骤管理功能,可以帮助在测试⽤例中记录和展示测试步骤的执 ⾏情况。步骤管理可以提供更详细的测试过程描述,帮助定位问题和跟踪测试执⾏。

        下⾯是使⽤ Allure-pytest 进⾏步骤管理的简单步骤:

        1. 在测试⽤例中使⽤ @allure.step 装饰器定义步骤:

import allure


@allure.step("步骤1:登录系统")
def step_login_system(username, password):
    # 登录系统的代码逻辑
    print("登录", username, password)


@allure.step("步骤2:搜索商品")
def step_search_product(product_name):
    # 搜索商品的代码逻辑
    print("搜索商品", product_name)


@allure.step("步骤3:添加商品到购物车")
def step_add_to_cart(product_id):
    # 添加商品到购物车的代码逻辑
    print("添加商品id:", product_id, "到购物车")


@allure.step("步骤4:结算购物车")
def step_checkout_cart():
    # 结算购物车的代码逻辑
    print("结算购物车")


@allure.step("步骤5:确认订单")
def step_confirm_order():
    # 确认订单的代码逻辑
    print("确认订单")


2. 在测试⽤例中按照顺序调⽤定义的步骤:

def test_shopping_flow():
    step_login_system("testuser", "password")
    step_search_product("iPhone")
    step_add_to_cart("12345")
    step_checkout_cart()
    step_confirm_order()
    assert True

3. 在 Allure 报告中,每个步骤都将被记录和展示,并且可以查看每个步骤的执⾏状 态、⽇志和截图等信息。这样的步骤管理可以帮助测试⼈员更好地理解测试过 程,快速定位和排查问题

 我们还可以在每个步骤中都创建出子步骤

        


import allure


def test_step_show():
    with allure.step("步骤1"):
        print("步骤1的逻辑代码")

    with allure.step("步骤2"):
        print("步骤2的逻辑代码")

        with allure.step("子步骤2.1"):
            print("子步骤2.1的逻辑代码")

        with allure.step("子步骤2.2"):
            print("子步骤2.2的逻辑代码")

    with allure.step("步骤3"):
        print("步骤3的逻辑代码")

8.allure-pytest在报告中添加图⽚

添加图⽚可以提供更直观的信息展示,帮助测试⼈员和利益相关者更好地理解测试结 果。

Allure-pytest 测试框架中使⽤ @allure.attach 装饰器将图⽚作为附件添加到报告 中。

通过以下步骤实现在 Allure 报告中添加图⽚:

1. 将图⽚准备好,可以是⽂件路径或者已经编码为 base64 的图⽚内容。

        

with open(image_path, 'rb') as image_file:
allure.attach(image_file.read(), name='Uploaded
Image', attachment_type=allure.attachment_type.PNG)

2. 使⽤ allure.attach ⽅法将图⽚作为附件添加到报告中。

3. 指定附件的名称和类型,通常是 PNG 或 JPEG 格式。

def test():
    image_path = "png.png"
    with open(image_path, 'rb') as image_file:
        allure.attach(image_file.read(), name='图片的名称', attachment_type=allure.attachment_type.PNG)

9.allure-pytest的异常时添加图⽚实现

@pytest.hookimpl(hookwrapper=True)  # 写死的
def pytest_runtest_makereport(item, call):  # 写死的
    outcome = yield
    report = outcome.get_result()
    if report.when == "call":  # 过滤 前置,和后置,只保留运行中的状态
        if report.outcome != "passed":
            """失败截图数据"""
            image_path = "png.png"  # 这里你可以换成你的图片路径
            with open(image_path, 'rb') as image_file:
                allure.attach(image_file.read(), name='异常截图', attachment_type=allure.attachment_type.PNG)

10Pytest的数据驱动⽅案

数据驱动是⼀种常⻅的测试⽅案,它允许我们使⽤不同的测试数据来执⾏相同的测试 ⽤例。这种⽅法可以帮助我们提⾼测试覆盖率,减少代码冗余,并更好地组织测试代 码

        pytest⽀持多种数据驱动的⽅案,下⾯是⼏种常⻅的⽅法:

        1.使⽤@pytest.mark.parametrize装饰器:

        pytest提供了⼀个装饰器 @pytest.mark.parametrize ,它可以⽤来将测试函数参数 化。通过这个装饰器,我们可以指定多个参数值的组合,pytest会⾃动为每个组合⽣ 成⼀个独⽴的测试⽤例。

       

import pytest


@pytest.mark.parametrize("input1, input2, expected", [
    (1, 2, 3),
    (5, 5, 10),
    (10, -2, 8)
])
def test_addition(input1, input2, expected):
    print("input1的数据", input1)
    print("input2的数据", input2)
    print("expected的数据", expected)
    assert input1 + input2 == expected

在上⾯的示例中, test_addition 函数被参数化为三个参数: input1 , input2 和 expected 。 @pytest.mark.parametrize 装饰器定义了参数值的组合,每个组 合都会⽣成⼀个独⽴的测试⽤例。

2..使⽤fixtures和数据⽂件:

我们可以结合pytest的fixtures来实现数据驱动。在这种⽅法中,我们可以使⽤fixture 读取和处理数据⽂件,并将数据作为参数传递给测试函数

        

import pytest


@pytest.fixture(params=[
    (1, 2, 3),
    (5, 5, 10),
    (10, -2, 8)
], name="test_data")
def data(request):
    return request.param

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

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

相关文章

Java全局异常处理,@ControllerAdvice异常拦截原理解析【简单易懂】

https://www.bilibili.com/video/BV1sS411c7Mo 文章目录 一、全局异常处理器的类型1-1、实现方式一1-2、实现方式二 二、全局异常拦截点2-1、入口2-2、全局异常拦截器是如何注入到 DispatcherServlet 的 三、ControllerAdvice 如何解析、执行3-1、解析3-2、执行 四、其它4-1、设…

初探 JUC 并发编程:独占锁 ReentrantLock 底层源码解析

本篇是关于 JUC 并发包中独占锁 ReentrantLock 底层源码的解析,在阅读之前需要对 AQS 抽象队列有基本的了解。 文章目录 1.1 类图结构1.2 获取锁1)void lock() 方法2)void lockInterruptibly() 方法3)boolean tryLock() 方法4&am…

jenkins+gitlab+sonar自由风格项目配置

新建项目&基本配置 gitlab侧配置 sonar.projectKeytest_sonar sonar.projectNametest_sonar sonar.projectVersion1.0 sonar.sources. sonar.exclusionssrc/layout/** sonar.sourceEncodingUTF-8 sonar.nodejs.executable/app/nodejs/node-v16.20.2-linux-x64/bin/node配置…

Git详解之六:Git工具

现在,你已经学习了管理或者维护 Git 仓库,实现代码控制所需的大多数日常命令和工作流程。你已经完成了跟踪和提交文件的基本任务,并且发挥了暂存区和轻量级的特性分支及合并的威力。 接下来你将领略到一些 Git 可以实现的非常强大的功能&…

Web APIs(获取元素+操作元素+节点操作)

目录 1.API 和 Web API 2.DOM导读 DOM树 3.获取元素 getElementById获取元素 getElementsByTagName获取元素 H5新增方法获取 获取特殊元素 4.事件基础 执行事件 操作元素 修改表单属性 修改样式属性 使用className修改样式属性 获取属性的值 设置属性的值 移除…

视频模糊变清晰,这13个工具总有一个能帮到你,收藏好

1、Topaz Video Enhance AI 这是一款非常专业的视频分辨率放大软件,使用来自多个帧的信息来实现视频升级、去噪、去隔行扫描和恢复的结果。 Topaz Video Enhance AI可以将视频放大和增强8K分辨率的镜头,并提供真实的细节和动作一致性。它采用AI技术实现…

数据库面试总结

数据库相关 mysql使用的函数 字符相关: concant() 连接字符 trim()去除字符的首尾空格 space(n) 返回n个空格 char_length() 返回字符的个数 ucase()/upper()将字符串 s 的所有字母变成大写字母 lcase()/lower() 将字符串 s 的所有字母变成小写字母 substr/substring/mid(s, …

prophet时间序列模型水质预测应用

前言 此前已经分析了,ARIMA 模型在水质预测中的应用,今天用 prophet 模型测试下在水质预测中的效果。 Prophet 简介 Prophet 是 Facebook 于2017年开源的一个时间序列预测框架,特别适合于处理具有明显趋势性和季节性的数据。该模型设计初衷…

AI算法-高数5.2-线性代数-向量间的线性相关、无关定义和结论

宋浩老师课程:3.2 向量间的线性关系(二)_哔哩哔哩_bilibili 线性相关、不相关结论: 判断线性有关\无关,转化成方程组: 判断条件> 向量线性相关、无关的本质是:除0外能不能找到非0的数据。

【吊打面试官系列】Java高并发篇 - 如何创建守护线程?

大家好,我是锋哥。今天分享关于 【如何创建守护线程?】面试题,希望对大家有帮助; 如何创建守护线程? 使用 Thread 类的 setDaemon(true)方法可以将线程设置为守护线程,需要注意的是,需要在调用 …

代码缺陷扫描神器——FindBugs

FindBugs目前,主要有三种形式使用,GUI形式、插件形式、Ant脚本形式,在这里只讲述FindBugs作为插件,在Android Studio中的应用。 目录 一、FindBugs基础知识 二、FindBugs使用进阶 网络安全学习路线 (2024最新整理&am…

nginx目录枚举修复手册

nginx目录枚举修复手册 漏洞背景 修复方式: ssh zujian2 sudo vi /data/apps/nginx/conf/conf.d/default.conf server {

软件测试,功能测试转测开容易吗?

一、从这个问题,我能读出一些信息如下: 1、不知道您从事测试工作多久了,可以看出您特别羡慕测试开发工程师; 2、 您可能一直从事功能测试工作,工作模式或大环境下,被中了草,想学习测试开发相关…

动手学深度学习18 预测房价竞赛总结

动手学深度学习18 预测房价竞赛总结 李沐老师代码AutoGluonh2o集成学习automlQA 视频: https://www.bilibili.com/video/BV15Q4y1o7vc/?vd_sourceeb04c9a33e87ceba9c9a2e5f09752ef8 代码: https://www.bilibili.com/video/BV1rh411m7Hb/?vd_sourceeb04…

[C++核心编程-09]----C++类和对象之继承

🎩 欢迎来到技术探索的奇幻世界👨‍💻 📜 个人主页:一伦明悦-CSDN博客 ✍🏻 作者简介: C软件开发、Python机器学习爱好者 🗣️ 互动与支持:💬评论 &…

python内置函数exec()和eval()区别

在Python中,eval() 和 exec() 都是内置函数,用于执行存储在字符串或对象中的Python代码,但它们之间也有一些区别。 eval() 语法:eval(expression, globalsNone, localsNone) expression:需要求值的字符串表达式。可…

【C++】 string类:应用与实践

💞💞 前言 hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥个人主页&#x…

自定义类型——结构体、枚举和联合

自定义类型——结构体、枚举和联合 结构体结构体的声明匿名结构体结构体的自引用结构体的初始化结构体的内存对齐修改默认对齐数结构体传参 位段枚举联合 结构体 结构是一些值的集合,这些值被称为成员变量,结构的每个成员可以是不同类型的变量。 数组是…

Python爬虫入门:网络世界的宝藏猎人

今天阿佑将带你踏上Python的肩膀,成为一名网络世界的宝藏猎人! 文章目录 1. 引言1.1 简述Python在爬虫领域的地位1.2 阐明学习网络基础对爬虫的重要性 2. 背景介绍2.1 Python语言的流行与适用场景2.2 网络通信基础概念及其在数据抓取中的角色 3. Python基…

线性表(2)

第二章、线性表(linear list) 线性表是第一个数据结构,再提一遍,学习一个具体的数据结构需要关注它的逻辑结构,物理结构和数据的运算,即三要素。 2.1、线性表的定义和基本操作 线性表的定义 需要注意的是…