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

news2024/11/26 9:31:58

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

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

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

main.py

import unittest
import time


class 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 unittest

class 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):
    pass


if __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 = 0
    failure_count = 0

    # 保存执行成功的用例和执行失败的用例
    success_cases = []
    failure_cases = []


    # 重写run()方法,获取用例的执行结果
    class CustomTextTestResult(unittest.TextTestResult):
        def addSuccess(self, test):
            global success_count
            success_count += 1
            success_cases.append(str(test))
            super().addSuccess(test)

        def addFailure(self, test, err):
            global failure_count
            failure_count += 1
            failure_cases.append(str(test))
            super().addFailure(test, err)


    # 创建测试运行器并运行测试
    runner = unittest.TextTestRunner(verbosity=2, resultclass=CustomTextTestResult)
    result = runner.run(suite)

    #  将结果写入文件,指定编码格式为UTF-8
    with 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) * 100
        failure_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_content1
        text_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.coloradmin.cn/o/1175869.html

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

相关文章

应用开发平台集成表单设计器系列之1——技术预研与技术选型

背景 表单的可视化配置&#xff0c;是低代码开发平台的重要组成部分。平台已实现的低代码配置部分&#xff0c;可以配置生成前端vue页面&#xff0c;对于属性较少的实体&#xff0c;如系统基础数据的管理、配置数据的维护&#xff0c;采用标准化的模板模式来生成&#xff0c;配…

腾讯云24元香港服务器有用过的吗?性能如何?

香港云服务器可以选择腾讯云香港地域的轻量应用服务器&#xff0c;轻量2核2G配置、20M峰值带宽、40G SSD系统盘&#xff0c;优惠价格24元一个月&#xff0c;Linux系统是288元一年&#xff0c;Windows系统是360元一年&#xff0c;腾讯云百科txybk.com分享腾讯云香港轻量应用服务…

墨者学院 Ruby On Rails漏洞复现第一题(CVE-2018-3760)

打开 web 页面&#xff1a; 发现是Ruby&#xff0c;在Ruby 3.7.1和更低版本中&#xff0c;存在由辅助解码引起的路径遍历漏洞。攻击者可以使用%252e%252e/访问根目录并读取或执行目标服务器上的任何文件。可以先检测一下是否有此漏洞&#xff1a; /assets/file:%2f%2f/etc/pas…

Cassandra介绍(一)

1.1. 概念 Apache Cassandra 是高度可扩展的&#xff0c;高性能的分布式 NoSQL 数据库。 Cassandra 旨在处理许 多商品服务器上的大量数据&#xff0c;提供高可用性而无需担心单点故障。 Cassandra 具有能够处理大量数据的分布式架构。 数据放置在具有多个复制因子的不同机器…

学习c++的第十三天

目录 文件和流 打开文件 关闭文件 写入文件 读取文件 读取 & 写入实例 文件位置指针 异常处理 扩展知识 抛出异常 标准的异常 定义新的异常 文件和流 到目前为止&#xff0c;我们已经使用了 iostream 标准库&#xff0c;它提供了 cin 和 cout 方法分别用于从标…

一文搞懂优先队列及相关算法

大家好&#xff0c;我是 方圆。优先队列在 Java 中的定义是 PriorityQueue&#xff0c;它基于 二叉堆 数据结构实现&#xff0c;其中的元素并不是全部有序&#xff0c;但它能够支持高效地 获取或删除最值元素。 二叉堆是一种特定条件的 完全二叉树&#xff0c;树的根节点为堆顶…

vivo 网络端口安全建设技术实践

作者&#xff1a;vivo 互联网安全团队 - Peng Qiankun 随着互联网业务的快速发展&#xff0c;网络攻击的频率和威胁性也在不断增加&#xff0c;端口是应用通信中的门户&#xff0c;它是数据进出应用的必经之路&#xff0c;因此端口安全也逐渐成为了企业内网的重要防线之一&…

公司团建小游戏开发小程序游戏互动小游戏

在现代工作环境中&#xff0c;团队合作和员工士气是取得成功的关键因素。为了增强团队合作、提升员工士气&#xff0c;并促进员工之间的互动&#xff0c;公司团建小游戏成为了一种备受欢迎的方式。本文将探讨如何开发公司团建小游戏&#xff0c;以达到这些目标。 1. 游戏概念 …

2023下半年软考信息系统项目管理师上午真题及答案

