Pytest精通指南(28)钩子函数-测试报告(pytest-html)


文章目录

      • 前言
      • 应用场景
      • 插件安装
      • 参数分析
      • 使用方法
      • 拓展-定制化报告


请添加图片描述

前言

在软件开发过程中,测试是确保代码质量的关键环节。

测试报告则是测试过程中不可或缺的输出物,它为我们提供了关于测试用例执行情况的详细信息,帮助我们快速定位和解决问题。

pytest 是一个流行的 Python 测试框架,而 pytest-html 是一个为 pytest 提供的插件,用于生成 HTML格式的测试报告。

这个报告不仅包含了测试用例的执行情况,如成功、失败、跳过等,还会展示每个测试用例的输出信息、错误堆栈、截图等,使得测试结果更加直观和易于理解。

应用场景

项目交付与验收

  • 当项目即将交付给客户或进行验收时,提供一个详细的HTML测试报告
    可以帮助客户或团队成员快速了解软件的测试覆盖率和质量。

持续集成/持续部署(CI/CD)

  • CI/CD流程中,每次代码提交或构建都会触发自动化测试。
    pytest-html 可以生成易于阅读的HTML报告,帮助团队成员快速查看测试结果。

问题定位与调试

  • 当测试用例失败时,HTML报告中的详细信息可以帮助开发人员快速定位问题所在,提高调试效率。

回归测试

  • 在软件发布新版本时,确保之前的功能没有出现问题至关重要。
    pytest-html 可以帮助测试人员快速浏览之前的测试报告,了解哪些测试用例已经覆盖过相关功能。

插件安装

安装命令 pip install pytest-html

在这里插入图片描述

参数分析

pytest-html插件支持多种参数来定制生成的HTML报告。

以下是一些常用的参数:

–html=path/to/report.html

  • 指定生成的HTML报告的文件路径和名称。

–self-contained-html

  • 生成自包含的HTML报告
  • 即CSS、JavaScript、图片等都嵌入到HTML文件中,无需外部依赖。

–no-screenshots

  • 禁用失败测试用例的截图功能。

–metadata

  • 为报告添加元数据,如项目名称、版本信息等。

使用方法

示例代码

import pytest


def test_case_01():
    """测试函数01"""
    print("测试函数01执行完成")


def test_case_02():
    """测试函数02"""
    print("测试函数02执行完成")


def test_case_03():
    """测试函数03"""
    print("测试函数03执行完成")
    assert False


@pytest.mark.parametrize("data", [1, 3, 5, 7, 8])
def test_case_04(data):
    """测试函数04"""

    print("测试函数04执行完成")
    assert data % 2 != 0, "偶数失败,奇数通过"

命令pytest -v -s --html=report.html --self-contained-html

执行结果

在这里插入图片描述

页面效果

在这里插入图片描述

拓展-定制化报告

pytest-html 插件生成的测试报告通常包含以下五个主要部分:

  1. Title(标题): 报告的顶部通常有一个标题,显示测试运行的基本信息,如运行时间、测试用例的总数等。
  2. Environment(环境): 这部分显示了运行测试时的环境信息,包括操作系统、Python 版本、pytest 版本以及任何通过配置添加的其他环境细节。
  3. Summary(摘要): 摘要部分提供了测试运行的概览,包括通过、失败、跳过和错误的测试用例数量。
  4. Results(结果): 结果部分详细列出了每个测试用例的执行情况,包括测试用例的名称、结果状态(通过/失败/跳过/错误)以及任何与测试相关的输出或错误消息。
  5. Results Table(结果表格): 结果表格是报告的核心部分,它以表格形式展示了每个测试用例的详细信息,包括持续时间、链接(如果有的话)和其他自定义列。

pytest-html 的钩子函数

pytest-html 插件提供了一系列钩子函数,允许用户定制报告的生成过程。

这些钩子函数需要在 conftest.py 文件中定义,以便在 pytest 运行时自动加载和使用。

钩子函数允许我们自定义报告的各个部分,例如:

  • 修改表格的头部:使用 pytest_html_results_table_header 钩子
  • 自定义表格的行内容:使用 pytest_html_results_table_row 钩子
  • 添加额外的报告细节:使用 pytest_html_report_sections 钩子

