pytest进阶之html测试报告
pytest进阶之html测试报告
目录:导读
前言
pytest-html生成报告
安装
生成报告
效果
错误用例截图
添加描述
小结
allure2生成报告
安装allure
安装pytest-allure-adaptor插件
生成xml格式报告
添加环境变量
运行allure生成报告
效果
总结
前言
Pytest系列已经写了几篇文章了,也不知道对多少人有帮助,总之对于我自己来说该掌握的都已经掌握了,那么今天我们再来说说pytest如何生成一个完整的html测试报告,让你在吹牛逼的路上再多一份资本!废话不多说,进入正题!(咋就莫名其妙想起这句话了呢, 估计看文章看多了,貌似挺多人用这句话过度……)
使用pytest-html插件生成测试报告
pytest-html生成报告
pytest是借助pytest-html插件生成测试测试报告, 不用自己编写生成报告代码。github源码地址 https://github.com/pytest-dev/pytest-html
安装
与安装python第三方库一样使用pip命令->pip install pytest-html,我这边是已经安装好了的,所以你看到的输出信息可能和我的不太一样

验证安装
使用pip list 可以查看是否有pytest-html,如果有表示已经安装成功
生成报告
使用命令 pytest --html=reportname.html (这里的参数是测试报告的名称,注意前面是两个横杠)我们尝试一下 !
效果

可以看到这个报告还是挺不错的,比unittest那个报告炫了很多!每一个case都可点开查看具体的运行信息! 好了,大家可能发现你生成的测试报告和我这个貌似有哪里不一样?是的,没错,我这里多了描述信息你那里好像不存在,先不急。
错误用例截图
通常,我们希望测试用例失败的时候能够截取一张图片,这样我们可以知道哪里出了问题或者出现问题的大概位置,方便我们调试代码或者分析软件的bug,那么又该如何在这一份报告里面插入截图呢?
上篇文章我们提到了conftest.py文件,那么我们现在就可以把失败截图的代码放到这个文件里面了(为什么放在这里,我想学会的同学应该知道,不知道的看前面文章吧),看具体代码!
import pytest
from selenium import webdriver
from py._xmlgen import html_driver = None
# 测试失败时添加截图和测试用例描述(用例的注释信息)@pytest.mark.hookwrapper
def pytest_runtest_makereport(item):"""当测试失败的时候,自动截图,展示到html报告中"""pytest_html = item.config.pluginmanager.getplugin('html')outcome = yieldreport = outcome.get_result()extra = getattr(report, 'extra', [])if report.when == 'call' or report.when == "setup":xfail = hasattr(report, 'wasxfail')if (report.skipped and xfail) or (report.failed and not xfail):file_name = report.nodeid.replace("::", "_")+".png"screen_img = _capture_screenshot()if file_name:html = '<div><img src="data:image/png;base64,%s" alt="screenshot" style="width:600px;height:300px;" ' \'onclick="window.open(this.src)" align="right"/></div>' % screen_imgextra.append(pytest_html.extras.html(html))report.extra = extradef _capture_screenshot():'''截图保存为base64'''return _driver.get_screenshot_as_base64()@pytest.fixture(scope='module')
def driver():global _driverprint('------------open browser------------')_driver = webdriver.Firefox()yield _driverprint('------------close browser------------')_driver.quit()
注意这个模块from py._xmlgen import html,我们网上看到大多数是使用 from py.xml import html,我使用这个模块时会报错,所以换成现在这个模块了(估计和python版本有关系,我用的3,3估计没有这个模块了)。
好了, 现在我们在来执行一下我们的测试用例

没错,失败用例有了图片了,而且很清晰。我用例断言的是登录失败时的错误提示信息是否正确(为了演示,我把用例里面期望值改了),实际提示信息是‘账号和密码错误’和‘请输入账号’,但是我们期望的是‘账号和密码错’和‘请输入账’,很明显我们的软件是存在bug的,一目了然!是不是很实用……接下来我们再来看看如何添加描述信息的。
添加描述
正常情况下,我们的报告是没有描述信息这一项的,所以我们只能通过添加代码来实现了(描述信息就是我们用例函数上方的注释信息)。通过官方的文档说明,我们知道是可以添加和删除报告的table表的
我们在上面的代码 report.extra = extra 后面添加这样一行代码
report.description = str(item.function.__doc__)
并在文件中添加这两个方法
@pytest.mark.optionalhook
def pytest_html_results_table_header(cells):cells.insert(1, html.th('Description'))@pytest.mark.optionalhook
def pytest_html_results_table_row(report, cells):cells.insert(1, html.td(report.description))
我们可以试着再次运行我们的测试用例,看看报告效果应该就和我的一样了。
小结
大家可以把代码写一遍然后自己试试,是否会得到我们想要的报告,其实这篇文章并没有详细讲解代码编写过程,也没有详细说明哪段代码是用来干什么的,因为这些代码就是个模板,也是通用的,所以大家保存下来即可,以后编写项目的时候直接哪里用就可以了(作为一个python程序员,终极思想就是能简化就简化,能简单写代码就简单写代码,能copy就copy,嗯,就是这样!)
allure2生成报告
这个就厉害了,我本人觉得这个工具真的是超级牛逼,生成的报告也超级炫酷。实际上它是一个report框架,支持各种语言的各种测试框架,而且可以集成到jenkins上使用
安装allure
github上下载最新版本https://github.com/allure-framework/allure2/releases

