unittest 统计测试执行case总数,成功数量,失败数量,输出至文件,生成一个简易的html报告带饼图

这是一个Python的单元测试框架的示例代码,主要用于执行测试用例并生成测试报告。其中,通过unittest模块创建主测试类MainTestCase,并加载其他文件中的测试用例,统计用例的执行结果并将结果写入文件,最后生成一个简单的测试报告html页面。

在执行测试时,可以根据需要添加更多的测试文件和测试用例,在自定义CustomTextTestResult类中重写addSuccess和addFailure方法,获取用例的执行结果,并在统计成功和失败的用例数量时进行累加。将用例执行成功和失败的信息分别保存到success_cases和failure_cases列表中,最后将结果写入文件。

在生成测试报告时,利用HTML和CSS语言生成一个表格结构的页面,并将测试结果以文本和图表的形式展示出来。在页面中使用了一些JavaScript代码来计算成功和失败的百分比,并将其以饼状图的形式呈现出来。最终,将html代码写入到文件中,生成测试报告。

main.py

import unittest
import timeclass MyTestcase(unittest.TestCase):def test_1(self):print('main_test_1')self.assertEqual(2 - 2, 4)def test_2(self):print('main_test_2')self.assertEqual(2 - 2, 4)def test_3(self):print('test_3')time.sleep(2)self.assertEqual(2 + 2, 4)def test_4(self):print('test_4')self.assertEqual(2 - 2, 4)def test_5(self):print('test_5')self.assertEqual(2 + 2, 4)def test_6(self):print('test_6')self.assertEqual(2 + 2, 4)def test_7(self):print('test_7')self.assertEqual(2 + 2, 4)def test_8(self):print('test_8')self.assertEqual(2 + 3, 4)

 Testcase2.py

import unittestclass TestcaseGo(unittest.TestCase):def test_1(self):print('TestcaseGo_test_1')self.assertEqual(2 - 2, 4)def test_2(self):print('TestcaseGo_test_2')self.assertEqual(2 - 2, 4)def test_3(self):print('TestcaseGo_test_3')self.assertEqual(2 + 2, 4)def test_4(self):print('TestcaseGo_test_3')self.assertEqual(2 + 2, 4)def test_5(self):print('TestcaseGo_test_3')self.assertEqual(2 + 2, 4)def test_6(self):print('TestcaseGo_test_3')self.assertEqual(2 + 2, 4)def test_7(self):print('TestcaseGo_test_3')self.assertEqual(2 + 2, 4)def test_8(self):print('TestcaseGo_test_3')self.assertEqual(2 + 2, 4)def test_9(self):print('TestcaseGo_test_3')self.assertEqual(2 + 2, 4)def test_10(self):print('TestcaseGo_test_3')self.assertEqual(2 + 2, 4)def test_11(self):print('TestcaseGo_test_3')self.assertEqual(2 + 2, 4)def test_12(self):print('TestcaseGo_test_3')self.assertEqual(2 + 2, 4)def test_13(self):print('TestcaseGo_test_3')self.assertEqual(2 + 2, 4)def test_14(self):print('TestcaseGo_test_3')self.assertEqual(2 + 2, 4)def test_15(self):print('TestcaseGo_test_3')self.assertEqual(2 + 2, 4)def test_16(self):print('TestcaseGo_test_3')self.assertEqual(2 + 2, 4)def test_17(self):print('TestcaseGo_test_3')self.assertEqual(2 + 2, 4)def test_18(self):print('TestcaseGo_test_3')self.assertEqual(2 + 2, 4)def test_19(self):print('TestcaseGo_test_3')self.assertEqual(2 + 2, 4)def test_20(self):print('TestcaseGo_test_3')self.assertEqual(2 + 2, 4)def test_21(self):print('TestcaseGo_test_3')self.assertEqual(2 + 2, 4)def test_22(self):print('TestcaseGo_test_3')self.assertEqual(2 + 2, 4)def test_23(self):print('TestcaseGo_test_3')self.assertEqual(2 + 2, 4)def test_24(self):print('TestcaseGo_test_3')self.assertEqual(2 + 2, 4)

 run.py

