【Python自动化测试】:Unittest单元测试与HTMLTestRunner自动生成测试用例的好帮手

读者大大们好呀!!!☀️☀️☀️


博客头像
🔥 欢迎来到我的博客
👀期待大大的关注哦❗️❗️❗️
🚀欢迎收看我的主页文章➡️寻至善的主页

文章目录

  • 🔥前言
  • 🚀unittest编写测试用例
  • 🚀unittest测试用例执行
  • 🚀unittest常见的断言方法
  • 🚀unittest测试结果分析
  • 🚀unittest测试用例的执行顺序
  • 🚀跨文件组织测试用例
  • 🚀HTMLTestRunner生成测试报告
  • ⭐️⭐️⭐️总结

🔥前言

哲学三问:什么是Unittest?Unittest可以做什么?为什么用Unitest?

1️⃣Python自带的单元测试框架,此外基于Python还有其他的单元测试框架:pytest,doctest,nose等
2️⃣编写规范的测试用例,组织测试用例,生成测试结果
3️⃣自动化编写脚本(自动化测试用例)通常使用单元测试框架来编写,组织和生成测试结果
下面就是实操环节了,尽情期待吧!

🚀unittest编写测试用例

第一步:打开你已经装好的神器:pyCharm,没错就是这个东西:
在这里插入图片描述
第二步:新建一个工程---->unitTest1
在这里插入图片描述
第三步:建立一个简单的被测试文件(包含了加减乘除的函数类)---->count.py

class Count:def __init__(self, a, b):self.a = aself.b = bdef add(self):c = self.a + self.breturn cdef sub(self):d = self.a - self.breturn ddef div(self):e = self.a * self.breturn edef mul(self):e = self.a / self.breturn e

在这里插入图片描述
第四步:根据被测函数使用unittest编写测试代码创建测试文件----Testcount.py
1️⃣这里记得选Python unit Test创建Python测试文件:
在这里插入图片描述
2️⃣随后会自动生成这些代码:

import unittestclass MyTestCase(unittest.TestCase):def test_something(self):self.assertEqual(True, False)  # add assertion hereif __name__ == '__main__':unittest.main()

在这里插入图片描述
第五步:开始编写构造测试用例函数了:

import unittest
from count import Countclass TestCaseCount(unittest.TestCase):def setUp(self) -> None: # 每个测试用例开始前执行print("这是执行的测试准备阶段!我要开始测试了!")  # add assertion heredef test_add1(self):  # 定义测试步骤与断言print("我执行的是加法函数测试!")   # 添加该print语句帮助我们了解test_add1何时被执行c1 = Count(1, 2)  # 根据Count类生成对象c1,会自动调用Count类里的init方法r1 = c1.add()  # r1保存的是实际被测代码的运行结果self.assertEqual(r1, 3)  # 将实际结果跟预期结果做等值比较,相等测试通过,不等测试失败def test_sub2(self):  # 定义测试步骤与断言print("我执行的是减法函数测试!")   # 添加该print语句帮助我们了解test_sub2何时被执行d1 = Count(2, 1)  # 根据Count类生成对象d1,会自动调用Count类里的init方法r2 = d1.sub()  # r2保存的是实际被测代码的运行结果self.assertEqual(r2, 1)  # 将实际结果跟预期结果做等值比较,相等测试通过,不等测试失败def test_div3(self):  # 定义测试步骤与断言print("我执行的是乘法函数测试!")   # 添加该print语句帮助我们了解test_div3何时被执行e1 = Count(2, 2)  # 根据Count类生成对象e1,会自动调用Count类里的init方法r3 = e1.div()  # r3保存的是实际被测代码的运行结果self.assertEqual(r3, 4)  # 将实际结果跟预期结果做等值比较,相等测试通过,不等测试失败def test_mul4(self):  # 定义测试步骤与断言print("我执行的是除法函数测试!")   # 添加该print语句帮助我们了解test_mul4何时被执行f1 = Count(4, 2)  # 根据Count类生成对象c1,会自动调用Count类里的init方法r4 = f1.mul()  # r1保存的是实际被测代码的运行结果self.assertEqual(r4, 2)  # 将实际结果跟预期结果做等值比较,相等测试通过,不等测试失败def tearDown(self) -> None:  # 每个测试用例结束后执行print("这是执行测试的结束,收拾残局阶段!!")if __name__ == '__main__':unittest.main()

PS:执行Python文件的内部调用与外部调用
在这里插入图片描述

