【Python】‌Python单元测试框架unittest总结

1. 本期主题:Python单元测试框架unittest详解

unittest是Python内置的单元测试框架,遵循Java JUnit的"测试驱动开发"(TDD)理念,通过继承TestCase类实现测试用例的模块化组织。本文聚焦于独立测试脚本的编写,暂不涉及数据库集成或参数化测试等高级场景(参数化测试建议使用parameterized包或pytest实现)。

涵盖内容

  • 基础机制:测试类与测试方法的定义规范
  • 执行流程:从脚本运行到结果输出的完整链路
  • 结果解读:通过符号标记快速定位测试问题

不涵盖内容

  • DOM操作(前端测试建议使用Selenium
  • 数据库集成测试(需结合unittest.mockpytest-fixture
  • 参数化测试(后续文章将单独讲解)

2. unittest核心机制与执行流程

2.1 测试脚本结构解析

import unittestclass CalculatorTestCase(unittest.TestCase):"""加法器测试类"""def test_add_positive(self):"""正数加法测试"""self.assertEqual(10 + 5, 15)def test_add_negative(self):"""负数加法测试"""self.assertEqual(-3 + 7, 4)if __name__ == "__main__":unittest.main(verbosity=2)  # 增加输出详细度

关键点说明

  1. 命名规范:测试类以Test结尾,测试方法以test_开头
  2. 文档字符串:类和方法建议添加说明性注释
  3. 执行参数verbosity=2可显示测试名称而非仅点号

2.2 执行结果解读

运行上述脚本将输出:

test_add_negative (__main__.CalculatorTestCase) ... ok
test_add_positive (__main__.CalculatorTestCase) ... ok----------------------------------------------------------------------
Ran 2 tests in 0.001sOK
  • OK标记:所有测试通过
  • FAIL标记:断言失败时会显示具体值(如self.assertEqual(10, 20)会输出10 != 20

3. 常用断言方法详解

3.1 基础断言

class StringTestCase(unittest.TestCase):def test_string_operations(self):# 字符串相等验证self.assertEqual("tianxin".upper(), "TIANXIN")# 字符串包含验证self.assertIn("xin", "tianxin")# 布尔值验证self.assertTrue("tianxin".startswith("tian"))self.assertFalse("tianxin".endswith("xin"))  # 实际会失败,此处仅为示例

失败案例演示

def test_false_positive(self):self.assertEqual(10, 20)  # 输出: AssertionError: 10 != 20

3.2 异常验证

class DivisionTestCase(unittest.TestCase):def test_zero_division(self):with self.assertRaises(ZeroDivisionError):5 / 0def test_invalid_type(self):with self.assertRaises(TypeError):"10" + 5  # 字符串与整数拼接会触发TypeError

应用场景:验证边界条件(如除零、类型错误)


4. 生命周期钩子:setUptearDown

4.1 层级说明与执行顺序

钩子方法执行时机适用场景
setUpModule模块首次导入时初始化全局资源(如数据库连接池)
setUpClass测试类首次实例化时类级别资源(如测试文件路径)
setUp每个测试方法执行前测试方法独占资源(如临时文件)
tearDown每个测试方法执行后清理测试残留(如删除临时文件)
tearDownClass测试类所有方法执行完毕后释放类级别资源
tearDownModule模块所有测试执行完毕后关闭全局资源

4.2 完整示例

import os
import unittestclass FileOperationTestCase(unittest.TestCase):temp_file = "temp_test.txt"@classmethoddef setUpClass(cls):print("▶ 准备测试文件...")with open(cls.temp_file, "w") as f:f.write("initial content")def setUp(self):print("  → 每个测试前重置文件内容")with open(self.temp_file, "w") as f:f.write("")  # 清空文件def test_write_content(self):with open(self.temp_file, "a") as f:f.write("line1\n")self.assertTrue(os.path.exists(self.temp_file))def test_append_content(self):with open(self.temp_file, "a") as f:f.write("line2\n")with open(self.temp_file) as f:self.assertEqual(f.read(), "line2\n")  # 验证清空操作是否生效@classmethoddef tearDownClass(cls):print("◀ 删除测试文件")os.remove(cls.temp_file) if os.path.exists(cls.temp_file) else Noneif __name__ == "__main__":unittest.main()

输出顺序

▶ 准备测试文件...→ 每个测试前重置文件内容
test_write_content ... ok→ 每个测试前重置文件内容
test_append_content ... ok
◀ 删除测试文件

5. 测试跳过机制

5.1 装饰器应用

import unittest
import platformclass PlatformTestCase(unittest.TestCase):@unittest.skipIf(platform.system() == "Windows", "Windows系统暂不支持")def test_linux_feature(self):print("仅在Linux下运行的测试")@unittest.skipUnless(hasattr(os, "symlink"), "系统不支持符号链接")def test_symlink(self):print("符号链接测试")@unittest.skip("功能重构中,暂不测试")def test_deprecated_feature(self):print("已弃用功能测试")

执行结果

s (skipped) ... skipped 'Windows系统暂不支持'
s (skipped) ... skipped '系统不支持符号链接'
s (skipped) ... skipped '功能重构中,暂不测试'

6. 总结与建议

  1. 测试设计原则
  • 每个测试方法只验证一个功能点
  • 使用有意义的测试名称(如test_add_positive而非test1
  • 优先使用setUp/tearDown而非重复代码
  1. 扩展方向
  • 数据库测试:结合unittest.mock模拟数据库连接
  • 参数化测试:使用pytest.mark.parametrizeparameterized
  • 集成测试:通过subTest实现测试数据驱动
  1. 工具链建议
  • 简单项目:直接使用unittest
  • 复杂项目:迁移至pytest(支持更简洁的语法和插件生态)
  • 持续集成:结合tox实现多Python版本测试

通过以上结构化讲解,读者可系统掌握unittest的核心用法,并逐步向更复杂的测试场景扩展。

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

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

相关文章

【Python 实战】---- 使用Python批量将 .ncm 格式的音频文件转换为 .mp3 格式

1. 前言 .ncm 格式是网易云音乐专属的加密音频格式,用于保护版权。这种格式无法直接播放,需要解密后才能转换为常见的音频格式。本文将介绍如何使用 Python 批量将 .ncm 格式的音频文件转换为 .mp3 格式。 2. 安装 ncmdump ncmdump 是一个专门用于解密 .ncm 文件的工具。它…

Linux 学习笔记2

Linux 学习笔记2 一、定时任务调度操作流程注意事项 二、磁盘分区与管理添加新硬盘流程磁盘管理命令 三、进程管理进程操作命令服务管理(Ubuntu) 四、注意事项 一、定时任务调度 操作流程 创建脚本 vim /path/to/script.sh # 编写脚本内容设置可执行权…

YOLO目标检测算法

文章目录 前言一、目标检测算法简介1、传统目标检测算法(1)R-CNN算法简介(2)Fast R-CNN算法简介(3)Faster R-CNN算法简介 2、目标检测中的算法设计范式(1)one-stage(2&am…

【软件设计师:软件】20.软件设计概述

一、软件设计基本原则 一、软件设计基本原则 1. 模块 是指执行某一特定任务的数据结构和程序代码。 将模块的接口和功能定义为其外部特性将模块的局部数据和实现该模块的程序代码称为内部特性。在模块设计时,最重要的原则就是实现信息隐蔽和模块独立。 2 . 信息隐蔽 将每…

软件工程之面向对象分析深度解析

前文基础: 1.软件工程学概述:软件工程学概述-CSDN博客 2.软件过程深度解析:软件过程深度解析-CSDN博客 3.软件工程之需求分析涉及的图与工具:软件工程之需求分析涉及的图与工具-CSDN博客 4.软件工程之形式化说明技术深度解…

需求分析阶段测试工程师主要做哪些事情

在软件测试需求分析阶段,主要围绕确定测试范围、明确测试目标、细化测试内容等方面开展工作,为后续测试计划的制定、测试用例的设计以及测试执行提供清晰、准确的依据。以下是该阶段具体要做的事情: 1. 需求收集与整理 收集需求文档&#x…

vLLM部署Qwen2-7B模型推理

vllm简介 vLLM是一个高效的大语言模型推理和部署服务系统,专为大型语言模型的高效执行而设计。它不仅支持多种量化技术以减少模型大小和加速推理过程,还提供了与OpenAI API兼容的服务接口,使得现有的应用程序能够无缝对接。 一、前提环境 …

【STM32 学习笔记】GPIO输入与输出

GPIO详解 一、GPIO基本概念 GPIO(通用输入输出)是微控制器与外部设备交互的核心接口,具有以下特性: 可编程控制输入/输出模式支持数字信号的读取与输出集成多种保护机制复用功能支持片上外设连接 二、GPIO位结构解析 2.1 保护二…

安科瑞光伏综自系统在新能源电站中的应用及调度上传方案研究

摘要 随着全球对清洁能源需求的不断增长,光伏发电作为一种可持续的能源解决方案,正迅速发展。光伏综合自动化系统(综自系统)在确保光伏电站高效、稳定运行方面起着关键作用。本文详细介绍了安科瑞光伏综自系统,包括其背…

[python] 函数2-匿名函数

一 匿名函数 格式: 函数名 lambda 形参 : 返回值(表达式) 调用: 结果 函数名(实参) 一般只有一行代码,他是对def定义函数的一种简化,只能实现简单的逻辑 逻辑复杂时不要使用lambda add lambda a,b: ab # a,b就是形参 print(add(2,5)) 1.1 无参数 noargs_func lambda…

深入理解C/C++内存管理:从基础到高级优化实践

一、内存区域划分与基础管理机制​​ ​​栈(Stack)​​ 栈由系统自动管理,用于存储函数调用时的局部变量、参数及返回地址。其特点是高效但空间有限(通常1-8MB),遵循后进先出(LIFO)…

kafka 面试总结

Kafka的幂等性是一种机制,确保生产者发送的每条消息在Broker端只被持久化一次,即使生产者因网络问题等原因重试发送,也不会导致消息重复。 实现原理 生产者ID(PID) 每个生产者实例在初始化时,会被分配一个…

uniapp|实现多终端聊天对话组件、表情选择、消息发送

基于UniApp框架,实现跨平台多终端适配的聊天对话组件开发、表情选择交互设计及消息发送,支持文本与表情混合渲染。 目录 聊天界面静态组件实现消息列表布局消息气泡双向布局辅助元素定位与样式静态数据模拟与扩展性设计表情选择器静态模块浮层实现符号网格排列多端样式适配方…

LabVIEW超声波液位计检定

在工业生产、运输和存储等环节,液位计的应用十分广泛,其中超声波液位计作为非接触式液位测量设备备受青睐。然而,传统立式水槽式液位计检定装置存在受建筑高度影响、量程范围受限、流程耗时长等问题,无法满足大量程超声波液位计的…

C++漫步结构与平衡的殿堂:AVL树

文章目录 1.AVL树的概念2.AVL树的结构3.AVL树的插入4.AVL树的旋转4.1 左单旋4.2 右单旋4.3 右左双旋4.4 左右双旋 5.AVL树的删除6.AVL树的高度7.AVL树的平衡判断希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力! 二叉搜索树有其自身的缺陷&#xf…

Verilog Test Fixture 时钟激励

1、占空比50%时钟产生 always begin<clock> 1b0 ;#<PERIOD/2> ;<clock> 1b1 ;#<PERIOD/2> ; end reg <clock> 1b0 ;alwaysbegin#<PERIOD/2> ;<clock> ~<clock> ;end 2…

从人体姿态到机械臂轨迹:基于深度学习的Kinova远程操控系统架构解析

在工业自动化、医疗辅助、灾难救援与太空探索等前沿领域&#xff0c;Kinova轻型机械臂凭借7自由度关节设计和出色负载能力脱颖而出。它能精准完成物体抓取、复杂装配和精细操作等任务。然而&#xff0c;实现人类操作者对Kinova机械臂的直观高效远程控制一直是技术难题。传统远程…

探秘数据中台:五大核心平台的功能全景解析

数据中台作为企业数据资产的 “智慧中枢”&#xff0c;通过整合数据处理全流程的核心功能&#xff0c;实现数据价值的深度挖掘与高效应用。以下从五大核心平台出发&#xff0c;全面拆解数据中台的功能架构与应用价值。 一、数据可视化平台&#xff1a;让数据 “开口说话” 1.…

深度 |提“智”向新,奔向未来——当前机器人产业观察

机器人踏着“猫步”在T台走秀、进入工厂协助造车&#xff0c;教育、医疗、城市管理等领域都有了机器人的帮助……今天&#xff0c;机器人已得到广泛应用&#xff0c;走进你我的生活。    伴随着技术日新月异&#xff0c;机器人产业加快提“智”向新。特别是今年以来&#xf…

桥隧坡灾害监测报警:用科技筑起生命安全的“智能防线”

.2024年&#xff0c;梅大高速茶阳路段高边坡塌方事件造成重大伤亡&#xff0c;举国痛心。这场悲剧再次敲响警钟&#xff1a;桥梁、隧道、边坡等高风险区域的实时监测与精准报警&#xff0c;已成为交通安全的生命线。如何用技术手段在灾害发生前“抢跑”&#xff0c;第一时间阻断…