关于 pytest-metadata

某些高版本的 pytest 可能会推荐使用 pytest-metadata 插件来更好地管理测试元数据。

pytest-metadata 提供了一种机制来存储和检索与测试用例相关的元数据,这对于在报告中显示额外的信息非常有用。

如果需要使用 pytest-metadata,可以通过以下命令进行安装:

pip install pytest-metadata

在这里插入图片描述


官方文档:https://pytest-html.readthedocs.io/en/latest/user_guide.html#creating-a-self-contained-report

在这里插入图片描述


conftest.py文件示例代码

import os
import json
import pytest
import logging
from datetime import datetime
from pytest_metadata.plugin import metadata_key


# 1、修改报告标题
def pytest_html_report_title(report):
    report.title = "我的测试报告标题"


# 2、运行测试前修改环境信息
def pytest_configure(config):
    config.stash[metadata_key]["项目名称"] = "我的测试项目名称"
    config.stash[metadata_key]["接口模块"] = "我的测试接口模块"
    config.stash[metadata_key]["接口地址"] = "我的测试接口地址"

    # 3、动态生成log文件的名称,哪怕配置文件中配置了log_file选项也不会生效
    time_now = datetime.now().strftime('%Y%m%d%H%M%S')
    config.option.log_file = os.path.join(config.rootdir, 'log', f'{time_now}.log')


# 4、修改摘要信息
def pytest_html_results_summary(prefix, summary, postfix):
    prefix.extend(["<p>所属部门: 测试xxx部门</p>"])
    prefix.extend(["<p>测试人员: 张三xxxxxx</p>"])


# 5、修改测试结果表格中的列(插入列)
def pytest_html_results_table_header(cells):
    cells.insert(2, "<th>描述</th>")
    cells.insert(1, '<th class="sortable time" data-column-type="time">测试时间</th>')


# 6、修改测试结果表格中的列(插入数据)
def pytest_html_results_table_row(report, cells):
    cells.insert(2, f"<td>{report.description}</td>")
    cells.insert(1, f'<td class="col-time">{datetime.utcnow()}</td>')


# 7、获取测试函数中的doc注释
@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_makereport(item, call):
    outcome = yield
    report = outcome.get_result()
    report.description = str(item.function.__doc__)

    # 8、获取测试函数中的异常错误信息
    if call.excinfo is not None:
        msg = {
            "module": item.location[0],
            "function": item.name,
            "line": item.location[1],
            "message": str(call.excinfo.value).replace("\n", ":")
        }
        logging.error(json.dumps(msg, indent=4, ensure_ascii=False))

pytest.ini文件示例代码

[pytest]
;打印详细日志,相当于命令行加 -vs
addopts = --capture=no --tb=long --html=report.html --self-contained-html --log-cli-level=INFO



;日志开关 true/false
log_cli = true


;输出到终端
;日志级别
log_cli_level = info
;日志格式
log_cli_format = %(asctime)s --> %(filename)-10s [line:%(lineno)-3d] --> %(levelname)-5s --> %(message)s
;日志时间格式
log_cli_date_format = %Y-%m-%d %H:%M:%S


; 输出到文件
;日志文件位置
log_file = ./log/test.log
;日志文件等级
log_file_level = info
;日志文件格式
log_file_format = %(asctime)s --> %(filename)-10s [line:%(lineno)-3d] --> %(levelname)-5s --> %(message)s
;日志文件日期格式
log_file_date_format = %Y-%m-%d %H:%M:%S

test_case_01.py示例代码

import pytest
import logging
log = logging.getLogger(__name__)


def test_case_01():
    """测试函数01"""
    log.info("111")
    print("测试函数01执行完成")


def test_case_02():
    """测试函数02"""
    print("测试函数02执行完成")


def test_case_03():
    """测试函数03"""
    print("测试函数03执行完成")
    log.info(f"断言:1 == 2")
    assert False


@pytest.mark.parametrize("data", [1, 3, 5, 7, 8])
def test_case_04(data):
    """测试函数04"""

    print("测试函数04执行完成")
    assert data % 2 != 0, "偶数失败,奇数通过"