🚀unittest测试用例执行

上面的测试用例函数结构是:
方法名必须是以“test_”打头,然后再是定义测试步骤与断言,断言会在下面讲到。现在是运行截图:
在这里插入图片描述

🚀unittest常见的断言方法

1️⃣assertEqual(a,b):判断a,b是否相等,如果相等,测试通过,如果不相等,测试失败
2️⃣assertNotEqual(a,b):判断a,b是否不相等,如果相等,测试失败

3️⃣assertTrue(x):用于判断bool(x)是否是True,如果不是True,测试失败 与1️⃣等效
4️⃣assertFalse(x):用于判断bool(x)是否是False,如果不是False,测试失败 与2️⃣等效
比如一个函数判断一个数是否是素数便可用3、4的断言方法

5️⃣assertIn(a,b):用于判断a是否在b中,如果a不在b中,则测试失败
6️⃣assertNotIn(a,b)和上个结果相反

🚀unittest测试结果分析

测试结果有三种:
1️⃣测试通过–》 . 一个点表示一个用例通过,上面的图片已经指出,下面着重介绍另外两种
2️⃣测试失败–》
测试的函数方法与预期结果不符合便是测试失败;比如我把加法的方法改一下:

    def add(self):c = self.areturn c

然后再进行测试:
在这里插入图片描述
显示三个用例成功,一个用例失败。
3️⃣测试错误–》
被测试代码或语法原因产生的错误:
现在我把被测试函数的默认属性方法改错:

# def __init__(self, a, b):def __int__(self, a, b):self.a = aself.b = b

执行后直接报错:
在这里插入图片描述

🚀unittest测试用例的执行顺序

测试方法的执行跟编写的顺序无关,而是根据test_后面接的ASCII码的顺序来执行(0-9,A-Z, _, a-z编码越小执行的优先级越高)

当然我们也可以按照自定义的顺序来执行:
不使用unittest的main方法默认顺序执行,而是通过改为使用unittest提供的TestSuit(测试套件)+TestRunner(测试运行器)的方式可以实现自定义顺序执行测试方法
我把下面main方法改一下:

if __name__ == '__main__':# unittest.main()   # 调用main()使用的是默认执行顺序# 使用test suite+test runner来自定义执行顺序# 一、按自定义顺序加载测试方法到测试套件里ts = unittest.TestSuite()  # 调用unittest提供的TestSuite类生成对象tsts.addTest(TestCaseCount("test_mul4"))# 调用TestSuite里的addTest方法来加载TestCaseCount类里的test_mul4测试方法ts.addTest(TestCaseCount("test_div3"))# 调用TestSuite里的addTest方法来加载TestCaseCount类里的test_div3测试方法ts.addTest(TestCaseCount("test_sub2"))# 调用TestSuite里的addTest方法来加载TestCaseCount类里的test_sub2测试方法ts.addTest(TestCaseCount("test_add1"))# 调用TestSuite里的addTest方法来加载TestCaseCount类里的test_add1测试方法# 二、使用测试运行器执行测试套件里的用例,生成测试结果tr = unittest.TextTestRunner()  # 调用unittest提供的TextTestRunner类生成对象trtr.run(ts)  # 调用TextTestRunner里的run方法来执行测试套件ts里的用例执行并生成结果

执行结果如下:
在这里插入图片描述

🚀跨文件组织测试用例

被测功能点肯定不止一个,而是多个,当被测功能点不断扩展,相应的测试代码也会不断的增多,这些测试代码不可能全部写在一个文件里。此时,通常的处理办法:根据所测功能点的不同,将相应的测试代码分散在不同的文件里,然后组织这些分散在不同文件里的代码一起执行。

组织分散在不同文件里的测试代码一起执行的常见办法:
🅰️Test Suite+Test Runner
🅱️discover
下面我将创建一个测试文件testcount2,里面的测试用例为其他测试数,两个runtest测试文件来区分上面🅰️,🅱️两种不同的执行方法
testcount2的文件代码为:

