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 pytestdef 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 = yieldreport = 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://xiahunao.cn/news/2981677.html

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

相关文章

AGON爱攻×保时捷设计第三代OLED超宽屏PD49震撼上市!

一次科技与艺术的审美共振&#xff0c;开启多维度、沉浸式感官之旅&#xff01; 科技与艺术的融合&#xff0c;引领着美学新时代。4月22日&#xff0c;全球电竞显示器销量冠军品牌AGON爱攻与欧洲最具创造力的设计工作室保时捷设计再度携手&#xff0c;重磅推出AGON爱攻保时捷设…

比亚迪唐EV和唐DM-p荣耀版上市,成为新能源汽车市场中的佼佼者!

随着环保理念的深入人心&#xff0c;新能源汽车市场正迎来前所未有的发展机遇。在这个变革的浪潮中&#xff0c;唐EV和唐DM-p荣耀版的上市无疑为市场注入了新的活力。它们凭借先进的技术、卓越的性能以及豪华配置&#xff0c;成为了新能源汽车市场中的佼佼者。然而&#xff0c;…

数据结构(七)---树

目录 一.树的基本概念 二.树的性质 三.二叉树 1.二叉树的基本概念 2.特殊的二叉树 &#xff08;1&#xff09;满二叉树 &#xff08;2&#xff09;完全二叉树 &#xff08;3&#xff09;二叉排序树 &#xff08;4&#xff09;平衡二叉树 3.二叉树的性质 4.完全二叉树…

Maven:配置与使用指南1

https://mvnrepository.com Maven 1.maven简介 不同模块的jar包以及同时设计的功能的微小变化版本&#xff1b; 真实的开发环境&#xff1a;我们将我们的源代码在服务器上重新编译重新打包&#xff0c;工程升级维护过程繁琐 1.Maven是一个项目管理工具&#xff0c;将项目开…

WebSocket的原理、作用、API、常见注解和生命周期的简单介绍,附带SpringBoot示例

文章目录 原理作用客户端 API服务端 API生命周期常见注解SpringBoot示例 WebSocket是一种 通信协议 &#xff0c;它在 客户端和服务器之间建立了一个双向通信的网络连接 。WebSocket是一种基于TCP连接上进行 全双工通信 的 协议 。 WebSocket允许客户端和服务器在 单个TCP连接上…

【音视频服务】VoIP 推送转 APNs 推送如何设置?

融云控制台 VoIP 设置入口&#xff1a; VoIP 设置 功能说明 针对苹果官方要求收到 VoIP 推送后必须通知给系统 CallKit 框架&#xff0c;如果收到 VoIP 推送后没有报告给 CallKit&#xff0c;iOS 将终止该应用程序&#xff08;目前只影响用 Xcode 11 打包的 App 运行在 iOS 13 …

Springboot实现国际化以及部署Linux不生效问题

1、在application.properties 添加以下配置&#xff1a; #国际化配置 spring.messages.basenamei18n/messages/messages spring.messages.fallback-to-system-localefalse 2、添加配置文件在 resources目录下 如下图所示&#xff1a; 这个国际化文件命名有个坑&#xff0c;必须…

伙伴匹配(后端)-- 前端初始化

文章目录 用脚手架初始化项目安装依赖启动项目image.png整合组件库Vant 用脚手架初始化项目 Vite官网&#xff1a;https://www.vitejs.net/guide/#scaffolding-your-first-vite-project cmd切换到项目目录下初始化项目 npm init vitelatest安装依赖 npm install启动项目 整…

Axure实现tab页面切换功能

1. 实现效果 2. 实现原理 创建两个标签&#xff0c;并实现点击时选中状态点击时&#xff0c;设置面板状态 3. 实现步骤 3.1 实现可切换的标签 在页面上拖拽两个矩形作为两个tab标签&#xff0c;并命名 tab1 和 tab2 设置每个矩形的边框显示&#xff0c;只显示下边框即可 …

2万字长文:Docker必知必会系列