import unittest
import datetime# 创建主测试类
class MainTestCase(unittest.TestCase):passif __name__ == '__main__':# 统计测试用例执行开始时间today1 = datetime.date.today()current_time1 = datetime.datetime.now().time()# print("执行开始时间:" + str(today1) +" "+ str(current_time1))# 创建测试加载器loader = unittest.TestLoader()# 加载其他Python文件中的测试用例并添加到主测试类中test_cases = [loader.loadTestsFromName('main.MyTestcase'),loader.loadTestsFromName('Testcase2.TestcaseGo')# 添加更多的测试文件和测试用例]suite = unittest.TestSuite(test_cases)suite.addTests(loader.loadTestsFromTestCase(MainTestCase))# 计算总用例数量total_count = suite.countTestCases()# 定义全局的成功、失败和总数计数变量success_count = 0failure_count = 0# 保存执行成功的用例和执行失败的用例success_cases = []failure_cases = []# 重写run()方法,获取用例的执行结果class CustomTextTestResult(unittest.TextTestResult):def addSuccess(self, test):global success_countsuccess_count += 1success_cases.append(str(test))super().addSuccess(test)def addFailure(self, test, err):global failure_countfailure_count += 1failure_cases.append(str(test))super().addFailure(test, err)# 创建测试运行器并运行测试runner = unittest.TextTestRunner(verbosity=2, resultclass=CustomTextTestResult)result = runner.run(suite)#  将结果写入文件,指定编码格式为UTF-8with open("test_result.txt", "w", encoding="utf-8") as file:file.write(f"成功的用例数量: {success_count}\n")file.write(f"失败的用例数量: {failure_count}\n")file.write(f"总用例数量: {total_count}\n")file.write("\n执行成功的用例:\n")for case in success_cases:file.write(case + "\n")file.write("\n执行失败的用例:\n")for case in failure_cases:file.write(case + "\n")print("测试结果已写入文件 test_result.txt")# print(total_count)# print(success_count)# print(failure_count)# print(success_cases)# print(failure_cases)# 生成一个简单的测试报告html页面def html_report(today1, current_time1, total_count, success_count, failure_count, success_cases, failure_cases):# 用例总数量、成功数量、失败数量、百分比Success_Rate = (success_count / total_count) * 100failure_Rate = (failure_count / total_count) * 100# print(int(Success_Rate))# print(int(failure_Rate))Success_Rate_text = str(int(Success_Rate)) + '%'failure_Rate_text = str(int(failure_Rate)) + '%'# print(Success_Rate_text)# print(failure_Rate_text)Success_Rate_text_b = '{'+str(Success_Rate)+'}%'# 拼接元素# text_content1 = "\n".join(success_cases)# text_content2 = "\n".join(failure_cases)test_cases_with_br = [f"{case}<br/>" for case in success_cases]# 将带有<br>标签的元素连接成一个字符串text_content1 = "".join(test_cases_with_br)test_cases_with_br = [f"{case}<br/>" for case in failure_cases]# 将带有<br>标签的元素连接成一个字符串text_content2 = "".join(test_cases_with_br)text_content1 = text_content1text_content2 = text_content2# 统计测试用例执行时间today2 = datetime.date.today()current_time2 = datetime.datetime.now().time()# print("执行结束时间:" + str(today2) + str(current_time2))time_diff = datetime.datetime.combine(datetime.date.min, current_time2) - datetime.datetime.combine(datetime.date.min, current_time1)strat_time = str(today1) + " " + str(current_time1)over_time = str(today2) + " " + str(current_time2)# 测试报告html源码report = """<!DOCTYPE html><html><head><meta charset="utf-8"><title>表格示例</title><style>""" \+ \""".status-labels {display: flex;justify-content: space-between;margin-bottom: 10px;}.status-label {display: flex;align-items: center;text-align: center;flex-direction: column;}.status-color {width: 20px;height: 20px;margin-right: 5px;align-items: center;}.pie-chart {width: 200px;height: 200px;border-radius: 50%;background: linear-gradient(to right, green 50%, red 0);transform: rotate(-90deg);margin: 20px auto;} """ + """th, td {{text-align: center;padding: 10px;vertical-align: top;}}table {{margin-left: auto;margin-right: auto;border-collapse: collapse;margin: auto;}}</style></head><body><br/><br/><table border="1"><thead><th>成功的用例数量</th><th>成功的用例占比</th><th>失败的用例数量</th><th>失败的用例占比</th><th>总用例数量</th></thead><tbody><tr><td>{success_count}</td><td>{Success_Rate_text}</td><td>{failure_count}</td><td>{failure_Rate_text}</td><td>{total_count}</td></tr></tbody></table><br/><table border="1"><thead><tr><th>执行开始时间</th><th>执行结束时间</th><th>执行总耗时</th></tr></thead><tbody><tr><td>{strat_time}</td><td>{over_time}</td><td>{time_diff}</td></tr></tbody></table><br/><br/><table  id="my-table"><thead><tr><th><div class="status-color" style="background-color: #336699;"></div></th><th>成功</th><th><div class="status-color" style="background-color: #bf242a;"></div></th><th>失败</th></tr></thead><tbody></tbody></table><div class="pie-chart"></div><br/><table border="1"><thead><tr><th>执行成功的用例</th><th>执行失败的用例</th></tr></thead><tbody><tr><td>{text_content1}</td><td>{text_content2}</td></tr></tbody></table><br/><br/>""".format(time_diff=time_diff, strat_time=strat_time, over_time=over_time, total_count=total_count,success_count=success_count, Success_Rate_text=Success_Rate_text, failure_count=failure_count,failure_Rate_text=failure_Rate_text, text_content1=text_content1, text_content2=text_content2) \+ \"""<script>// 获取饼图元素var pieChart = document.querySelector('.pie-chart');// 设置饼图的背景渐变色pieChart.style.background = `conic-gradient(#336699 ${Success_Rate_text}, #bf242a 0)`;</script>""".format(Success_Rate_text=Success_Rate_text_b) + """</body></html>"""# ${successPercentage}%# $81%print(report)with open("html_result.html", "w", encoding="utf-8") as file:file.write(report)print("测试报告生成成功!")html_report(today1, current_time1, total_count, success_count, failure_count, success_cases, failure_cases)# html_report(total_count, success_count, failure_count, success_cases, failure_cases)

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

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

