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.hqwc.cn/news/162741.html

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

相关文章

RISC-V处理器设计(四)—— Verilog 代码设计

一、前言 从6月底刚开始接触 risc-v 架构&#xff0c;到现在完成了一个 risc-v cpu 的设计&#xff0c;并且成功移植了 rt-thread nano 到本 cpu 上运行&#xff0c;中间经过了 4个多月的时间&#xff0c;遇到了数不清的问题&#xff0c;也想过放弃&#xff0c;但好在最后还是…

RT-Thread 10. 使用keil4编译GD32F450

1. 修改keil路径 2.增加MCU型号宏定义 3. 在ENV界面输入 scons -c scons --targetmdk44. 编译 scons --verbose提示错误 Warning: L6310W: Unable to find ARM libraries. Error: L6411E: No compatible library exists with a definition of startup symbol __main. Finish…

VSCode 连接不上 debian 的问题

之前一台笔记本上安装了 debian12&#xff0c;当时用 vscode 是可以连接上的&#xff0c;但今天连接突然就失败了&#xff0c;失败信息是这样的&#xff1a; 查看失败信息 因为 debian 是自动获取 ip 地址的&#xff0c;以前能连接上时&#xff0c;ip 地址是 104&#xff0c;然…

思维模型 首因效应

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。先入为主&#xff0c;一见钟情。 1 首因效应的应用 1.1 面试中的首因效应 小李是一名应届毕业生&#xff0c;他准备参加一家知名互联网公司的面试。在面试前&#xff0c;他做了充分的准备…

“第六十二天”

新东西 %[^\n] 这个题测试的时候不知道哪里为什么一直错一个。 int main() {char a[81] { 0 };fgets(a, 80, stdin);int i 0;int n strlen(a);for(i0;i<n;i){if ((a[i] > a && a[i] < y) || (a[i] > A && a[i] < Y))a[i] 1;else if (a[i…

3BHE022291R0101 PCD230A 专注于制造卓越人工智能

3BHE022291R0101 PCD230A 专注于制造卓越人工智能 BISTelligence是BISTel的一个分支&#xff0c;BISTel是为全球半导体和FPD制造商提供工程和软件自动化产品的领先供应商。半导体产品集团上个月被卖给了新思科技。在出售给Synopsys之后&#xff0c;Bisetlliegnce成立了两个部门…

Centos 7.x上利用certbot申请Let‘s Encrypt的SSH证书(HTTPS证书)

目录 01-安装Certbot02-在网站的根目录依次新建文件夹.well-known和acme-challenge03-申请证书 要在CentOS 7.x上为域名申请Let’s Encrypt证书&#xff0c;你可以使用Certbot工具&#xff0c;它是一个自动化证书颁发工具&#xff0c;用于管理Let’s Encrypt证书。以下是在Cent…

k8s提交spark应用消费kafka数据写入elasticsearch7

一、k8s集群环境 k8s 1.23版本&#xff0c;三个节点&#xff0c;容器运行时使用docker。 spark版本时3.3.3 k8s部署单节点的zookeeper、kafka、elasticsearch7 二、spark源码 https://download.csdn.net/download/TT1024167802/88509398 命令行提交方式 /opt/module/spark…

linux入门到地狱

linux—001入门 IT圈必备(前端工作者用的比较少) 老旧电脑跑linux不容易卡 我代码没保存windows闪退&#xff0c;僵停(vs2019卡掉线)&#xff0c;重启更新,占用cpu内存服务报错pip各种bug 出来生态环境友好其他的全是bug(bug时间成本超过了windows快捷友好生态) 那就说明wind…

使用pytorch处理自己的数据集

目录 1 返回本地文件中的数据集 2 根据当前已有的数据集创建每一个样本数据对应的标签 3 tensorboard的使用 4 transforms处理数据 tranfroms.Totensor的使用 transforms.Normalize的使用 transforms.Resize的使用 transforms.Compose使用 5 dataset_transforms使用 1 返回本地…

使用VSCODE链接Anaconda

打代码还是在VSCODE里得劲 所以得想个办法在VSCODE里运行py文件 一开始在插件商店寻找插件 但是没有发现什么有效果的 幸运的是VSCODE支持自己选择Python的编译器 打开VSCODE 按住CtrlShiftP 输入Select Interpreter 如果电脑已经安装上了Python的环境 VSCODE会默认选择普通…

字符型液晶显示器LCD 1602的显示控制(Keil+Proteus)

前言 趁机把LCD 1602的实验完成了&#xff0c;那个电路图有几个地方没弄懂&#xff0c;但是去掉也没有报错&#xff0c;就没管了。 LCD1602_百度百科 (baidu.com)https://baike.baidu.com/item/LCD1602/6014393?frge_ala LCD1602液晶显示屏通过电压来改变填充在两块平行板之…