安装docker 安装&#xff1a; Docker 分为 CE 和 EE 两大版本。CE 即社区版&#xff08;免费&#xff0c;支持周期 7 个月&#xff09;&#xff0c;EE 即企业版&#xff0c;强调安全&#xff0c;付费使用&#xff0c;支持周期 24 个月。 **Docker CE 分为 **stable&grav…

Python | Leetcode Python题解之第46题全排列

题目&#xff1a; 题解&#xff1a; class Solution:def permute(self, nums):""":type nums: List[int]:rtype: List[List[int]]"""def backtrack(first 0):# 所有数都填完了if first n: res.append(nums[:])for i in range(first, n):# 动…

抽象工厂模式设计实验

【实验内容】 楚锋软件公司欲开发一套界面皮肤库&#xff0c;可以对 Java 桌面软件进行界面美化。为了保护版权&#xff0c;该皮肤库源代码不打算公开&#xff0c;而只向用户提供已打包为 jar 文件的 class 字节码文件。用户在使用时可以通过菜单来选择皮肤&#xff0c;不同的…

【C++】C++的四种类型转换

一、C语言中的类型转换 在C语言中有两种类型转换&#xff0c;隐式类型转换和显示类型转换。 如果赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型不匹配&#xff0c;或者返回值类型与接收返回值类型不一致时&#xff0c;就需要发生类型转化。 隐式类型转换&#…

Unity系统学习笔记

文章目录 1.基础组件的认识1.0.组件继承关系图1.1.项目工程文件结构&#xff0c;各个文件夹都是做什么的&#xff1f;1.2.物体变化组件1.2.3.三维向量表示方向1.2.4.移动物体位置附录&#xff1a;使用变换组件实现物体WASD移动 1.3.游戏物体和组件的显示和禁用1.3.1.界面上的操…

C语言入门课程学习笔记2

C语言入门课程学习笔记2 第8课 - 四则运算与关系运算第9课 - 逻辑运算与位运算第10课 - 深度剖析位运算第11课 - 程序中的选择结构 本文学习自狄泰软件学院 唐佐林老师的 C语言入门课程&#xff0c;图片全部来源于课程PPT&#xff0c;仅用于个人学习记录 第8课 - 四则运算与关系…

共享汽车管理|基于SprinBoot+vue的共享汽车管理系统(源码+数据库+文档)

共享汽车管理目录 基于SprinBootvue的共享汽车管理系统 一、前言 二、系统设计 三、系统功能设计 1 管理员模块的实现 1.1 用户信息管理 1.2 投放地区管理 1.3 汽车信息管理 1.4 汽车入库管理 2 用户模块的实现 2.1 汽车投放 2.2 使用订单管理 2.3 汽车归还 四、…

为AI电脑生态注入强悍动力,安耐美PlatiGemini 1200W高性能电源

在DIY攒机的过程中&#xff0c;电源是非常重要的一环&#xff0c;现在高性能的硬件功耗往往很高&#xff0c;因此一款优秀的电源整个系统稳定运行的基石。最近&#xff0c;我发现一款由安耐美&#xff08;Enermax&#xff09;推出的PlatiGemini 1200W电源&#xff0c;它不仅满足…

刷代码随想录有感(45):二叉树的最大深度

题干&#xff1a; 力扣这里给了定义&#xff1a;二叉树的最大深度指的是从根节点开始&#xff0c;到最远叶子所经过的节点数。 代码&#xff1a; class Solution {//递归实现 public:int maxDepth(TreeNode* root) {if(root NULL)return NULL;int leftheight maxDepth(root…

离散数学之命题逻辑思维导图+大纲笔记(预习、期末复习,考研,)

大纲笔记&#xff1a; 命题逻辑的基本概念 命题与联结词 命题 命题是推理的基本单位 真命题&#xff0c;假命题 特征 陈述句 唯一的真值 是非真即假的陈述句 非命题 疑问句 祈使句 可真可假 悖论 模糊性 三个基本概念 复合命题 真值取决于原子命题的值和逻辑联结词 原子命题 逻…

【leetcode面试经典150题】71. 对称二叉树(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…