Python自动化生成漂亮的测试报告

  • 📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢交流讨论:欢迎加入我们一起学习!
  • 📢资源分享:耗时200+小时精选的「软件测试」资料包
  • 📢 最困难的时候,也就是我们离成功不远的时候!


“ 运用Python的Unittest、数据驱动测试(DDT)、Excel、Jinja2和HTML技术,构建一个能够自动生成精美可视化测试报告的自动化测试框架”

思路流程

  1. 封装读取数据,让所有数据都能够再excel中填写,不再填写任何一行逻辑代码
  2. 通过unittest框架的discover()找到匹配的测试用例,由HTMLTestRunner的run()方法执行测试用例并生成最新的测试报告。
  3. 集成TestResult,增加一些获取数据逻辑,将数据封存输出,结合jinja2模板引擎,生成报告
  4. 将报告路径及收集的结果参数传给发送邮件,钉钉通知,企业微信通知的方法,再run用例结束后,自动发送数据到所需的位置
  5. 这里不展开对具体每一步得详细介绍,直接结果导向开始讲解。

1、数据驱动测试(DDT):以数据为驱动的智慧

为了匹配框架使用,重新写了类似ddt的装饰器,结合用例名称生成测试函数名称,这样就兼容了unittest的框架特性。核心代码:

def list_data(datas):""":param datas: Test data:return:"""def wrapper(func):setattr(func, "PARAMS", datas)return funcreturn wrapperdef yaml_data(file_path):""":param file_path:YAML file path:return:"""def wrapper(func):try:with open(file_path, "r", encoding="utf-8") as f:datas = yaml.load(f, Loader=yaml.FullLoader)except:with open(file_path, "r", encoding="gbk") as f:datas = yaml.load(f, Loader=yaml.FullLoader)setattr(func, "PARAMS", datas)return funcreturn wrapper

2.unittest框架妙用:高度封装精简脚本代码

将上述的装饰器装饰测试方法,通过多集成,、封装及反射捣鼓一波,最终的执行脚本代码,只有么关键是十来行了:

test_file = Config.TEST_CASE  # 获取 excel 文件路径
excel = DoExcel(test_file)test_case, databases, initialize_data, host = excel.get_excel_init_and_cases()@ddt
class TestProjectApi(unittest.TestCase):maxDiff = Noneaction = Action(initialize_data, databases)@classmethoddef setUpClass(cls) -> None:cls.action.load_modules_from_folder(extensions)def setUp(self) -> None:pass@list_data(test_case)def test_api(self, item):sheet, iid, condition, st, name, desc, method, expected = self.action.base_info(item)if self.action.is_run(condition):self.skipTest("这个测试用例听说泡面比较好吃,所以放弃执行了!!")regex, keys, deps, jp_dict, ex_request_data = self.action.extractor_info(item)self.action.pause_execution(st)self.action.exc_sql(item)if self.action.is_only_sql(method):self.skipTest("这条测试用例被 SQL 吃了,所以放弃执行了!!")# prepost_script = f"prepost_script_{sheet}_{iid}.py"# item = self.action.load_and_execute_script(Config.SCRIPTS_DIR, prepost_script, "setup", item)self.action.send_request(host, method, ex_request_data)self.action.analysis_response(sheet, iid, name, desc, regex, keys, deps, jp_dict)self.action.execute_validation(excel, sheet, iid, name, desc, expected)@classmethoddef tearDownClass(cls) -> None:excel.close_excel()

3.Excel王者:用例编写快速简单易过滤筛选

所有测试数据,填写在excel中,需要评审的时候,直接将excel丢给开发,一劳永逸,excel的强大,可不是三言两语能够解释清楚的,用例如下编写

