Python 单元测试中的 Mocking 与 Stubbing:提高测试效率的关键技术

news/2024/11/5 5:54:57 标签: python, 单元测试, log4j

在软件开发过程中,单元测试是确保代码质量的重要环节。为了实现高效的单元测试,我们常常需要隔离待测试的代码与其外部依赖。这时候,Mocking(模拟)和 Stubbing(桩)技术就显得尤为重要。这两种技术可以帮助我们用可控的替代物代替真实对象或方法,从而更好地进行测试和验证。

什么是 Mocking?

Mocking 是一种测试技术,使用模拟对象来模仿真实对象的行为。通过模拟对象,开发者可以在测试中替换掉那些复杂、不可预测或速度较慢的组件,如数据库、网络服务或硬件设备等。Mocking 的主要目的是隔离待测代码,使其行为独立于外部依赖而被评估。

Mocking 的关键特性

  1. 行为模拟:模拟对象可以被编程为在各种条件下返回特定值、抛出异常或模仿真实对象的行为。
  2. 交互验证:模拟可以记录它们的使用方式,允许测试人员验证特定方法是否以预期的参数被调用。
  3. 测试隔离:通过用模拟替换真实对象,测试可以专注于待测代码的逻辑,而不用担心外部依赖的复杂性或可用性。

Python Mocking 示例

以下是一个简单的数据库方法 database.get_user 的示例,该方法被模拟为返回一个预定义的用户字典。测试可以验证此方法是否用正确的参数被调用:

python">from unittest.mock import Mock

# 创建一个模拟对象
database = Mock()

# 模拟方法调用
database.get_user.return_value = {"name": "Prasad", "age": 30}

# 使用模拟对象
user = database.get_user("prasad_id")
print(user)  

# 验证交互
database.get_user.assert_called_with("prasad_id") 

输出:

{'name': 'Prasad', 'age': 30}

什么是 Stubbing?

Stubbing 是一种相关的测试技术,其中某些方法或函数被替换为“桩”,这些桩返回固定的、预定的响应。与 Mocking 相比,Stubbing 更简单,因为它通常不涉及记录或验证交互。相反,Stubbing 主要关注为待测代码提供可控的输入,以确保结果的一致性和可重复性。

Stubbing 的关键特性

  1. 固定响应:桩返回特定的、预定义的值或响应,无论它们如何被调用。
  2. 简化依赖:通过用桩替换复杂的方法,测试可以避免设置或管理复杂的依赖关系。
  3. 专注于输入:Stubbing 强调为待测代码提供已知的输入,使测试人员可以专注于被测代码的逻辑和输出。

Python Stubbing 示例

以下是一个函数 get_user_from_db 的示例,它被桩化为始终返回一个预定义的用户字典。通过这种方式,测试无需与真实数据库进行交互,从而简化了设置并确保了结果的一致性:

python">from unittest.mock import patch

# 定义要被桩化的函数
def get_user_from_db(user_id):
   # 模拟一个复杂的数据库操作
   pass

# 使用桩测试函数
with patch('__main__.get_user_from_db', return_value={"name": "Prasad", "age": 25}):
   user = get_user_from_db("prasad_id")
   print(user)

输出:

{'name': 'Prasad', 'age': 25}

Mocking 和 Stubbing 的对比

通过比较 Mocking 和 Stubbing 的关键特性、目的和使用场景,开发者可以更清晰地了解何时使用每种方法。通过探索这些区别,开发者可以创建更高效和可维护的测试,从而最终提升软件质量。

Mocking 和 Stubbing 的区别

评估标准MockingStubbing
目的模拟真实对象的行为提供固定的、预定的响应
交互验证可以验证方法调用及参数通常不验证交互
复杂性更复杂;可以模拟各种行为更简单;专注于提供可控输入
使用场景隔离和测试具有复杂依赖的代码通过提供已知响应简化测试
行为记录记录方法的调用情况不记录交互
状态管理可以在调用之间保持状态通常无状态;返回固定输出
框架支持主要使用 unittest.mock 的 Mock 和 MagicMock 功能使用 unittest.mock 的 patch 进行简单替换
灵活性高度灵活;可以模拟异常和副作用灵活性有限;关注返回值

Mocking 适用于需要模拟复杂行为并验证交互的场景,而 Stubbing 则更适合需要简化测试设置并提供固定响应的场景。


http://www.niftyadmin.cn/n/5739027.html

相关文章

6.机器学习--PCA主成分分析(降维)

目录 1.问题的引入 为什么要降维? 降维的好处 降维的本质 2.降维的主要方法: 2.1 特征选择 2.2 特征抽取 3.主成分分析(PCA)推导 3.1.向量的表示及基变换 3.2.协方差矩阵及优化目标 3.3.算法及实例 3.4.实例 3.5.代…

Oceanbase学习之一迁移mysql数据到oceanbase

一、数据库环境 #mysql环境 root192.168.150.162 20:28: [(none)]> select version(); ---------- | version() | ---------- | 8.0.26 | ---------- 1 row in set (0.00 sec) root192.168.150.162 20:28: [(none)]> show variables like ‘%char%’; ---…

提交linux kernel patch流程

缩进 git commit 要求自动换行(按照社区具体已要求,内核要求75字符) git config --global core.editor "vim" ~/.vimrc 中写入 autocmd FileType gitcommit setlocal textwidth75 本地提交commit git commit -s -s会自动在结尾加上Signed-off-by&…

论负载均衡技术在Web系统中的应用

论负载均衡技术在Web系统中的应用 引言 在当今高并发的互联网环境中,负载均衡技术已经成为提升Web系统性能不可或缺的一环。通过有效地将请求分发到多个服务器上,负载均衡不仅能够提高系统的响应速度和处理能力,还能增强系统的可扩展性和稳…

w~自动驾驶合集11

我自己的原文哦~ https://blog.51cto.com/whaosoft/12329152 #特斯拉的“纯视觉”路线 , 也许不是最好的 BEVTransformer占用网络技术路线的大热,再次将激光雷达推向风口浪尖。 激光雷达该不该被抛弃? 对车企来说,这是一个艰难的抉择&am…

Windows 笔记本WiFi 功能消失解决办法

Windows 笔记本用户在使用 WiFi 时遇到功能突然消失的问题确实比较常见。这通常不是病毒造成的,而是其他几个常见原因所导致的。以下是一些可能的原因及解决方案: 视频教程【win10系统无网络,无wifi解决办法】 https://www.bilibili.com/vid…

Docker部署Portainer CE结合内网穿透实现容器的可视化管理与远程访问

文章目录 前言1. 本地安装Docker2. 本地部署Portainer CE3. 公网远程访问本地Portainer-CE3.1 内网穿透工具安装3.2 创建远程连接公网地址4. 固定Portainer CE公网地址前言 本篇文章介绍如何在Ubuntu中使用docker本地部署Portainer CE可视化管理工具,并结合cpolar实现公网远程…

Oracle Sql查询和性能优化(持续更新)

目录 索引优化 查询重写 EXISTS vs. IN 避免全表扫描 合理使用UNION操作符 优化子查询 执行计划分析 表设计优化 规范化与反规范化 分区表 存储参数调整 SGA配置 共享池 数据缓冲区 SGA自动管理 PGA配置 RAID配置 日志文件优化 性能诊断工具 AWR ASH 定期…