当前位置: 首页 > news >正文

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 = arg2assertNotEqual(arg1, agr2, msg=None)验证 arg1 != arg2
assertTrue(expr, msg=None)验证 expr 表达式为 TrueassertFalse(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 &#xff1a;要写的具体的测试用例TestSuite&#xff1a; 多个测试用例集合&#xff08;或测试套件/测试集&#xff09;TestLoader&#xff1a;用来加载 TestCase 到 TestSuite中的&#xff08;更通俗一点&#xff0c;就是用来把符合我们…...

Spring - Spring IoC 容器相关面试题总结

文章目录01. Spring IoC 和依赖注入是什么&#xff1f;02. Spring IoC 的优点和缺点分别是什么&#xff1f;03. Spring IoC 有什么作用和功能&#xff1f;04. Spring 依赖注入的方式&#xff1f;05. Spring 构造器注入和 setter 方法注入的区别&#xff1f;06. Spring 依赖注入…...

顺序表来喏!!!

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

【H2实践】之 SpringBoot 与 H2 数据交互

一、目标 本文是【H2实践】之认识 H2&#xff0c;【H2实践】之 SpringBoot 整合的后续。前文分别介绍了 H2 及其简单使用&#xff0c;并完成了 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…...

建立自己的博客(记录-不推荐)

环境安装&#xff1a; w10系统安装 第一步&#xff1a;安装git Git 官网: https://git-scm.com/ 第二步&#xff1a;安装Node.js Node.js官网&#xff1a;https://nodejs.org/zh-cn/ 使用cmd检测&#xff1a; node -v 第三步&#xff1a;安装Hexo Hexo官网&#xff1a;htt…...

hashmap存储方式 hash碰撞及其解决方式

1.Map的存储特点 在Map这个结构中&#xff0c;数据是以键值对&#xff08;key-value&#xff09;的形式进行存储的&#xff0c;每一个存储进map的数据都是一一对应的。 创建一个Map结构可以使用new HashMap()以及new TreeMap()两种方式&#xff0c;两者之间的区别是&#xff1a…...

Amazon GuardDuty 的新增功能 – Amazon EBS 卷的恶意软件检测

亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术&#xff0c;观点&#xff0c;和项目&#xff0c;并将中国优秀开发者或技术推荐给全球云社区。如果你还没有关注/收藏…...

YOLOv7 pytorch

yolov7主干部分结构图&#xff1a;yolov7主干 yolov7数据集处理代码&#xff1a;yolov7数据集处理代码 yolov7训练参数解释&#xff1a;yolov7训练参数【与本文代码有区别】 yolov7训练代码详解&#xff1a;yolov7训练代码详解 目录 训练自己的训练集 训练自己的训练集 此…...

JDK自带JVM分析工具

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

IO多路复用--[select | poll | epoll | Reactor]

因为在简历上写了netty的项目&#xff0c;因此还是将网络底层的那点东西搞清楚。 首先希望明确的是&#xff0c;BIO、NIO、IO多路复用这是不同的东西&#xff0c; 我会在本文中详细讲出来。 本文参考资料&#xff1a; JAVA IO模型 IO多路复用 select poll epoll介绍 从BIO到epo…...

pod的requests、limits解读、LimitRange资源配额、Qos服务质量等级、资源配额管理 Resource Quotas

前言 环境&#xff1a;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语言基础(一)&#xff1a;注释、变量 R语言基础(二)&#xff1a;常用函数 R语言基础(三)&#xff1a;运算 R语言基础(四)&#xff1a;数据类型 R语言基础(五)&#xff1a;流程控制语句 7. 函数 函数是一组完成特定功能的语句。 7.1 内置函数 R语言系统中提供许多内置函数&…...

[C++] 简单序列化

前言 序列化(Serialization) 是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间&#xff0c;对象将其当前状态写入到临时或持久性存储区。以后&#xff0c;可以通过从存储区中读取或反序列化对象的状态&#xff0c;重新创建该对象。 使用 序列化 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滤波第二个版本简介 上一篇文章&#xff0c;我们介绍了UKF滤波公式及其MATLAB代码。在做视觉测量的过程中&#xff0c;基于OpenCV的开发包比较多&#xff0c;因此我们将UKF的MATLAB代码转到python中&a…...

IMU 积分的误差状态空间方程推导

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

VirtualBox的克隆与复制

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

每天5分钟玩转机器学习算法:逆向概率的问题是什么?贝叶斯公式是如何解决的?

本文重点 前面我们已经知道了贝叶斯公式,以及贝叶斯公式在机器学习中的应用,那么贝叶斯公式究竟解决了一个什么样的问题呢?贝叶斯是为了解决逆向概率的问题。 正向的概率和逆向的概率 正向概率:假设袋子里面有N个白球,有M个黑球,你伸手一摸,那么问题就是你摸出黑球的概…...

游戏闲聊之游戏是怎么赚钱的

其实一般情况下不太爱写这种文章&#xff0c;简单说就一点&#xff0c;这个行业的人我惹不起。 1、外挂 所谓外挂&#xff0c;是指通过技术手段&#xff0c;提供辅助游戏的工具&#xff0c;方便玩家获得一些额外的能力&#xff1b; 这事我特意咨询过律师&#xff0c;外挂分两…...

Redis高频面试题汇总(下)

目录 1.Redis中什么是Big Key(大key) 2.Big Key会导致什么问题 3.如何发现 bigkey&#xff1f; 4.为什么redis生产环境慎用keys *命令 5.如何处理大量 key 集中过期问题 6.使用批量操作减少网络传输 7.缓存穿透 8.缓存击穿 9.缓存雪崩 10.缓存污染&#xff08;或满了…...

Windows修改Docker安装目录修改Docker镜像目录,镜像默认存储位置存放到其它盘

Windows安装Docker&#xff0c;默认是安装在C盘&#xff0c;下载镜像后会占用大量空间&#xff0c;这时需要调整镜像目录&#xff1b;场景&#xff1a;不想连服务器或者没有服务器&#xff0c;想在本地调试服务&#xff0c;该需求就非常重要。基于WSL2安装docker后&#xff0c;…...

376. 摆动序列——【Leetcode每日刷题】

376. 摆动序列 如果连续数字之间的差严格地在正数和负数之间交替&#xff0c;则数字序列称为 摆动序列 。第一个差&#xff08;如果存在的话&#xff09;可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。 例如&#xff0c; [1, 7, 4, 9, 2, 5] 是一个…...

mgre实验

实验思路 1、首先根据拓扑结构合理分配IP地址&#xff0c;并对各个路由器的IP地址和R5环回接口的IP地址进行配置。 2、让私网中的边界路由器对ISP路由器做缺省路由。 3、根据实验要求&#xff0c;对需要配置不同类型认证的路由器进行认证配置&#xff0c;和需要不同封装的协议…...

一文彻底了解Zookeeper(介绍篇)

zookeeper 是什么&#xff1f; zookeeper是一个分布式协作框架&#xff0c;提供高可用&#xff0c;高性能&#xff0c;强一致等特性 zookeeper 有哪些应用场景&#xff1f; 分布式锁&#xff1a;分布式锁是指在分布式环境中&#xff0c;多个进程或线程需要互斥地访问某个共享…...

1. ELK Stack 理论篇之什么是ELK Stack?

ELK Stack 理论篇之什么是ELK Stack?1.1 什么是 ELK Stack&#xff1f;1.2 ELK Stack的发展史1.2.1 Elasticsearch1.2.2 引入 Logstash 和 Kibana&#xff0c;产品更强大1.2.3 社区越来越壮大&#xff0c;用例越来越丰富1.2.4 然后我们向 ELK 中加入了 Beats1.2.5 那么&#x…...

两道有关链表的练习

目录 一、分割链表 二、奇偶链表 一、分割链表 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你不需要 保留 每个分区中各节点的初始相对位置。 示例 1&#xff1a; 输…...

Python uiautomator2安卓自动化测试

一、前言 uiautomator2是Python对Android设备进行UI自动化的库&#xff0c;支持USB和WIFI链接&#xff0c;可以实现获取屏幕上任意一个APP的任意一个控件属性&#xff0c;并对其进行任意操作。 重点是它可以实现安卓自动化采集&#xff0c;甚至是群控采集&#xff0c;且安装和…...

Leetcode. 160相交链表

文章目录指针解法指针解法 核心思路 &#xff1a; 先 分别求两个链表的长度 然后长的链表先走 差距步&#xff08;长-短&#xff09; 最后长链表和短链表同时走 &#xff0c;第一地址相同的就是交点 &#xff0c;注意一定是地址相同 不可能出现上图这种情况 &#xff0c;因为C1…...

MDPs —— 马尔可夫决策定义与算法

文章目录MDPs 定义——由实例开始时序决策问题给游戏增点乐子*为什么要有折扣游戏的解——原则所以&#xff0c;什么是 MDPs&#xff1f;MDPs 的基本原理、表示光环原理效用的求解是反向传播的原则不变条件MDPs 的表示MDPs 求解效用迭代法缺点原则迭代法MDPs 定义——由实例开始…...

网站服务器有什么区别/培训班该如何建站

JsoupJsoup 是一款轻量高效的 html 文档解析工具&#xff0c;可类比 xml 中的 dom4j 、jdomJsoup中的基本类DocumentHtml 整个文档在内容中的数据结构&#xff0c;继承 ElementElement标记元素的数据结构 &#xff0c;继承 NodeElementsElement 的集合&#xff0c;继承 ArrayLi…...

校园门户网站系统建设/网络引流怎么做啊?

概述 相信大家都知道怎么在vSphere环境中配置HA功能&#xff0c;知道HA故障切换时间为VM系统启动时间应用启动时间15秒左右的心跳检测时间&#xff0c;知道HA不受DRS和vMotion影响&#xff0c;知道HA不需要依赖vCenter&#xff08;vCenter挂了&#xff0c;License授权ESXi主机只…...

深圳网站建设怎么办/网站要怎么创建

嗨, 欢迎来到课程的第一部分。 并行计算和Python入门。 在本节中, 我们将讨论并行计算和内存架构。 我们还将关注内存组织和并行编程模型。 接下来, 我们将看到如何设计并行程序, 并评估并行程序的性能。 此外, 我们将介绍Python。 并且我们将与流程一起工作, 并与他们一起调节…...

主机网站建设制作/益阳网络推广

一、安装JRebel插件 1. 在线安装 打开设置 File ->setting或者直接点设置的图标进入 在线下载并安装 2. 激活插件 插件默认能试用14天&#xff0c;可用如下方式激活。 打开idea后&#xff0c;看到jr图标就代表安装插件成功&#xff0c;还有在设置里面会多出Jrebel&#…...

柳江区城乡住房建设局网站/湖南关键词优化品牌价格

作者ChevyRay &#xff0c;2013年9月28日&#xff0c;snaker7译 原文地址&#xff1a;http://unitypatterns.com/introduction-to-coroutines/ 在Unity中&#xff0c;协程&#xff08;Coroutines&#xff09;的形式是我最喜欢的功能之一&#xff0c;几乎在所有的项目中&…...

南京网站制作公司报价/学it需要什么学历基础

生成式合成算法是用于生成文本、图像、音频等内容的算法&#xff0c;在应用这些算法的过程中&#xff0c;需要从社会层面考虑风险治理。 一种方法是在使用这些算法之前&#xff0c;对它们的可能影响进行风险评估&#xff0c;并制定风险控制措施。这些措施可以包括&#xff1a; …...