Python中的unittest库

文章目录

    • **1. unittest是什么?**
    • **2. unittest核心组件**
    • **3. 如何使用unittest?**
      • **3.1 编写测试用例**
      • **3.2 运行测试**
      • **3.3 参数化测试**
      • **3.4 Mock对象(依赖隔离)**
      • **3.5 跳过测试**
    • **4. 常用插件与工具**
    • **5. 面试常见问题**
      • **5.1 理论问题**
      • **5.2 实战编码**
    • **6. 最佳实践**
      • **6.1 测试设计原则**
      • **6.2 高效技巧**
      • **6.3 避免常见错误**
    • **7. 示例项目结构**

1. unittest是什么?

unittest 是Python标准库中自带的单元测试框架,灵感来源于Java的JUnit。它提供了一套完整的测试结构,包括测试用例编写、断言、测试套件管理、测试运行和结果报告等功能,是Python开发者必备的测试工具。


2. unittest核心组件

组件/概念作用
TestCase测试用例的基类,每个测试方法需继承它并以test_开头。
TestSuite测试套件,用于组合多个测试用例或套件。
TestRunner运行测试并输出结果(如TextTestRunner)。
TestLoader自动发现和加载测试(如discover()方法)。
断言方法assertEqual()assertTrue()等,用于验证结果。
FixturesetUp()tearDown()方法,管理测试前后的资源。

3. 如何使用unittest?

3.1 编写测试用例

import unittestclass TestMath(unittest.TestCase):def test_add(self):self.assertEqual(1 + 1, 2)  # 基础断言def test_divide(self):with self.assertRaises(ZeroDivisionError):1 / 0  # 验证异常

3.2 运行测试

  • 命令行运行

    # 运行单个模块
    python -m unittest test_module.py# 自动发现所有测试(匹配test*.py)
    python -m unittest discover
    
  • 代码中运行

    if __name__ == "__main__":unittest.main()
    

3.3 参数化测试

原生不支持参数化,但可通过parameterized库实现:

from parameterized import parameterizedclass TestMath(unittest.TestCase):@parameterized.expand([(2, 3, 5),(-1, 5, 4),])def test_add(self, a, b, expected):self.assertEqual(a + b, expected)

3.4 Mock对象(依赖隔离)

使用unittest.mock模拟外部依赖:

from unittest.mock import patchclass TestAPI(unittest.TestCase):@patch("requests.get")def test_fetch_data(self, mock_get):mock_get.return_value.status_code = 200response = fetch_data()  # 你的业务函数self.assertEqual(response.status_code, 200)

3.5 跳过测试

class TestExample(unittest.TestCase):@unittest.skip("功能未实现")def test_unfinished(self):pass@unittest.expectedFailuredef test_buggy_code(self):self.assertEqual(1, 2)  # 预期失败

4. 常用插件与工具

工具/插件用途
HTMLTestRunner生成HTML格式的测试报告(需单独安装)。
coverage.py统计代码测试覆盖率,生成覆盖率报告。
parameterized支持参数化测试,简化多场景用例编写。
pytest第三方测试框架(非官方),兼容unittest且功能更强大。

5. 面试常见问题

5.1 理论问题

  1. unittest和pytest有什么区别?
    • unittest是Python标准库,基于类;pytest是第三方库,更简洁,支持参数化和Fixture依赖注入。
  2. 如何验证某个函数抛出了特定异常?
    • 使用self.assertRaises(ErrorType, func, args)
  3. setUp()tearDown()的作用是什么?
    • setUp()在每个测试方法前执行,用于初始化;tearDown()在每个测试方法后执行,用于清理资源。
  4. 如何模拟一个HTTP请求?
    • 使用unittest.mock.patch装饰器模拟requests库的行为。

5.2 实战编码

  • 编写一个测试类:验证字符串反转函数。
  • 参数化测试:测试加法函数的多组输入。
  • Mock场景:模拟数据库查询返回固定结果。

6. 最佳实践