"""封装读取excel“""
...
sheets = eval(self.get_excel_init().get(FieldNames.SHEETS))for sheet_name in sheets:sheet = self.wb[sheet_name]max_row = self.get_max_row(sheet)max_column = self.get_max_column(sheet)first_header = []for i in range(1, max_column + 1):first_header.append(sheet.cell(1, i).value)for i in range(2, max_row + 1):sub_data = {}for k in range(1, max_column + 1):sub_data[first_header[k - 1]] = sheet.cell(i, k).valuesub_data[FieldNames.SHEET] = sheet_nameyield sub_data
...


在这里插入图片描述
4.记录日志:整洁的日志记录

用例在运行过程中,日志信息的输出也是非常重要的一个环节,我们来看看日志的展示:


4. 生成美观的HTML报告:多种样式报告任君选择

重写优化了unittestReport的核心代码,测试结果不再是枯燥的一串文字,而是以漂亮的HTML展示。报告中的每个测试用例都得到了详尽的展示,包括输入数据、预期输出和实际结果,使得整个测试过程一目了然。
4.1 样式一

在这里插入图片描述
4.2 样式二


在这里插入图片描述
如上的报告,是不是很过瘾,KPI考核又得一分

4.3 Excel中测试用例结果回显记录


5. 集成通知机制:钉钉、企业微信、邮件

生成美观的测试报告,及时分享给团队也是很有逼格的。通过SMTP库、钉钉和企业微信等渠道,可以自动发送测试报告,还能够确保团队成员即时了解测试进展和结果,想发就发,想@就@。

邮件通知


钉钉通知

在这里插入图片描述
企业微信通知


闲话说一说:测试人只做测试专业的事就好(点点点…),不要整天为配置jenkins掉头发了,也不要一天到晚搜allure怎么配置,怎么修改啊,怎么又乱码不显示完整,又英文啥杂七杂八的而烦恼!!

最后的分享

如果你想学习自动化测试,那么下面这套视频应该会帮到你很多

如何逼自己1个月学完自动化测试,学完即就业,小白也能信手拈来,拿走不谢,允许白嫖....

最后我这里给你们分享一下我所积累和整理的一些文档和学习资料,有需要直接领取就可以了!


以上内容,对于软件测试的朋友来说应该是最全面最完整的备战仓库了,为了更好地整理每个模块,我也参考了很多网上的优质博文和项目,力求不漏掉每一个知识点,很多朋友靠着这些内容进行复习,拿到了BATJ等大厂的offer,这个仓库也已经帮助了很多的软件测试的学习者,希望也能帮助到你。

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

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

相关文章

五种多目标优化算法(MOJS、NSGA3、MOGWO、NSWOA、MOPSO)求解微电网多目标优化调度(MATLAB代码)

一、多目标优化算法简介 (1)多目标水母搜索算法MOJS 多目标优化算法:多目标水母搜索算法MOJS(提供MATLAB代码)_水母算法-CSDN博客 (2)NSGA3 NSGA-III求解微电网多目标优化调度(M…

acwing算法基础之数学知识--求卡特兰数

目录 1 基础知识2 模板3 工程化 1 基础知识 题目:给定n个0和n个1,它们将按照某种顺序排成长度为2n的序列,求它们能排成的所有序列中,能够满足任意前缀序列中0的个数都不少于1的个数的序列有多少个? 输出的答案对 1 0 …

【云原生 Prometheus篇】Prometheus的动态服务发现机制与认证配置

目录 一、Prometheus服务发现的方式1.1 基于文件的服务发现1.2 基于consul的服务发现1.3 基于 Kubernetes API 的服务发现1.3.1 简介1.3.2 基于Kurbernetes发现机制的部分配置参数 二、实例一:部署基于文件的服务发现2.1 创建用于服务发现的文件2.2 修改Prometheus的…

yo!这里是c++11重点新增特性介绍

目录 前言 列表初始化 { }初始化 initializer_list类 类型推导 auto decltype 范围for 右值引用与移动语义 左值引用和右值引用 移动语义 1.移动构造 2.移动赋值 3.stl容器相关更新 右值引用和万能引用 完美转发 关键字 default delete final和override …

西米支付:简单介绍一下支付公司的分账功能体系

随着互联网的普及和电子商务的快速发展,支付已经成为人们日常生活的重要组成部分。支付公司作为第三方支付平台,为消费者和商家提供了便捷、安全的支付方式。而在支付领域中,分账功能是一个非常重要的功能,它可以帮助企业实现资金…

C语言——从终端(键盘)将 5 个整数输入到数组 a 中,然后将 a 逆序复制到数组 b 中,并输出 b 中 各元素的值。

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int i;int a[5];int b[5];printf("输入5个整数&#xff1a;\n");for(i0;i<5;i){scanf("%d",&a[i]);}printf("数组b的元素值为&#xff1a;\n");for(i4;i>0;i--…

Javascript每天一道算法题(十五)——轮转数组_中等(一行解决轮转数组)

文章目录 1、问题2、示例3、解决方法&#xff08;1&#xff09;方法1——while遍历&#xff08;较为复杂&#xff0c;不推荐&#xff09;&#xff08;2&#xff09;方法2&#xff08;直接截取后插入&#xff0c;推荐&#xff09;&#xff08;3&#xff09;方法3——优化方法2&a…

jQuery_03 dom对象和jQuery对象的互相转换

dom对象和jQuery对象 dom对象 jQuery对象 在一个文件中同时存在两种对象 dom对象: 通过js中的document对象获取的对象 或者创建的对象 jQuery对象: 通过jQuery中的函数获取的对象。 为什么使用dom或jQuery对象呢&#xff1f; 目的是 要使用dom对象的函数或者属性 以及呢 要…

python -opencv 轮廓检测(多边形,外接矩形,外接圆)

python -opencv 轮廓检测(多边形&#xff0c;外接矩形&#xff0c;外接圆) 边缘检测步骤: 第一步&#xff1a;读取图像为灰度图 第二步&#xff1a;进行二值化处理 第三步&#xff1a;使用cv2.findContours对二值化图像提取轮廓 第三步&#xff1a;将轮廓绘制到图中 代码如下…

Hibernate的三种状态

1.瞬时状态(Transient) 通过new创建对象后&#xff0c;对象并没有立刻持久化&#xff0c;他并未对数据库中的数据有任何的关联&#xff0c;此时java对象的状态为瞬时状态&#xff0c;Session对于瞬时状态的java对象是一无所知的&#xff0c;当对象不再被其他对象引用时&#xf…

【TL431+场效应管组成过压保护电路】2022-3-22

缘由这个稳压三极管是构成的电路是起到保护的作用吗&#xff1f;-硬件开发-CSDN问答

HTML5+ API 爬坑记录

背景: 有个比较早些使用5开发的项目, 最近两天反馈了一些问题, 解决过程在此记录; 坑1: plus.gallery.pick 选择图片没有进入回调 HTML5 API Reference 在 联想小新 平板电脑上选择相册图片进行上传时, 打开相册瞬间 应用会自动重启, 相册倒是有打开, 不过应用重启了, 导…

[原创](免改BIOS)使用Clover升级旧电脑-(高阶玩法)让固态硬盘内置Win11 PE启动系统

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XXQQ: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、Delphi…

【算法专题】滑动窗口—无重复字符的最长子串

力扣题目链接&#xff1a;无重复字符的最长子串 一、题目解析 二、算法原理 解法一&#xff1a;暴力解法&#xff08;时间复杂度最坏&#xff1a;O(N)&#xff09; 从每一个位置开始往后枚举&#xff0c;在往后寻找无重复最长子串时&#xff0c;可以利用哈希表来统计字符出现…

手机APP-MCP走蓝牙无线遥控智能安全帽~执法记录仪~拍照录像,并可做基础的配置,例如修改服务器IP以及配置WiFi等

手机APP-MCP走蓝牙无线遥控智能安全帽~执法记录仪~拍照录像,并可做基础的配置,例如修改服务器IP以及配置WiFi等 手机APP-MCP走蓝牙无线遥控智能安全帽~执法记录仪~拍照录像,并可做基础的配置,例如修改服务器IP以及配置WiFi等&#xff0c; AIoT万物智联&#xff0c;智能安全帽…

JVM之jvisualvm多合一故障处理工具

jvisualvm多合一故障处理工具 1、visualvm介绍 VisualVM是一款免费的&#xff0c;集成了多个 JDK 命令行工具的可视化工具&#xff0c;它能为您提供强大的分析能力&#xff0c;对 Java 应 用程序做性能分析和调优。这些功能包括生成和分析海量数据、跟踪内存泄漏、监控垃圾回…

SpringBoot:异步任务基础与源码剖析

官网文档&#xff1a;How To Do Async in Spring | Baeldung。 Async注解 Spring框架基于Async注解提供了对异步执行流程的支持。 最简单的例子是&#xff1a;使用Async注解修饰一个方法&#xff0c;那么这个方法将在一个单独的线程中被执行&#xff0c;即&#xff1a;从同步执…

系列六、Spring整合单元测试

一、概述 Spring中获取bean最常见的方式是通过ClassPathXmlApplicationContext 或者 AnnotationConfigApplicationContext的getBean()方式获取bean&#xff0c;那么在Spring中如何像在SpringBoot中直接一个类上添加个SpringBootTest注解&#xff0c;即可在类中注入自己想要测试…

java反序列化漏洞详解

java反序列化漏洞 文章目录 java反序列化漏洞漏洞原理漏洞评级漏洞危害漏洞验证漏洞防御典型案例 漏洞原理 由于java开发人员在编写代码时重写了 readObject 方法&#xff0c;在重写的 readObject 方法中调用其他函数实现链式调用最终调用到了危险函数&#xff0c;从而形成反序…

【C++】泛型编程 ⑮ ( 类模板示例 - 数组类模板 | 自定义类中持有指针成员变量 )

文章目录 一、支持 数组类模板 存储的 自定义类1、可拷贝和可打印的自定义类2、改进方向3、改进方向 - 构造函数4、改进方向 - 析构函数5、改进方向 - 重载左移运算符6、改进方向 - 重载拷贝构造函数 和 等号运算符 二、代码示例1、Array.h 头文件2、Array.cpp 代码文件3、Test…