import unittest
from count import Countclass TestCaseCount(unittest.TestCase):def setUp(self) -> None: # 每个测试用例开始前执行print("这是第二次执行的测试准备阶段!我要开始测试了!")  # add assertion heredef test_add1(self):  # 定义测试步骤与断言print("我执行的是第二次加法函数测试!")   # 添加该print语句帮助我们了解test_add1何时被执行c1 = Count(2, 2)  # 根据Count类生成对象c1,会自动调用Count类里的init方法r1 = c1.add()  # r1保存的是实际被测代码的运行结果self.assertEqual(r1, 4)  # 将实际结果跟预期结果做等值比较,相等测试通过,不等测试失败def test_sub2(self):  # 定义测试步骤与断言print("我执行的是第二次减法函数测试!")   # 添加该print语句帮助我们了解test_sub2何时被执行d1 = Count(4, 1)  # 根据Count类生成对象d1,会自动调用Count类里的init方法r2 = d1.sub()  # r2保存的是实际被测代码的运行结果self.assertEqual(r2, 3)  # 将实际结果跟预期结果做等值比较,相等测试通过,不等测试失败def test_div3(self):  # 定义测试步骤与断言print("我执行的是第二次乘法函数测试!")   # 添加该print语句帮助我们了解test_div3何时被执行e1 = Count(1, 2)  # 根据Count类生成对象e1,会自动调用Count类里的init方法r3 = e1.div()  # r3保存的是实际被测代码的运行结果self.assertEqual(r3, 2)  # 将实际结果跟预期结果做等值比较,相等测试通过,不等测试失败def test_mul4(self):  # 定义测试步骤与断言print("我执行的是第二次除法函数测试!")   # 添加该print语句帮助我们了解test_mul4何时被执行f1 = Count(1, 1)  # 根据Count类生成对象c1,会自动调用Count类里的init方法r4 = f1.mul()  # r1保存的是实际被测代码的运行结果self.assertEqual(r4, 1)  # 将实际结果跟预期结果做等值比较,相等测试通过,不等测试失败def tearDown(self) -> None:  # 每个测试用例结束后执行print("这是第二次执行测试的结束,收拾残局阶段!!")if __name__ == '__main__':unittest.main()

runtest1的代码为:所使用的是Test Suite+Test Runner方法

import unittest
import testcount
import testcount2if __name__ == '__main__':# unittest.main()   # 调用main()使用的是默认执行顺序# 使用test suite+test runner来自定义执行顺序# 一、按自定义顺序加载测试方法到测试套件里ts = unittest.TestSuite()  # 调用unittest提供的TestSuite类生成对象tsts.addTest(testcount.TestCaseCount("test_mul4"))  # 调用TestSuite里的addTest方法来加载TestCaseCount类里的test_mul4测试方法ts.addTest(testcount2.TestCaseCount2("test_mul4"))ts.addTest(testcount.TestCaseCount("test_div3")) # 调用TestSuite里的addTest方法来加载TestCaseCount类里的test_div3测试方法ts.addTest(testcount2.TestCaseCount2("test_div3"))ts.addTest(testcount.TestCaseCount("test_sub2"))  # 调用TestSuite里的addTest方法来加载TestCaseCount类里的test_sub2测试方法ts.addTest(testcount2.TestCaseCount2("test_sub2"))ts.addTest(testcount.TestCaseCount("test_add1"))  # 调用TestSuite里的addTest方法来加载TestCaseCount类里的test_add1测试方法ts.addTest(testcount2.TestCaseCount2("test_add1"))# 二、使用测试运行器执行测试套件里的用例,生成测试结果tr = unittest.TextTestRunner()  # 调用unittest提供的TextTestRunner类生成对象trtr.run(ts)  # 调用TextTestRunner里的run方法来执行测试套件ts里的用例执行并生成结果

运行结果截图:
在这里插入图片描述

runtest2的代码为:所使用的是discover方法

import unittestif __name__ == '__main__':# unittest.main()# 使用discover加载testcount.py和testcount2.py里的用例一起执行# 自动发现unitTest1包下的testcount打头的Python文件里的测试方法,将其加载到测试套件ts里ts = unittest.defaultTestLoader.discover("./", pattern="testcount*.py")# 运行器运行套件用例tr =unittest.TextTestRunner()tr.run(ts)

运行截图如下:
在这里插入图片描述

🚀HTMLTestRunner生成测试报告

既然我们做的是测试,那么便要实现生成独立的测试报告:这里我们需要用到第三方库HTMLTestRunner.py------>独立生成HTML文件格式的测试文档:
在网上(包括在Python官方文库)找不到HTMLTestRunner相关解释资料。其实HTMLTestRunner是一个第三方的unittest HTML报告库,关于unittest在Python官方文库上很容易找到:然后下载下来放到Python的lib文件下