解压
下载完后解压到我们项目根目录下,也就是需要运行pytest代码的目录下。下面是我的项目根目录
modify by linux超 at 2019.08.30
可以解压到任意目录

安装pytest-allure-adaptor插件
pip install allure-pytest
生成xml格式报告
在我们需要运行用例的目录下执行 pytest -s -q --alluredir ./report(当前目录下的report文件夹,这个文件夹名字,可以自己指定位置,不指定默认生成在当前目录下)
添加环境变量
把allure-2.10.0\bin目录添加到环境变量,当然你也可以不添加,我们添加环境变量的目的是可以在任意位置执行bin目录下allure.bat脚本
运行allure生成报告
前面我们已经通过这个命令pytest -s -q --alluredir report 生成了xml格式的报告,保存在了report下,接着我们执行命令allure generate report/ -o report/html,第一个report就是指定之前xml报告的目录,后面的report也可以自己指定在哪个目录生成最终的html报告,我们按下面的路径找到我们的报告,看下生成的报告效果
modify by linux超 at 2019.08.30
注意:report目录不能相同,必须指定一个空的目录生成最后的html报告

效果

这个报告看起来真的很炫酷,而且左边的菜单都可以点开,里面记录了们的用例执行的情况,好了大家试试吧!
总结
主要内容
1.pytest-html插件生成测试报告,及用例失败时如何截取图片添加到报告里,如何添加用例描述到报告里
2.如何使用allure生成测试报告
以上两种生成测试报告的方式,希望可以帮到大家,并把这些技能运用到我们实际的工作当中!
写在最后
如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!
看到这篇文章的人有觉得我的理解有误的地方,也欢迎评论和探讨~
你也可以加入下方的的群聊去和同行大神交流切磋
相关文章:
pytest进阶之html测试报告
pytest进阶之html测试报告 目录:导读 前言 pytest-html生成报告 安装 生成报告 效果 错误用例截图 添加描述 小结 allure2生成报告 安装allure 安装pytest-allure-adaptor插件 生成xml格式报告 添加环境变量 运行allure生成报告 效果 总结 前言 …...
劳特巴赫仿真测试工具Trace32的基本使用(cmm文件)
劳特巴赫 Trace32 调试使用教程 使用PRACTICE 脚本(.cmm) 在TRACE32 中使用PRACTICE 脚本(*.cmm)将帮助你: 在调试器启动时立即执行命令根据您的项目需求自定义TRACE32PowerView用户界面加载应用程序或符号使调试操作具有可重复性, 并可用于验证目的和回归测试 自动启动脚本…...
盘点四种自动化测试模型实例及优缺点
一,线性测试 1.概念: 通过录制或编写对应应用程序的操作步骤产生的线性脚本。单纯的来模拟用户完整的操作场景。 (操作,重复操作,数据)都混合在一起。 2.优点: 每个脚本相对独立࿰…...
【论文阅读】SCRFD: Sample and Computation 重分配的高效人脸检测
原始题目Sample and Computation Redistribution for Efficient Face Detection中文名称采样和计算 重分配的 高效人脸检测发表时间2021年5月10日平台ICLR-2022来源Imperial College, InsightFace文章链接https://arxiv.org/pdf/2105.04714.pdf开源代码官方实现&…...
Debezium报错处理系列之四十七:Read only connection requires GTID_MODE to be ON
Debezium报错处理系列之四十七:Caused by: java.lang.UnsupportedOperationException: Read only connection requires GTID_MODE to be ON 一、完整报错二、错误原因三、错误解决方法Debezium报错处理系列一:The db history topic is missing. Debezium报错处理系列二:Make…...
关于float(b)类型数据类型的精度的学习
Questions: 将表中的某字段类型设计成float(2)后,向其插入数据93.5后,最好结果却变成了90?这是为什么? 关于这个问题 官方帮助文档(Oracle Online Help )的说明如下: FLOAT(b) specifies a floa…...
哪种类型的网络安全风险需要进行渗透测试?
网络在给我们带来无限方便的同时,也隐藏着无数危机。2022年网络攻击造成的损失创下新的历史记录,根据Cybersecurity Ventures最新发布的“2022年网络犯罪报告”,预计2023年网络犯罪将给全世界造成8万亿美元的损失。同时在市场和以网络安全法为…...
ur3+robotiq ft sensor+robotiq 2f 140配置gazebo仿真环境
ur3robotiq ft sensorrobotiq 2f 140配置gazebo仿真环境 搭建环境: ubuntu: 20.04 ros: Nonetic sensor: robotiq_ft300 gripper: robotiq_2f_140_gripper UR: UR3 通过上一篇博客配置好ur3、力传感器和robotiq夹爪的rviz仿真环境后,现在来配置一下对…...
Vue3后台管理系统(四)SVG图标
目录 一、安装 vite-plugin-svg-icons 二、创建图标文件夹 三、main.ts 引入注册脚本 四、vite.config.ts 插件配置 五、TypeScript支持 六、组件封装 七、使用 Element Plus 图标库往往满足不了实际开发需求,可以引用和使用第三方例如 iconfont 的图标&…...
【收集】2023年顶会accepted papers list(NeurIPS/CVPR/ICML/ICLR/ECCV/AAAI/IJCAI/WWW...)
from: https://blog.csdn.net/lijinde07/article/details/128024833 顺便看看 评审意见是怎样的 Accepted papers list(2022.11.24) AAAI 2023 :录取结果已出 **ICLR 2023 ** :https://openreview.net/group?idICLR…...
空闲态LTE到NR重选优先级介绍
SIB24消息包含小区重选时5G邻区信息(NR neighbor cell information for cell reselection)。 终端注册在LTE网络,如果网络不上报SIB24消息,则终端不会重选到5G网络。 针对这种网络不上报SIB24的场景,终端可以做特殊处理,强制执行LTE到5G的重选流程。 终端网络制式设置为不…...
数据结构与算法:Map和Set的使用
1.搜索树 1.定义 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子…...
C语言——动态内存管理
目录0. 思维导图:1. 为什么存在动态内存分配2. 动态内存函数介绍2.1 malloc和free2.2 calloc2.3 realloc3. 常见的动态内存错误3.1 对NULL指针的解引用操作3.2 对动态内存开辟的空间越界访问3.3 对非动态开辟内存使用free释放3.4 使用free释放一块动态开辟内存的一部…...
Docker安装Grafana
文章目录Grafana介绍拉取镜像准备相关挂载目录及文件启动容器访问测试添加 Prometheus 数据源常见问题看板配置Grafana介绍 上篇博客介绍了prometheus的安装: Docker部署Prometheus 在获取应用或基础设施运行状态、资源使用情况,以及服务运行状态等直观…...
数据结构(四):树、二叉树、二叉搜索树
数据结构(四)一、树1.树结构2.树的常用术语二、二叉树1.什么是二叉树2.二叉树的数据存储(1)使用数组存储(2)使用链表存储三、二叉搜索树1.这是什么东西2.封装二叉搜索树:结构搭建3. insert插入节…...
040、动态规划基本技巧(labuladong)
动态规划基本技巧 一、动态规划解题套路框架 基于labuladong的算法网站,动态规划解题套路框架; 1、基本介绍 基本套路框架: 动态规划问题的一般形式是求最值;核心如下: 穷举;明确base case;…...
html笔记(一)
一、html简介 什么是HTML? Hyper Text Markup Language 超文本标记语言 超文本?超级文本,例如流媒体,声音、视频、图片等。 标记语言?这种语言是由大量的标签组成。 任何一个标签都有开始标签和结束标签&…...
索引的情况
select * from A left join B on A.c B.c where A.employee_id 3 1.一句sql中 是可能走多次索引的,具体的 一般 表连接 ,或者说生成临时表的时候,会走索引 然后条件过滤的时候也会走索引,具体的 还是要具体分析 2.表连接 字段…...
Verilog 学习第五节(串口发送部分)
小梅哥串口部分学习part1 串口通信发送原理串口通信发送的Verilog设计与调试串口发送应用之发送数据串口发送应用之采用状态机实现多字节数据发送串口通信发送原理 1:串口通信模块设计的目的是用来发送数据的,因此需要有一个数据输入端口 2:…...
破解遗留系统快速重构的5步心法(附实例)
前两天和一个架构师朋友闲聊,说到了 「重构」 这个话题,他们公司早年间上线的项目系统,因一直没专人在演进过程中为代码质量负责,导致现在代码越来越混乱,逐渐堆积成“屎山”,目前的维护成本已远高于重新开…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...
R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...
stm32进入Infinite_Loop原因(因为有系统中断函数未自定义实现)
这是系统中断服务程序的默认处理汇编函数,如果我们没有定义实现某个中断函数,那么当stm32产生了该中断时,就会默认跑这里来了,所以我们打开了什么中断,一定要记得实现对应的系统中断函数,否则会进来一直循环…...
C++11 constexpr和字面类型:从入门到精通
文章目录 引言一、constexpr的基本概念与使用1.1 constexpr的定义与作用1.2 constexpr变量1.3 constexpr函数1.4 constexpr在类构造函数中的应用1.5 constexpr的优势 二、字面类型的基本概念与使用2.1 字面类型的定义与作用2.2 字面类型的应用场景2.2.1 常量定义2.2.2 模板参数…...