1.( B )不属于项目建议书的核心内容。 A.项目的必要性 B.初步可行性研究 C.项目的市场预测 D.项目建设必需的条件 解析&#xff1a; 2.在监控项目工作过程中&#xff0c;当遇到变更请求时&#xff0c;为使项目工作绩效重新与项目管理计划致&#xff0c;而进行的有目的的活动…

【双指针+简化去重操作】Leetcode 15 三数之和

【双指针简化操作】Leetcode 15 三数之和 解法1 解法1 新建一个嵌套列表&#xff1a;List<List<Integer>> result new List<>(); 初始化一个ArrayList并直接赋值&#xff1a;ArrayList<Integer> result new ArrayList<>(Arrays.asList(1, 2…

又来安利了,这个Itbuilder在线数据库设计工具用起来太顺手了

对于测试、开发、DBA、运维来说&#xff0c;数据库是再熟悉不过了。 我们都知道如今的数据是多么复杂和难以管理&#xff0c;但幸运的是有数据库设计工具可以帮助我们&#xff0c;可以在市场上找到很多的数据库设计工具&#xff0c;包括itbuilder。这些数据库设计工具可以帮助我…

如何选择SVM中最佳的【核函数】

参数“kernel"在sklearn中可选以下几种 选项&#xff1a; 接下来我们 就通过一个例子&#xff0c;来探索一下不同数据集上核函数的表现。我们现在有一系列线性或非线性可分的数据&#xff0c;我们希望通过绘制SVC在不同核函数下的决策边界并计算SVC在不同核函数下分类准确…

如何对ppt文件设置修改权限?

PPT文件会应用在会议、演讲、课件等工作生活中&#xff0c;当我们制作好了PPT之后&#xff0c;保护内容防止在演示时出错是很重要的&#xff0c;那么如何将PPT文件设置成禁止修改模式呢&#xff1f;今天分享几个方法给大家。 方法一 将PPT文件直接保存或者另存为一份文件&…

【Effective Modern C++】条款2:理解auto类型推导

条款2&#xff1a;理解auto类型推导 条款1中&#xff0c;模板类型推导的函数模板形如&#xff1a; template<typename T> void f(ParamType param);当变量采用auto声明时&#xff0c;auto扮演了模板中的T这个角色&#xff0c;而变量的类型扮演的是ParamType的角色。 条…

如何提高CRM系统的使用率?

​ CRM客户管理系统采购以后不投入使用&#xff0c;或者用了却用不好&#xff0c;都是极大的浪费。在知道CRM系统使用率低的原因之后&#xff0c;就要通过有效的方法提升CRM使用率。下面整理了六个方法&#xff0c;告诉您如何提高CRM系统的使用率。 有人演奏不出优美的曲子&a…

本地如何安装多个node版本

使用nvm 1官网下载 Releases coreybutler/nvm-windows GitHub 2.安装完 nvm -v检查是否按照成功 三、nvm的使用 安装完毕后&#xff0c;找到安装的路径&#xff0c;一些简单配置&#xff0c;打开setting.txt (是下载完毕之后自动帮你生成npm 下载node包之后不用重复安装…

【23真题】满分!最高150分!评级A+!

今天分享的是23年西南交通大学924的信号与系统试题及解析。这套卷子是回忆版&#xff0c;我已经尽力去还原了&#xff0c;全网仅此一份。如果有疏漏的地方&#xff0c;欢迎大家和我反馈。 本套试卷难度分析&#xff1a;平均分在124分&#xff0c;最高分有满分150分&#xff01…

高清Logo素材无忧:这5个网站解决所有问题!

今天给大家分享几个素材网站&#xff0c;基本上可以下载各大企业的 Logo&#xff0c;而且还是矢量格式哦~ 即时设计 即时设计是一款国产免费的 Logo 在线设计制作工具&#xff0c;浏览器内打开即用&#xff0c;对于使用系统没有任何限制。在即时设计&#xff0c;你可以从 0 到…

【数智化案例展】正官庄——全球商业数智化实践案例

‍ Marketingforce案例 本项目案例由Marketingforce投递并参与数据猿与上海大数据联盟联合推出的《2023中国数智化转型升级创新服务企业》榜单/奖项”评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 电商行业持续发展&#xff0c;而对于品牌来说&#xff0c;面对多个分…

陈海波:OpenHarmony技术领先,产学研深度协同,生态蓬勃发展

11月4日&#xff0c;以“技术筑生态&#xff0c;智联赢未来”为主题的第二届OpenHarmony技术大会在北京隆重举办。本次大会由OpenAtom OpenHarmony&#xff08;简称“OpenHarmony"&#xff09;项目群技术指导委员会&#xff08;TSC&#xff09;主办&#xff0c;由华为技术…