执行结果

在这里插入图片描述

页面效果

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

服务器(AIX、Linux、UNIX)性能监视器工具【nmon】使用介绍

目录 ■nmon简介 1.安装 2.使用简介 3.使用&#xff08;具体使用的例子【CPU】【内存】&#xff09; 4.采集数据 5.查看log&#xff08;根据结果&#xff0c;生成报表&#xff09; 6.分析结果 ■nmon简介 nmon&#xff08;"Nigels performance Monitor"&…

比特币成长的代价

作者&#xff1a;Jeffrey Tucker&#xff0c;作家和总裁。曾就经济、技术、社会哲学和文化等话题广泛发表演讲。编译&#xff1a;秦晋 2017 年之后参与比特币市场的人遇到了与之前的人不同的操作和理想。如今&#xff0c;没有人会太在意之前的事情&#xff0c;说的是 2010-2016…

SL3038 耐压150V恒压芯片 60V降24V 72V降12V降压IC

SL3038 是一款恒压芯片&#xff0c;其耐压值为 150V。这意味着它可以在高达 150V 的电压下工作而不会损坏。现在&#xff0c;让我们来讨论您提到的两个降压应用&#xff1a;从 60V 降到 24V 和从 72V 降到 12V。 1. 60V 降到 24V&#xff1a; 输入电压&#xff1a;60V 输出电…

02 IO口的操作

文章目录 前言一、IO的概念1.IO接口2.IO端口 二、CPU和外设进行数据传输的方法1.程序控制方式1.1 无条件1.2 查询方式 2.中断方式3.DMA方式 一、方法介绍和代码编写1.前置知识2.程序方式1.1 无条件方式1.1.1 打开对应的GPIO口1.1.2 初始化对应的GPIO引脚1.1.2.1 推挽输出1.1.2.…

【Hadoop】-Hive部署[12]

目录 思考 VMware虚拟机部署 规划 步骤1&#xff1a;安装MySQL数据库 步骤2&#xff1a;配置Hadoop 步骤3&#xff1a;下载解压Hive 步骤4&#xff1a;提供MySQL Driver包 步骤5&#xff1a;配置Hive 步骤6&#xff1a;初始化元数据库 步骤7&#xff1a;启动Hive&…

TDSQL同一个所属Set显示3个备份节点

欢迎关注“数据库运维之道”公众号&#xff0c;一起学习数据库技术! 本期将为大家分享《TDSQL同一个所属Set显示3个备份节点》的处置案例。 关键词&#xff1a;分布式数据库、TDSQL、备份节点 1、问题描述 登录赤兔管理平台&#xff0c;单击左侧导航栏“实例管理/集群管理”…

漫谈-AI 时代的信息模型

模型化- 数字化转型的重要基石 在各行各业推行数字化转型过程中&#xff0c;构建信息化模型十分重要&#xff0c;它是数字化转型的基石。事实上&#xff0c;数字化转型的核心是“万物皆模型”&#xff0c;在工业领域&#xff0c;以德国为主导的工业4.0 发展进程中&#xff0c;…

Access denied for user ‘zabbix‘@‘localhost‘ (using password: NO)

现象 排查过程 进入数据库show grants for zabbixlocalhost;select host,user from mysql.user;cat /etc/zabbix/zabbix_server.conf | grep DB | grep -vE ‘#|$’cat /etc/zabbix/web/zabbix.conf.php | grep DB 解决办法 mysql 8.0以下 DPassword123.com mariadb -e "…

java多线程-并发和并行

进程 并发 进程中的线程是由CPU进行调度的&#xff0c;但是CPU能够处理的进程数量有限为了保证所有的线程都在运行&#xff0c;CPU会快速切换&#xff0c;给外界的感觉就是所有的线程都在运行&#xff0c;这就是并发。 并行

【力扣 Hot100 | 第六天】4.21(最长连续序列)

文章目录 10.最长连续序列10.1题目10.2解法&#xff1a;哈希法10.2.1哈希思路10.2.2代码实现 10.最长连续序列 10.1题目 给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时…

