Python unittest 模块
一、Unittest 的几个基本概念
- TestCase :要写的具体的测试用例
- TestSuite: 多个测试用例集合(或测试套件/测试集)
- TestLoader:用来加载 TestCase 到 TestSuite中的(更通俗一点,就是用来把符合我们定义的条件的测试用例组合起来,成为一个测试集),一般会以参数的形式传进去一些条件
- TestRunner:是来执行测试用例的,测试的结果会保存到 TestResult 实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息
二、简单小示例
import unittestclass MyTest(unittest.TestCase):@classmethoddef setUpClass(self):"""测试用例执行之前执行"""print("UnitTest Begin...")@classmethoddef tearDownClass(self):"""测试用例执行之后执行"""print("UnitTest End...")def setUp(self):print("Begin...")def tearDown(self):print("End...")def test_1(self):self.assertEqual(1, 1)def test_2(self):self.assertEqual(1, 2)if __name__ == '__main__':unittest.main()
运行结果:
UnitTest Begin...Begin...
End...
Begin...
End...Ran 2 tests in 0.009sFAILED (failures=1)Failure
Traceback (most recent call last):File "C:\Users\hj\Anaconda3\Lib\unittest\case.py", line 59, in testPartExecutoryieldFile "C:\Users\hj\Anaconda3\Lib\unittest\case.py", line 605, in runtestMethod()File "E:\Python_virtualenvs\for_django\Projects\测试模块\1、小示例.py", line 23, in test_2self.assertEqual(1, 2)File "C:\Users\hj\Anaconda3\Lib\unittest\case.py", line 829, in assertEqualassertion_func(first, second, msg=msg)File "C:\Users\hj\Anaconda3\Lib\unittest\case.py", line 822, in _baseAssertEqualraise self.failureException(msg)
AssertionError: 1 != 2
测试发现有一个错误:1 != 2
。
参数说明
setUp()
和tearDown()
:测试用例执行之前和执行之后执行,一般用来做测试准备工作,如:连接(关闭)数据库、Web 登录等- 类方法
@classmethod
:类在未实例化之前调用类方法将会报错:TypeError: setUpClass() missing 1 required positional argument: 'self'
test_1()
和test_2()
:具体的测试用例,函数名一般以test
开头(更为规范)self.assertEqual()
:断言方法,用于判断测试用例是否能通过
三、常用断言方法
断言方法返回值为布尔值,如果指定msg参数的值,则将该信息作为失败的错误信息返回:
断言方法 | 断言描述 | 断言方法 | |
---|---|---|---|
assertEqual(arg1, arg2, msg=None) | 验证 arg1 = arg2 | assertNotEqual(arg1, agr2, msg=None) | 验证 arg1 != arg2 |
assertTrue(expr, msg=None) | 验证 expr 表达式为 True | assertFalse(expr, msg=None) | 验证 expr 为 False |
assertIs(arg1, arg2, msg=None) | 验证 arg1 与 arg2 是同一对象 | assertIsNot(arg1, arg2, msg=None) | 验证 arg1 和 arg2 不是同一对象 |
assertIn(arg1, arg2, msg=None) | 验证 arg1 是 arg2 的子串 | assertNotIn(arg1, arg2, msg=None) | 验证 arg1 不是 arg2 的子串 |
assertIsInstance(obj, cls, msg=None) | 验证 obj 是 cls 的实例 | assertNotIsInstance(arg1, arg2, msg=None) | 验证 obj 不是 cls 的实例 |
如果程序要对异常、错误、警告和日志进行断言判断,TestCase
提供了如下所示的断言方法:
断言方法 | 检查条件 |
---|---|
assertRaises(exc, fun, *args, **kwds) | fun(*args, **kwds) 引发 exc 异常 |
assertRaisesRegex(exc, r, fun, *args, **kwds) | fun(*args, **kwds) 引发 exc 异常,且异常信息匹配 r 正则表达式 |
assertWarns(warn, fun, *args, **kwds) | fun(*args, **kwds) 引发 warn 警告 |
assertWamsRegex(warn, r, fun, *args, **kwds) | fun(*args, **kwds) 引发 warn 警告,且警告信息匹配 r 正则表达式 |
assertLogs(logger, level) | With 语句块使用日志器生成 level 级别的日志 |
示例:
def func(a, b):"""一元一次方程"""if a == 0:raise ValueError('a 参数错误,不能为 0')else:return b // a
import unittestclass Test(unittest.TestCase):def test_fuc(self):self.assertEqual(func(2, 6), 3)# 检查 a = 0 时会不会引发 ValueErrorwith self.assertRaises( ):func(0, 9)
特定检查的断言方法:
断言方法 | 检查条件 |
---|---|
assertAlmostEqual(a, b) | round(a-b, 7) == 0 |
assertNotAlmostEqual(a, b) | round(a-b, 7) != 0 |
assertGreater(a, b) | a > b |
assertGreaterEqual(a, b) | a >= b |
assertLess(a, b) | a < b |
assertLessEqual(a, b) | a <= b |
assertRegex(s, r) | r.search(s) |
assertNotRegex(s, r) | not r.search(s) |
assertCountEqual(a, b) | a、b 两个序列包含的元素相同,不管元素出现的顺序如何 |
当测试用例使用 assertEqual() 判断两个对象是否相等时,如果被判断的类型是字符串、序列、列表、元组、集合、字典,则程序会自动改为使用如下的断言方法进行判断。换而言之,下表断言方法其实没有必要使用,unittest 模块会自动应用它们:
断言方法 | 用于比较的类型 |
---|---|
assertMultiLineEqual(a, b) | 字符串(string) |
assertSequenceEqual(a, b) | 序列(sequence) |
assertListEqual(a, b) | 列表(list) |
assertTupleEqual(a, b) | 元组(tuple) |
assertSetEqual(a, b) | 集合(set 或 frozenset) |
assertDictEqual(a, b) | 字典(dict) |
运行测试的两种方法
1、调用 unittest.main()
来运行当前源文件中的所有测试用例
if __name__ == '__main__':unittest.main()
2、使用 unittest
模块运行测试用例
python -m unittest 测试文件
测试结果说明:
Ran 1 test in 0.002sOK
- .:代表测试通过。
- F:代表测试失败,F 代表 failure。
- E:代表测试出错,E 代表 error。
- s:代表跳过该测试,s 代表 skip。
四、常见测试写法
方法一
搜索该模块下所有以 test 开头的测试用例方法,并自动执行它们:
import unittestclass Test(unittest.TestCase):def setUp(self):self.num = input('请输入一个数字:')self.num = int(self.num)print('测试开始')def test_case1(self):print(self.num)self.assertEqual(self.num, 10, msg='你输入的不是 10')def test_case2(self):print(self.num)self.assertEqual(self.num + 10, 20, msg='你输入的不是 20')@unittest.skip('暂时跳过用例3的测试')def test_case3(self):print(self.num)self.assertNotEqual(self.num, 30, msg='你输入的不是 30')def tearDown(self):print('测试结束')if __name__ == '__main__':unittest.main()
五、TestSuite测试包及用法
测试包(TestSuite)可以组织多个测试用例,组建好测试包后再用测试运行器(TestRunner)来运行该测试包所包含的所有测试用例。
下面来组建一个测试包,包含两个测试用例:
1、s1.py
def func(a, b):"""一元一次方程"""if a == 0:raise ValueError('a 参数错误,不能为 0')else:return b // a
2、t1.py
import unittest
from s1 import *class Test(unittest.TestCase):def test_fuc(self):self.assertEqual(func(2, 6), 3)with self.assertRaises(ValueError):func(0, 9)
3、s2.py
def say_hello():return 'Hello'
4、t2.py
import unittest
from s2 import *class TestHello(unittest.TestCase):def test_say_hello(self):self.assertEqual(say_hello(), 'Hello')
我们将在 t3.py 中组建一个测试包,同时测试 t1、t2:
# t3.py
import unittest
from t1 import Test
from t2 import TestHellotest_case = (Test, TestHello)
def build_suite():# 创建测试加载器loader = unittest.TestLoader()# 创建测试包suite = unittest.TestSuite()# 遍历所有测试类for test_class in test_case:# 从测试类中加载测试用例tests = loader.loadTestsFromTestCase(test_class)# 将测试用例添加到测验包中suite.addTests(tests)return suiteif __name__ == '__main__':# 创建测试运行器 (TestRunner) runner = unittest.TextTestRunner(verbosity=2) # verbosity=2 测试结果显示详细信息runner.run(build_suite())
运行结果如下:
test_fuc (t1.Test) ... ok
test_say_hello (t2.TestHello) ... ok----------------------------------------------------------------------
Ran 2 tests in 0.001sOK
如果希望直接生成文件格式的测试报告,可 指定 TextTestRunner
对象的 stream
属性:
if __name__ == '__main__':with open('abc.txt', 'a') as f:# 创建测试运行器(TestRunner),将测试报告输出到文件中runner = unittest.TextTestRunner(verbosity=2, stream=f)runner.run(build_suite())
相关文章:
Python unittest 模块
一、Unittest 的几个基本概念 TestCase :要写的具体的测试用例TestSuite: 多个测试用例集合(或测试套件/测试集)TestLoader:用来加载 TestCase 到 TestSuite中的(更通俗一点,就是用来把符合我们…...

Spring - Spring IoC 容器相关面试题总结
文章目录01. Spring IoC 和依赖注入是什么?02. Spring IoC 的优点和缺点分别是什么?03. Spring IoC 有什么作用和功能?04. Spring 依赖注入的方式?05. Spring 构造器注入和 setter 方法注入的区别?06. Spring 依赖注入…...

顺序表来喏!!!
前言:还记得前面的文章:《通讯录的实现》吗?通讯录的完成就借助了顺序表这种数据结构!!!那么今天我们就来介绍我们的顺序表介绍顺序表前,我们来了解一下线性表的概念线性表:线性表&a…...

【H2实践】之 SpringBoot 与 H2 数据交互
一、目标 本文是【H2实践】之认识 H2,【H2实践】之 SpringBoot 整合的后续。前文分别介绍了 H2 及其简单使用,并完成了 H2 与 SpringBoot 的整合。本文将紧接 【H2实践】之 SpringBoot 整合 探索实用 SpringBoot 结合 JPA 通过 web 接口操作 H2 数据库的…...
LeetCode 424. Longest Repeating Character Replacement
LeetCode 424. Longest Repeating Character Replacement https://leetcode.com/problems/longest-repeating-character-replacement/ 题目描述 You are given a string s and an integer k. You can choose any character of the string and change it to any other upperc…...

建立自己的博客(记录-不推荐)
环境安装: w10系统安装 第一步:安装git Git 官网: https://git-scm.com/ 第二步:安装Node.js Node.js官网:https://nodejs.org/zh-cn/ 使用cmd检测: node -v 第三步:安装Hexo Hexo官网:htt…...

hashmap存储方式 hash碰撞及其解决方式
1.Map的存储特点 在Map这个结构中,数据是以键值对(key-value)的形式进行存储的,每一个存储进map的数据都是一一对应的。 创建一个Map结构可以使用new HashMap()以及new TreeMap()两种方式,两者之间的区别是:…...

Amazon GuardDuty 的新增功能 – Amazon EBS 卷的恶意软件检测
亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术,观点,和项目,并将中国优秀开发者或技术推荐给全球云社区。如果你还没有关注/收藏…...
YOLOv7 pytorch
yolov7主干部分结构图:yolov7主干 yolov7数据集处理代码:yolov7数据集处理代码 yolov7训练参数解释:yolov7训练参数【与本文代码有区别】 yolov7训练代码详解:yolov7训练代码详解 目录 训练自己的训练集 训练自己的训练集 此…...

JDK自带JVM分析工具
一、JDK自带工具盘点: jstat:性能分析-查看gc情况; jmap:内存分析-堆信息; jstack:线程分析-栈信息; jinfo:参数查看及配置; jstatd:启动jvm监控服务。它…...

IO多路复用--[select | poll | epoll | Reactor]
因为在简历上写了netty的项目,因此还是将网络底层的那点东西搞清楚。 首先希望明确的是,BIO、NIO、IO多路复用这是不同的东西, 我会在本文中详细讲出来。 本文参考资料: JAVA IO模型 IO多路复用 select poll epoll介绍 从BIO到epo…...
pod的requests、limits解读、LimitRange资源配额、Qos服务质量等级、资源配额管理 Resource Quotas
前言 环境:k8s-v1.22.17 docker-20.10.9 centos-7.9 目录前言什么是可计算资源CPU、Memory计量单位pod资源请求、限额方式pod定义requests、limits查看节点资源情况pod使用request、limits示例LimitRange限制命名空间下的pod的资源配额Qos服务质量等级资源配额管理…...
R语言基础(六):函数
R语言基础(一):注释、变量 R语言基础(二):常用函数 R语言基础(三):运算 R语言基础(四):数据类型 R语言基础(五):流程控制语句 7. 函数 函数是一组完成特定功能的语句。 7.1 内置函数 R语言系统中提供许多内置函数&…...
[C++] 简单序列化
前言 序列化(Serialization) 是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。 使用 序列化 std::array&…...
Autosar Configuration(十三)SomeIP之配置TCP/IP
本系列教程是根据实际项目开发中总结的经验所得,如发现有不对的地方,还请指正。 目录Autosar Configuration(一)Davinci Developer-工具介绍 Autosar Configuration(二)Davinci Developer-SWC配置 Autosar Configuration(三) Security之Crypto配置 Autosar Configurat…...

滤波算法 | 无迹卡尔曼滤波(UKF)算法及其Python实现
文章目录简介UKF滤波1. 概述和流程2. Python代码第一个版本a. KF滤波b. UKF滤波第二个版本简介 上一篇文章,我们介绍了UKF滤波公式及其MATLAB代码。在做视觉测量的过程中,基于OpenCV的开发包比较多,因此我们将UKF的MATLAB代码转到python中&a…...

IMU 积分的误差状态空间方程推导
文章目录0. 前言1. 离散时间的IMU运动学方程2. 状态变量定义3. 补充公式4. IMU误差状态空间方程推导4.1. 旋转误差 δr^i1\delta\hat{\mathbf{r}}_{i1}δr^i14.2. 速度误差 δv^i1\delta\hat{\mathbf{v}}_{i1}δv^i14.3. 平移误差 δpi1\delta \mathbf{p}_{i1}δpi14.4. …...

VirtualBox的克隆与复制
快照太多,想整合成1个文件怎么办? 最近,我就遇到一个问题。快照太多了。比较占用空间怎么办? 错误做法 一开始,我是这么操作的,选中某个快照,然后选择删除…然后我登录虚拟机后,发…...

每天5分钟玩转机器学习算法:逆向概率的问题是什么?贝叶斯公式是如何解决的?
本文重点 前面我们已经知道了贝叶斯公式,以及贝叶斯公式在机器学习中的应用,那么贝叶斯公式究竟解决了一个什么样的问题呢?贝叶斯是为了解决逆向概率的问题。 正向的概率和逆向的概率 正向概率:假设袋子里面有N个白球,有M个黑球,你伸手一摸,那么问题就是你摸出黑球的概…...
游戏闲聊之游戏是怎么赚钱的
其实一般情况下不太爱写这种文章,简单说就一点,这个行业的人我惹不起。 1、外挂 所谓外挂,是指通过技术手段,提供辅助游戏的工具,方便玩家获得一些额外的能力; 这事我特意咨询过律师,外挂分两…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...

网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...