6.1 测试设计原则

  • 独立性:每个测试不依赖其他测试的结果。
  • 原子性:一个测试只验证一个逻辑点。
  • 可读性:测试方法名清晰(如test_add_negative_numbers)。

6.2 高效技巧

  • 使用Fixture:通过setUpClass()初始化昂贵资源(如数据库连接)。
  • 覆盖率检查:结合coverage.py确保覆盖核心逻辑。
  • 持续集成(CI):将测试集成到GitHub Actions、Jenkins等工具中。

6.3 避免常见错误

  • 忘记test_前缀:导致测试方法不被识别。
  • 依赖全局状态:如修改全局变量影响其他测试。
  • 过度Mock:Mock应仅用于外部依赖,而非业务核心逻辑。

7. 示例项目结构

my_project/
├── src/                  # 业务代码
│   ├── math_utils.py     # 数学工具函数
│   └── api_client.py     # API客户端
└── tests/                # 测试代码├── test_math.py      # 数学工具测试├── test_api.py       # API客户端测试└── __init__.py       # 标记为Python包

若有错误与不足请指出,关注DPT一起进步吧!!!

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

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

相关文章

农业电商|基于SprinBoot+vue的农业电商服务系统(源码+数据库+文档)

农业电商服务系统 目录 基于SprinBootvue的农业电商服务系统 一、前言 二、系统设计 三、系统功能设计 5.1系统功能实现 5.2后台模块实现 5.2.1管理员模块实现 5.2.2商家模块实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码…

【JAVA】七、基础知识“if+switch+循环结构”详细讲解~简单易懂!

目录 7、逻辑控制 7.1 分支结构 7.1.1 if 语句 语法格式1 语法格式2 语法格式3 7.1.2 switch语句 基本语法 执行流程 7.2 循环结构 7.2.1 while循环 语法格式 7.2.2 Break 7.2.3 Continue 7.2.4 for循环 语法格式 执行过程 7.2.5 do while循环 语法格式 7.3 …

C# Exe + Web 自动化 (BitComet 绿灯 自动化配置、设置)

BitComet GreenLight,内网黄灯转绿灯 (HighID), 增加p2p连接率提速下载-CSDN博客 前两天写个这个,每次开机关机后要重来一遍很麻烦的索性写个自动化。 先还是按照上面的教程自己制作一遍,留下Luck 以及 路由器相关的 端口记录信息。 (因为自…

JumpServer基础功能介绍演示

堡垒机可以让运维人员通过统一的平台对设备进行维护,集中的进行权限的管理,同时也会对每个操作进行记录,方便后期的溯源和审查,JumpServer是由飞致云推出的开源堡垒机,通过简单的安装配置即可投入使用,本文…

sqldef:一款免费的数据库变更管理工具

应用程序的升级通常伴随着数据库表结构的变更,为了维护各种环境的数据库变更,我们通常需要引入 Liquibase 或者 Flyaway 这样的数据库版本控制工具。不过,这类工具通常需要绑定某种编程语言,例如 Java;这次我们介绍一个…

行为模式---状态模式

概念 状态模式是一种行为模式,用于在内部状态改变的时候改变其行为。它的核心思想就是允许一个对象在其内部状态改变的时候改变它的行为。状态模式通过将对象的状态封装成独立的类,并将其行为委托给当前的状态对象,从而使得对象行为随着状态…

1688按图搜索商品(拍立淘)接口的参数说明【附代码实例】

阿里巴巴中国站按图搜索1688商品(拍立淘) API 返回值说明 item_search_img-按图搜索1688商品(拍立淘) 1688.item_search_img 公共参数 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)se…

Linux文件管理练习

1、列出所有账号的账号名 切割显示-cut 作用:cut命令用于按列提取文本内容 格式: cut -d "分隔符" -f列数字 文件名 2、将/etc/passwd中内容按照冒号隔开的第三个字符从大到小排序后输出所有内容 排序显示-sort 作用:sort命令用于对文本内容进行排…