具体实现代码在runtest2下,代码修改如下:

import unittest
import HTMLTestRunnerif __name__ == '__main__':# unittest.main()# 使用discover加载testcount.py和testcount2.py里的用例一起执行# 自动发现unitTest1包下的testcount打头的Python文件里的测试方法,将其加载到测试套件ts里ts = unittest.defaultTestLoader.discover("./", pattern="testcount*.py")# 运行器运行套件用例# tr =unittest.TextTestRunner()# tr.run(ts)# 除了可以使用unittest提供的TextTestRunner文本测试运行器来执行用例生成测试结果以外,# 还可以使用HTMLTestRunner.py模块提供的HTMLTestRunner类来执行用例生成独立的测试报告# 以二进制写的模式打开当前目录下的report.html文件,准备往里面写内容,如果文件不存在则自动创建f = open('./report.html', 'wb')tr = HTMLTestRunner.HTMLTestRunner(stream=f, title="四则运算测试报告", description="说明信息")tr.run(ts)f.close()

生成的HTML文件测试报告截图如下:
在这里插入图片描述

⭐️⭐️⭐️总结

test case测试用例unittest提供了TestCase类用来编写测试用例
test suite测试套件unittest提供了TestSuite类用来组装测试用例生成测试用例集合
test runner测试运行器unittest提供了TextTestRunner类用来执行测试用例生成测试结果
test fixture测试固件unittest提供了一系列的固件:setUp,tearDown就是测试固件的一种,用来完成测试前的准备工作和测试后的清理工作。

✈️✈️✈️如果喜欢这篇文章的话

🙏大大们可以动动发财的小手:
👉👉👉 点赞:👍收藏:⭐️评论:✍️👈👈👈

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

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

相关文章

智慧医疗时代:探索互联网医院开发的新篇章

在智慧医疗时代,互联网医院开发正引领着医疗服务的创新浪潮。通过将先进的技术与医疗服务相结合,互联网医院为患者和医生提供了全新的互动方式,极大地提升了医疗服务的便捷性和效率。本文将深入探讨互联网医院的开发,介绍其技术实…

巧秒用AI写作工具做影视解说文案,效率高!

在自媒体内容输出的快节奏当下,影视解说已经成为一种受欢迎的内容形式。然而,创作高质量的影视解说文案往往需要花费大量的时间和精力。随着人工智能技术的不断发展,AI写作工具为我们提供了一种全新的、高效的解决方案。 AI写作工具利用先进的…

电商API接口接入电商平台实现品牌价格、销量、评论数据监控

电商数据接口API在现代电商运营中扮演着至关重要的角色。它不仅能够实现品牌价格、销量、评论数据的监控,还能帮助商家优化销售策略,提升业务效率。下面将详细探讨如何通过接入电商平台的API接口来实现这些功能: 选择适合的电商平台 主流平台…

思科模拟器--06.单臂路由升级版--多端路由互连实验--24.5.20

实验图纸如下: 第0步: 先放置六台个人电脑,一台交换机和一台2911路由器(千兆路由器(G0开头的)) 接着,用直通线将 PC0的F0,PC1的F0分别和交换机的F0/0, F0/1连接 交换机的F0/3和路由器的G0/0连接 PC2的F0,PC3的F0分别和交换机的F0/4, F0/5连接 交换机的F0/6和路由器的G0/1…

【杂七杂八】Huawei Gt runner手表系统降级

文章目录 Step1:下载安装修改版华为运动与健康Step2:在APP里进行配置Step3:更新固件(时间会很长) 目前在使用用鸿蒙4 111版本的手表系统,但是感觉睡眠检测和运动心率检测一言难尽,于是想到是否能回退到以前的版本&…

Elasticsearch 分析器的高级用法二(停用词,拼音搜索)

Elasticsearch 分析器的高级用法二(停用词,拼音搜索) 停用词简介停用词分词过滤器自定义停用词分词过滤器内置分析器的停用词过滤器注意,有一个细节 拼音搜索安装使用相关配置 停用词 简介 停用词是指,在被分词后的词…

Qt案例练习(有源码)

项目源码和资源:Qt案例练习: qt各种小案例练习,有完整资源和完整代码 1.案例1 项目需求:中间为文本框,当点击上面的复选框和单选按钮时,文本框内的文本会进行相应的变化。 代码如下: #include "dialog.h" …

Git提交和配置命令