php 编译安装oracel扩展

第一步安装Oracle客户端 1&#xff0c;需要下载基础包和sdk oracle客户端下载链接&#xff1a;Oracle Instant Client Downloads for Linux x86-64 (64-bit) https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html 选择最新版本 versi…

国产PLC有哪些,哪个牌子比较好用?

你知道国产PLC有哪些吗,哪个牌子更好用吗&#xff1f; 今天拿出国产先锋的汇川与台达对比&#xff0c;注&#xff1a;视频后方有各品牌学习资料免费送&#xff0c;需要的移步自取。话说回来&#xff0c;只要基于Codesys开发的都比较好用&#xff0c;只是使用底层芯片不同&…

2013-2021年各省经济韧性相关测度指标面板数据

2013-2021年各省经济韧性相关测度指标面板数据 1、时间&#xff1a;2013-2021年 2、指标&#xff1a;城镇化率 %、财政科学技术支出&#xff08;亿元&#xff09;、万人高等教育在校人数&#xff08;万人&#xff09;、财政教育支出&#xff08;亿元&#xff09;、第三产业占…

AD 21、22 软件安装教程

AD2022安装包链接 链接&#xff1a;https://pan.baidu.com/s/1oMNbXibQ1Zjl0RTLdPDVGw 提取码&#xff1a;xfs4 软件下载 1.以管理员身份运行 2. 3. 4. 5.路径最好改为C盘以外的&#xff0c;如D盘&#xff0c;要新建一个空文件夹 6. 7.下载好以后 8.在Crack文件夹下找…

程序员周末提升计划:朝网络安全工程师转型之路

作为一名软件开发人员&#xff0c;我一直对网络安全充满兴趣&#xff0c;并希望在未来转型成为一名网络安全工程师。面对网络安全领域的挑战和机遇&#xff0c;我制定了一个周末提升计划&#xff0c;希望能系统地增强我的技能并为这一跨界做好准备。下面&#xff0c;我将分享我…

有没有学网络空间安全的学长,想知道学长们毕业以后都去干嘛了?

我作为一个零基础小白到白帽黑客&#xff0c;也认识到了很多零基础小白的&#xff0c;有一些网络空间安全的学员&#xff0c;但是大多数还是非计算机相关专业的学员。他们通过系统学习网络安全&#xff0c;掌握黑客技术之后&#xff0c;都找到了自己满意的工作。 同学A&#x…

软文发稿对于企业的重要性

随着社会的发展和科技的进步&#xff0c;软文发稿已成为企业和个人推广和传播信息的一种非常重要的方式。它以隐性的广告形式&#xff0c;通过内容发布&#xff0c;为品牌广告和产品推广铺设了一条隐形高速公路。下面我们就详细解析一下软文发稿的优点和好处。 软文发稿帮助增…

AutoDL运行SCRFD

pycharm-autodl 1.租服务器 3080ti 镜像&#xff1a;PyTorch 1.10.0 Python 3.8(ubuntu20.04) Cuda 11.3 2.jupyterLab激活conda vim ~/.bashrc在最底部添加 source /root/miniconda3/etc/profile.d/conda.sh重启 bash激活conda conda activate base3.pycharm远程连接aut…

【嵌入式AI部署神经网络】STM32CubeIDE上部署神经网络之指纹识别(Pytorch)——篇一|环境搭建与模型初步部署篇

前言&#xff1a;本篇主要讲解搭建所需环境&#xff0c;以及基于pytorch框架在stm32cubeide上部署神经网络&#xff0c;部署神经网络到STM32单片机&#xff0c;本篇实现初步部署模型&#xff0c;没有加入训练集与验证集&#xff0c;将在第二篇加入。篇二详细讲解STM32CubeIDE上…

基于研发过程改进的质量度量模型

随着企业规模和产品项目的不断扩张&#xff0c;全面、精准、高效地保障产品质量成为组织的核心挑战。为了应对这一挑战&#xff0c;企业应寻求采用数字化和智能化的研发过程管理方案&#xff0c;以实现对研发活动的精细化量化控制&#xff0c;并利用数据分析工具深入洞察产品质…
最新文章