unittest框架 核心知识的系统复习及与pytest的对比
1. unittest 介绍
-
是什么:Python 标准库自带的单元测试框架,遵循 xUnit 架构(类似Java的JUnit)。
-
核心概念:
-
TestCase:测试用例的基类,所有测试类需继承它。 -
TestSuite:测试套件,用于聚合多个测试用例。 -
TestLoader:加载测试用例。 -
TestRunner:执行测试并输出结果。
-
-
适用场景:单元测试、集成测试,适合需要与Python标准库深度集成的项目。
2. 环境搭建
-
无需安装:Python 自带,直接导入即可:
python
复制
import unittest
3. 用例规则
-
测试类:必须继承
unittest.TestCase。 -
测试方法:以
test_开头(如test_login)。 -
断言方法:使用
self.assertXxx()(如self.assertEqual())。
4. 用例编写示例
python
复制
import unittestclass TestMath(unittest.TestCase):def test_add(self):self.assertEqual(1 + 1, 2)def test_multiply(self):self.assertTrue(2 * 3 == 6)if __name__ == "__main__":unittest.main()
5. 断言方法
| 方法 | 说明 |
|---|---|
self.assertEqual(a, b) | 断言 a == b |
self.assertNotEqual(a, b) | 断言 a != b |
self.assertTrue(x) | 断言 x 为 True |
self.assertFalse(x) | 断言 x 为 False |
self.assertIn(a, b) | 断言 a 在 b 中 |
self.assertRaises(Error) | 断言代码块抛出指定异常 |
6. 测试夹具(Setup/Teardown)
-
类级别:
python
复制
@classmethod def setUpClass(cls): # 类初始化(整个类执行前运行一次) @classmethod def tearDownClass(cls):# 类清理(整个类执行后运行一次) -
方法级别:
python
复制
def setUp(self): # 每个测试方法执行前运行 def tearDown(self): # 每个测试方法执行后运行
7. 用例跳过
-
无条件跳过:
python
复制
@unittest.skip("跳过原因") def test_skip(self):pass -
条件跳过:
python
复制
@unittest.skipIf(sys.platform == "win32", "Windows不支持") def test_linux_only(self):pass
8. 测试套件(TestSuite)
-
手动聚合用例:
python
复制
suite = unittest.TestSuite() suite.addTest(TestMath("test_add")) suite.addTest(TestLogin("test_login")) -
自动发现用例:
python
复制
loader = unittest.TestLoader() suite = loader.loadTestsFromModule(test_module) # 从模块加载 suite = loader.loadTestsFromTestCase(TestMath) # 从类加载
9. 参数化
-
原生不支持:需借助第三方库
parameterized或ddt。 -
使用
ddt示例:python
复制
import ddt@ddt.ddt class TestDataDriven(unittest.TestCase):@ddt.data((1, 2, 3), (0, 0, 0))@ddt.unpackdef test_add(self, a, b, expected):self.assertEqual(a + b, expected)
10. 与 pytest 的对比
| 特性 | unittest | pytest |
|---|---|---|
| 语法简洁性 | 需继承 TestCase,断言方法较繁琐 | 无需继承,直接使用 assert |
| 参数化 | 依赖第三方库(如ddt) | 原生支持 @pytest.mark.parametrize |
| 夹具 | setUp/tearDown | 更灵活的 @pytest.fixture |
| 插件生态 | 较少 | 丰富(如并发、Allure报告) |
| 执行效率 | 较低 | 更高(支持并发) |
11. 集成 HTMLTestRunner(生成测试报告)
步骤:
-
下载
HTMLTestRunner.py(非标准库,需单独放置)。 -
在代码中调用:
python
复制
with open("report.html", "wb") as f:runner = HTMLTestRunner.HTMLTestRunner(stream=f,title="测试报告",description="用例执行详情")runner.run(suite)
12. 生成测试报告
-
控制台输出:
bash
复制
python -m unittest discover -s tests # 自动发现并执行测试 -
XML 报告(用于CI集成):
bash
复制
python -m unittest discover -s tests -p "test_*.py" -v > report.xml
总结
-
适用场景:适合需要与Python标准库无缝集成的项目,或团队习惯xUnit风格。
-
优势:
-
无需额外安装,兼容性强。
-
清晰的类与方法结构。
-
-
劣势:灵活性较低,扩展依赖第三方库。
-
推荐搭配:结合
ddt(参数化)、coverage(覆盖率)、HTMLTestRunner(报告)提升效率。
相关文章:
unittest框架 核心知识的系统复习及与pytest的对比
1. unittest 介绍 是什么:Python 标准库自带的单元测试框架,遵循 xUnit 架构(类似Java的JUnit)。 核心概念: TestCase:测试用例的基类,所有测试类需继承它。 TestSuite:测试套件&a…...
vue面试宝典之二
39.vue2和vue3中源码是如何解析模版的 new vue()的时候实例化了类之后根据传进去的option进行模版的类型div还是text还是啥进行匹配,同时拿到节点的值进行绑定,比如正则匹配{{}}将匹配到的变量拿去跟option中的data查找到具体的值…...
ESLint 深度解析:原理、规则与插件开发实践
在前端开发的复杂生态中,保障代码质量与规范性是构建稳健、可维护项目的基石。ESLint 作为一款强大的代码检查工具,其默认规则与插件能满足多数常见需求,但面对特定团队规范或项目独特要求,自定义 ESLint 插件便成为有力的扩展手段…...
洛谷P1091
题目如下 思路 谢谢观看...
随机树算法 自动驾驶汽车的路径规划 静态障碍物(Matlab)
随着自动驾驶技术的蓬勃发展,安全、高效的路径规划成为核心挑战之一。快速探索随机树(RRT)算法作为一种强大的路径搜索策略,为自动驾驶汽车在复杂环境下绕过静态障碍物规划合理路径提供了有效解决方案。 RRT 算法基于随机采样思想…...
江科大51单片机笔记【9】DS1302时钟可调时钟(下)
在写代码前,记得把上一节的跳线帽给插回去,不然LCD无法显示 一.DS1302时钟 1.编写DS1302.c文件 (1)重新对端口定义名字 sbit DS1302_SCLKP3^6; sbit DS1302_IOP3^4; sbit DS1302_CEP3^5;(2)初始化 因为…...
ssm_mysql_暖心家装平台
收藏关注不迷路!! 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,还有大家在毕设选题(免费咨询指导选题),项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多…...
一周学会Flask3 Python Web开发-SQLAlchemy简介及安装
锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili SQLAlchemy是Python编程语言下的一款开源软件。提供了SQL工具包及对象关系映射(ORM)工具,…...
< 自用文儿 > DELETED 设置速读 in Ubuntu24
systemctl 和 DELETED: 配置文件: vi /etc/systemd/system/ DELETED.service [Unit] DescriptionV2Ray Service Documentation DELETED Afternetwork.target nss-lookup.target[Service] #Usernobody CapabilityBoundingSetCAP_NET_ADMIN CAP_NET_BIN…...
自动化同步多服务器数据库表结构
当项目每次进行版本升级的时候,如果在这次迭代中涉及表结构变更,需要将不同的生产环境下,都需要同步表结构的DDL语句,比较麻烦,而且还有可能忘记同步脚本,导致生产环境报错.... 该方案采用SpringBootMybat…...
深入理解 HTML 元素:构建网页的基础
在网页开发的领域中,HTML(超文本标记语言)犹如一座大厦的基石,支撑起整个网页的结构与内容呈现。而 HTML 元素,则是构成这座基石的基本单位。今天,就让我们一同深入探索 HTML 元素的奥秘。 HTML 元素的构成…...
黄昏时间户外街拍人像Lr调色教程,手机滤镜PS+Lightroom预设下载!
调色介绍 黄昏时分有着独特而迷人的光线,使此时拍摄的人像自带一种浪漫、朦胧的氛围 。通过 Lr 调色,可以进一步强化这种特质并根据不同的风格需求进行创作。Lr(Lightroom)作为专业的图像后期处理软件,提供了丰富的调色…...
OCPP扩展机制与自定义功能开发:协议灵活性设计与实践 - 慧知开源充电桩平台
OCPP扩展机制与自定义功能开发:协议灵活性设计与实践 引言 OCPP作为开放协议,其核心价值在于平衡标准化与可扩展性。面对不同充电桩厂商的硬件差异、区域能源政策及定制化业务需求,OCPP通过**扩展点(Extension Points)…...
哈希查找与深度优先遍历深度解析
一、算法基础概念对比 1.1 哈希查找的本质特征 哈希查找是一种基于哈希函数直接访问数据结构的查找技术,其核心在于通过数学映射建立键值与存储位置的直接关联。理想情况下时间复杂度可达O(1),实际应用中通过冲突处理机制实现近似常数时间的查找效率。…...
【powerjob】 powerjobserver注册服务IP错误
1、问题:powerjobserver 4.3.6 的服务器上有多个网卡对应多个ip,示例 eth0 :IP1 ,docker0:IP2 和worker 进行通信时 正确的应该时IP1 但是注册显示获取的确实IP2,导致 worker 通过ip2和server通信,网络不通,注册不上 2、解决方案 …...
Flutter底层实现
1. Dart 语言 Dart 是 Flutter 的主要编程语言。Dart 设计之初就是为了与 JavaScript 兼容,并且可以编译为机器代码运行。Dart 提供了一些特性,如异步支持(通过 async 和 await),这使得编写高效的网络请求和复杂动画变…...
亚信安全发布2024威胁年报和2025威胁预测
在当今数字化时代,网络空间已成为全球经济、社会和国家安全的核心基础设施。随着信息技术的飞速发展,网络连接了全球数十亿用户,推动了数字经济的蓬勃发展,同时也带来了前所未有的安全挑战。2024年,网络安全形势愈发复…...
【YOLOv12改进trick】StarBlock引入YOLOv12,创新涨点优化,含创新点Python代码,方便发论文
🍋改进模块🍋:StarBlock 🍋解决问题🍋:采用StarBlock将输入数据映射到一个极高维的非线性特征空间,生成丰富的特征表示,使得模型在处理复杂数据时更加有效。 🍋改进优势🍋:简单粗暴的星型乘法涨点却很明显 🍋适用场景🍋:目标检测、语义分割、自然语言处理…...
Android MVI架构模式详解
MVI概念 MVI(Model-View-Intent)是一种Android应用架构模式,旨在通过单向数据流和不可变性来简化应用的状态管理。MVI的核心思想是将用户操作、状态更新和界面渲染分离,确保应用的状态可预测且易于调试。 MVI的核心组件 Model&a…...
Spring AI Alibaba + Ollama:国产大模型DeepSeek LLM的低成本AI应用开发认知
写在前面 官方文档很详细,有开发需求可以直接看文档https://java2ai.com/docs/1.0.0-M5.1/get-started/博文内容为一个开发Demo,以及API简单认知理解不足小伙伴帮忙指正 😃,生活加油 我看远山,远山悲悯 持续分享技术干货…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