相关文章

Qt6远程连接MySQL数据库(简单易上手版)

在对照文章开始操作之前&#xff0c;MySQL 和 Navicat 的安装配置要自己提前弄好。 步骤1&#xff1a; 在电脑桌面任务栏中的搜索框中输入 mysql&#xff0c;找到名为&#xff1a;MySQL 8.0 Command Line Client&#xff0c;然后打开。 步骤2&#xff1a; 输入密码后回车&a…

iPortal如何灵活设置用户名及密码的安全规则

作者&#xff1a;yx 目录 前言 一、配置文件介绍 1、<passwordRules>节点 注意事项&#xff1a; 2、<usernameRules>节点 二、应用实例 1、配置文件设置 2、验证扩展结果 三、结果展示 前言 SuperMap iPortal提供了扩展账户信息合规度校验规则的能力&#…

嵌入式Linux HID多指触控/触摸设备报表描述符

这里只做一下简单记录&#xff0c;更为详细的修改流程后续的文章再介绍。 报表描述符 0x05, 0x0D, // Usage Page (Digitizer) 0x09, 0x04, // Usage (Touch Screen) 0xA1, 0x01, // Collection (Application) 0x85, 0x01, // Report ID (1) 0…

正点原子嵌入式linux驱动开发——Linux WIFI驱动

WIFI的使用已经很常见了&#xff0c;手机、平板、汽车等等&#xff0c;虽然可以使用有线网络&#xff0c;但是有时候很多设备存在布线困难的情况&#xff0c;此时WIFI就是一个不错的选择。正点原子STM32MP1开发板支持USB和SDIO这两种接口的WIFI&#xff0c;本章就来学习一下如何…

npm的使用

package.json 快速生成package.json npm init -y “version”: “~1.1.0” 格式为&#xff1a;「主版本号. 次版本号. 修订号」。 修改主版本号是做了大的功能性的改动 修改次版本号是新增了新功能 修改修订号就是修复了一些bug dependencies "dependencies": {&…

阿里云服务器优惠购买和搭建网站全流程(图文教程)

阿里云服务器使用教程包括云服务器购买、云服务器配置选择、云服务器开通端口号、搭建网站所需Web环境、安装网站程序、域名解析到云服务器公网IP地址&#xff0c;最后网站上线全流程&#xff0c;新手站长xinshouzhanzhang.com分享阿里云服务器详细使用教程&#xff1a; 一&am…

Android 10.0 SystemUI启动流程

1、手机开机后&#xff0c;Android系统首先会创建一个Zygote&#xff08;核心进程&#xff09;。 2、由Zygote启动SystemServer。 3、SystemServer会启动系统运行所需的众多核心服务和普通服务、以及一些应用及数据。例如&#xff1a;SystemUI 启动就是从 SystemServer 里启动的…