解决PC串流至IPad Pro时由于分辨率不一致导致的黑边问题和鼠标滚轮反转问题

问题背景 今天在做 电脑串流ipad pro 的时候发现了2个问题: 1.ipadpro 接上鼠标后,滚轮上下反转,这个是苹果自己的模拟造成的问题,在设置里选择“触控板与鼠标”。 关闭“自然滚动”,就可以让鼠标滚轮正向滚动。 2. ipadpro 分…

【数据结构初阶第十九节】八大排序系列(下篇)—[详细动态图解+代码解析]

hello,好久不见! 云边有个稻草人-CSDN博客 上篇内容,回顾一下吧【数据结构初阶第十八节】八大排序系列(上篇)—[详细动态图解代码解析]-CSDN博客 今天我们来学习下篇 目录 (2)快速排序 【挖坑法】 —思路 —思路…

使用Open WebUI下载的模型文件(Model)默认存放在哪里?

🏡作者主页:点击! 🤖Ollama部署LLM专栏:点击! ⏰️创作时间:2025年2月21日21点21分 🀄️文章质量:95分 文章目录 使用CMD安装存放位置 默认存放路径 Open WebUI下…

XSS漏洞学习(1)

XSS漏洞学习(1) HTTP协议回顾 HTTP的请求方式 常用 GET 请求从服务器获取资源 HEAD 类似于GET请求,只不过不会返回实体数据,只获取报头 POST 向服务器提交数据 PUT 替换服务器的内容 不常用 DELETE 请求服务器删除指定的…

【统计学相关笔记】抽样基本定理的证明

抽样基本定理的证明 法 1 法 2 什么是 辅助统计量? 法 3

基于Asp.net的物流配送管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

vue-treeselect 【单选/多选】的时候只选择最后一层(绑定的值只绑定最后一层)

欢迎访问我的个人博客 |snows_ls BLOGhttp://snows-l.site 一、单选 1、问题: vue-treeselect 单选的时候只选择最后一层(绑定的值只绑定最后一层) 2、方法 1、只需要加上 :disable-branch-nodes"true" 就行&#xff0…

Python的那些事第四十五篇:继承自Nose的测试框架Nose2

Nose2:继承自Nose的测试框架 摘要 本文深入探讨了Nose2这一继承自Nose的测试框架。在软件开发过程中,测试是确保代码质量和稳定性的重要环节,而测试框架为测试工作的开展提供了有力支持。Nose2作为Nose的继承者,在保留Nose优势的基础上进行了诸多改进和扩展,为Python测试…

LLM后训练:解锁大型语言模型推理能力的关键路径

引言:从语言生成到逻辑推理的跃迁 大型语言模型(LLMs)通过预训练掌握了海量语言模式,但其核心缺陷——幻觉、逻辑断裂、价值观偏差——暴露了单纯预训练的局限性。后训练(Post-Training)作为预训练后的精修…

Rabit

之前发过rabit了,所以这里不再赘述,讲讲原理 在线Rabbit加密 | Rabbit解密- 在线工具 (sojson.com) rabbit加密原理 Rabbit加密算法是一种流密码算法,由Daniel J. Bernstein设计,并被广泛用于多种加密和安全通信应用中。它的设…

coding ability 展开第四幕(滑动指针——巩固篇)超详细!!!!

文章目录 前言水果成篮思路 找到字符串中所有字母异位词思路 串联所有单词的子串思路 最小覆盖子串思路 总结 前言 本专栏上一篇博客,带着大家从认识滑动窗口到慢慢熟悉 相信大家对滑动窗口已经有了大概的认识 其实主要就是抓住——一段连续的区间 今天来学习一些滑…

“消失的中断“

“消失的中断” 1. 前言 在嵌入式开发过程中,中断必不可少。道友们想必也经常因为中断问题头疼不已,今天来说说一个很常见的问题,“消失的中断”。最近项目在使用第三方MCAL的时候,就遇到了I2C中断丢失的问题,排查起…