一、提交代码到仓库 在软件开发中,版本控制是一个至关重要的环节。而Git作为目前最流行的版本控制系统之一,为我们提供了便捷高效的代码管理和协作工具。在日常开发中,我们经常需要将本地代码提交到远程仓库,以便于团队协作和版本…

AI大模型的口语练习APP

开发一个使用第三方大模型的口语练习APP涉及多个步骤,从需求分析到部署上线。以下是详细的开发流程和关键步骤,通过系统化的流程和合适的技术选型,可以有效地开发出一个功能丰富、用户体验良好的口语练习APP。北京木奇移动技术有限公司&#…

pip如何快速install packet

1、在后面加-i https://mirrors.aliyun.com//pypi//simple或https://pypi.tuna.tsinghua.edu.cn/simple pip install numpy -i https://mirrors.aliyun.com//pypi//simplepip install numpy1.21.0 -i https://pypi.tuna.tsinghua.edu.cn/simple2、需要注意的是,如果…

数据意外删除?安卓手机数据恢复教程来帮你解救

手机不仅仅是一个通讯工具,更是我们记录生活、工作、学习等各种信息的重要载体,无论是拍照、录音、录像,还是文字记录,手机都能轻松完成。可有时候我们会不小心删除一些重要的数据,这时候我们该怎么办呢?别…

查看bond接口详细信息

cat /proc/net/bonding/bondX 命令用于查看 Linux 系统中的网络绑定(bonding)接口的详细信息。在该命令中,bondX 是网络绑定接口的名称,其中 X 是数字,表示具体的网络绑定接口编号。 输出内容详解: 1. E…

Edge浏览器:重新定义现代网页浏览

引言 - Edge的起源与重生 Edge浏览器,作为Microsoft Windows标志性的互联网窗口,源起于1995年的Internet Explorer。在网络发展的浪潮中,IE曾是无可争议的霸主,但随着技术革新与用户需求的演变,它面临的竞争日益激烈。…

推荐网站(17)audiohub免费音乐平台

今天,我要向您推荐一个非常实用的网站——AudioHub。这是一个提供免费音乐的平台,特别适合需要无版权音乐资源的创作者、视频制作人、播客主持人以及任何需要背景音乐的项目。里面的音乐无版权,可商用。 链接直达:https://audiohu…

AWS EC2 连接 AWS RDS(Mysql)

1 创建RDS数据库 点击创建数据库 引擎选项 模板 设置 连接 2 EC2连接Mysql $ sudo yum list mariadb* Installed Packages mariadb-connector-c.x86_64 3.1.13-1.amzn2023.0.3 amazonl…

【uniapp】CSS实现多行文本展开收起的文字环绕效果

1. 效果图 收起状态 展开状态 2. 代码实现 <view class"word-wrap" id"descriptionTxt"><view class"fold-text" v-if"isFold"><text class"fold-btn" click"changFold">全文</text&g…

如何搭建sqli-labs靶场?(SQL注入的练习场)

目录 一、phpstudy(小皮面板的下载) 二、sqli-labs靶场的下载和靶场文件修改 三、网站的配置 四、访问网站 一、phpstudy(小皮面板的下载) 什么是phpstudy&#xff1f; 小皮面板是一款服务器集成环境的WEB面板&#xff0c;它的功能很强大&#xff0c;支持Web端管理&#xff…

智慧水务可视化大屏,一屏纵览水务信息。

智慧水务可视化大屏通常需要展现以下几类信息&#xff1a; 01.实时监测数据&#xff1a; 包括水源水质、水压、水位、水流速等实时监测数据&#xff0c;通过图表、曲线等形式展示&#xff0c;帮助监测人员了解当前水务系统的运行状态。 02.设备运行状态&#xff1a; 展示水泵…

多联机分户计费控制系统

中央空调多联机分户计费控制系统&#xff0c;针对国内常见几种品牌的多联机空调系统实行&#xff0c;远程控制与计费管理。系统采用MQTT网络协议&#xff0c;以订阅/发布模式实行设备感知&#xff0c;实现对室外机、室内机的状态监测、实时故障报警、累计分摊费用的实时数据传导…

vue3的核心API功能:computed()API使用

常规使用方法: 这样是常规使用方法. 另一种使用方法: 这样分别定义computed的get回调函数和set回调函数, 上面例子定义了plusOne.value的值为1, 那么这时候就走了computed的set回调函数,而没有走get回调函数. 当我们打印plusOne.value的值的时候,走的是get的回调函数而不是…