特斯拉的利润率已陷入恶性循环

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 总结&#xff1a; &#xff08;1&#xff09;特斯拉(TSLA)第三季度疲弱的财务业绩表明&#xff0c;在当前环境下&#xff0c;投资特斯拉股票已不再是一项有保障的投资。 &#xff08;2&#xff09;正在进行的价格战可能会进…

私有化部署大模型:5个.Net开源项目

从零构建.Net前后端分离项目 今天一起盘点下&#xff0c;10月份推荐的5个.Net开源项目&#xff08;点击标题查看详情&#xff09;。 1、BootstrapBlazor企业级组件库&#xff1a;前端开发的革新之路 BootstrapBlazor是一个用于构建现代Web应用程序的开源框架&#xff0c;它基…

【数据结构】顺序表和链表

顺序表和链表 1.线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构&#xff0c;也就说是连…

毅速丨3D打印结合拓扑优化让轻量化制造更容易

轻量化可以减少产品的重量&#xff0c;提高产品的性能和效率&#xff0c;同时减少能源消耗和排放。尤其在航空航天、汽车制造造等行业对轻量化追求更高。当前&#xff0c;随着制造技术的发展&#xff0c;拓扑优化结合3D打印为轻量化制造带来的显著的优势正在逐渐凸显。 首先&am…

随身wifi编译Openwrt的ImmortalWrt分支

背景&#xff1a; 之前用酷安上下载的苏苏亮亮版友提供的Openwrt&#xff0c;在高通410棒子上刷机成功&#xff0c;但编译一直就没搞定。近期听说又出了个分支版本ImmortalWrt&#xff0c;刷了个版本&#xff0c;感觉界面清爽不少&#xff0c;内核也升级&#xff0c;遂打算搞定…

产品经理入门学习(二):产品经理问题思考维度

参考引用 黑马-产品经理入门基础课程 1. 抓住核心用户 1.1 为什么要抓住核心用户 什么是用户&#xff1f; 所有和产品有关系的群体就是用户&#xff0c;他们是一群既有共性&#xff0c;又有差异的群体组合 做产品为什么要了解用户&#xff1f; 了解用户的付费点、更好的优化产…

Linux Vim撤销和恢复撤销快捷键

使用 Vim 编辑文件内容时&#xff0c;经常会有如下 2 种需求&#xff1a; 对文件内容做了修改之后&#xff0c;却发现整个修改过程是错误或者没有必要的&#xff0c;想将文件恢复到修改之前的样子。 将文件内容恢复之后&#xff0c;经过仔细考虑&#xff0c;又感觉还是刚才修改…

python 机器学习 常用函数

一 np.random.randint "randint" 是 "random integer" 的缩写&#xff0c;表示生成随机整数。 np.random.randint 是 NumPy 库中的一个函数&#xff0c;用于生成随机整数。以下是该函数的一般语法&#xff1a; np.random.randint(low, high, size)其中…

tp6使用Spreadsheet报错:Class ‘PhpOffice\PhpSpreadsheet\Spreadsheet‘ not found

问题提示如下&#xff1a; 可能vendor下的 phpoffice是从别的项目拷贝过来的&#xff0c;所以咋都不行 解决办法是删掉vendor下的phpoffice&#xff0c;用composer重新下载 具体操作&#xff1a;1、在项目根目录下cmd执行下面这条命令 composer require phpoffice/phpspread…

【实践篇】一次Paas化热部署实践分享 | 京东云技术团队

前言 本文是早些年&#xff0c;Paas化刚刚提出不久时&#xff0c;基于部门内第一次Paas化热部署落地经验所写&#xff0c;主要内容是如何构建一些热部署代码以及一些避雷经验。 一、设计-领域模型设计 1.首先&#xff0c;确定领域服务所属的领域 2.其次&#xff0c;确定垂直…

【C++】STL容器适配器——stack类的使用指南(含代码使用)(17)

前言 大家好吖&#xff0c;欢迎来到 YY 滴C系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 目录 一、stack 类——基本介绍二、stack 类…

CreateProcess error=206, 文件名或扩展名太长

IDEA编译启动springboot项目时&#xff0c;提示这个异常&#xff0c;可以使用以下方式解决&#xff1a; 打开run-->edit configurations-->选择你启动报错的AppLication&#xff0c;如下图配置即可&#xff08;仅限于楼主的解决方式&#xff0c;不保证百分百覆盖&#x…

『亚马逊云科技产品测评』活动征文|如何搭建低成本亚马逊aws云服务器

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 0. 环境 win10 火狐浏览器 1. 登录 https://aws.amazon.com/cn/ ->…