京公网安备 11010802034615号
经营许可证编号:京B2-20210330
来源:AirPython
作者:星安果
1. 前言
微服务架构下,由于各类服务开发进度的不一致,导致联调工作经常会存在不确定性,进而导致项目延期
在实际工作中,为了保证项目进度,我们经常需要针对部分未完成模块及不稳定模块采用 Mock 方式,以验证已开发完的模块
本篇文章将介绍 Python 实现 Mock 的几种常见方式
Mock 测试:在测试验证过程中,对于那些尚未完成或不稳定的对象,用一个虚拟对象来替代,以便测试的测试方法
因此,这个虚拟的对象是 Mock 对象,Mock 对象是真实对象在调试期间的代替品
它的优势包含:
在 Python 3.3 之前使用 mock,需要先安装依赖
# 安装mock依赖
pip3 install mock
假设 Product 类中有 2 个方法
其中,get_product_status_by_id 方法还没有实现;buy_product 方法依赖于
get_product_status_by_id 方法的返回值
# product_impl.py
class Product(object):
def __init__(self):
pass
def get_product_status_by_id(self, product_id):
"""
通过商品id获取产品信息(Mock)
:return:
"""
# 待实现查询数据库的业务逻辑
pass
def buy_product(self, product_id):
"""
购买产品(真实逻辑)
:return:
"""
# 产品信息
# {"id":1,"name":"苹果","num":23}
product = self.get_product_status_by_id(product_id)
if product.get("num") >= 1:
result = {"status": 0, "msg": "购买成功!"}
else:
result = {"status": 1, "msg": "购买失败,库存不足!"}
return result
Mock 的步骤如下:
导入使用 mock 中的 patch 方法作为测试方法的装饰器,对 get_product_status_by_id
方法进行 Mock,方法参数为 Mock 对象测试方法中,对该 Mock 对象设置一个返回值调用并断言from
mock import patch from mock_.product_impl import Product @patch('mock_.product_impl
.Product.get_product_status_by_id') def test_succuse(mock_get_product_status_by_id):
# Mock方法,指定一个返回值 mock_get_product_status_by_id.return_value =
{"id": 1, "name": "苹果", "num": 23}
product = Product()
assert product.buy_product(1).get("status") == 0 需要注意的是,
Mock 此方法的时候,必须制定该方法的完整路径使用 @patch.object 同样能完成 Mock,
不同的是,@patch.object 包含 2 个参数第一个参数为该方法所在的类;第二个参数为方法名from
mock import patch from mock_.product_impl import Product # Mock一个方法 # @patch.object:
对象、方法名 @patch.object(Product, 'get_product_status_by_id') def test_succuse
(mock_get_product_status_by_id):
# Mock方法,指定一个返回值 mock_get_product_status_by_id.return_value =
{"id": 1, "name": "苹果", "num": 23}
product = Product()
assert product.buy_product(1).get("status") == 0
Python 3.3 之后,mock 作为标准库,已经内置到 unittest 中了
还是以 3.1 的场景为例,使用 unittest 编写一个测试用例
Mock 步骤如下:
import unittest
from unittest import mock
from unittest_mock.product_impl import Product
class TestProduct(unittest.TestCase):
def test_success(self):
# 成功结果
mock_success_value = {"id": 1, "name": "苹果", "num": 23}
product = Product()
product.get_product_status_by_id = mock.Mock(return_value=mock_success_value)
# 调用实际函数
assert product.buy_product(1).get("status") == 0
if __name__ == "__main__":
unittest.main()
相比 unittest,pytest 由于强大的插件支持,用户群体可能更大!
如果项目本身使用的框架是 pytest,则 Mock 更建议使用 pytest-mock 这个插件
# pytest依赖
pip3 install pytest
Mock 步骤如下:
import pytest
from pytest_mock_.product_impl import Product
def test_buy_product_success(mocker):
"""
购买成功Mock
:param mocker:
:return:
"""
# 实例化一个产品对象
product = Product()
# 对Product中的方法的返回值进行Mock
mock_value = {"id": 1, "name": "苹果", "num": 23}
# Mock方法
# 注意:需要指定方法的完整路径
# mocker.patch 的第一个参数必须是模拟对象的具体路径,第二个参数用来指定返回值
product.get_product_status_by_id = mocker.patch("product_impl.Product.get_product_status_by_id",
return_value=mock_value)
# 调用购买产品的方法
result = product.buy_product(1)
assert result.get("status") == 0
需要注意的是,mocker.patch 方法第一个参数必须是 Mock 对象的完整路径
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
在Python面向对象编程(OOP)中,类方法是构建模块化、可复用代码的核心载体,也是实现封装、继承、多态特性的关键工具。无论是 ...
2026-02-27在MySQL数据库优化中,索引是提升查询效率的核心手段—— 面对千万级、亿级数据量,合理创建索引能将查询时间从秒级压缩到毫秒级 ...
2026-02-27在数字化时代,企业积累的海量数据如同散落的珍珠,若缺乏有效的梳理与分类,终将难以发挥实际价值。CDA(Certified Data Analys ...
2026-02-27在问卷调研中,我们常遇到这样的场景:针对同一批调查对象,在不同时间点(如干预前、干预后、随访期)发放相同或相似的问卷,收 ...
2026-02-26在销售管理的实操场景中,“销售机会”是核心抓手—— 从潜在客户接触到最终成交,每一个环节都藏着业绩增长的关键,也暗藏着客 ...
2026-02-26在CDA数据分析师的日常工作中,数据提取、整理、加工是所有分析工作的起点,而“创建表”与“创建视图”,则是数据库操作中最基 ...
2026-02-26在机器学习分析、数据决策的全流程中,“数据质量决定分析价值”早已成为行业共识—— 正如我们此前在运用机器学习进行分析时强 ...
2026-02-25在数字化时代,数据已成为企业决策、行业升级的核心资产,但海量杂乱的原始数据本身不具备价值—— 只有通过科学的分析方法,挖 ...
2026-02-25在数字化时代,数据已成为企业核心资产,而“数据存储有序化、数据分析专业化、数据价值可落地”,则是企业实现数据驱动的三大核 ...
2026-02-25在数据分析、机器学习的实操场景中,聚类分析与主成分分析(PCA)是两种高频使用的统计与数据处理方法。二者常被用于数据预处理 ...
2026-02-24在聚类分析的实操场景中,K-Means算法因其简单高效、易落地的特点,成为处理无监督分类问题的首选工具——无论是用户画像分层、 ...
2026-02-24数字化浪潮下,数据已成为企业核心竞争力,“用数据说话、用数据决策”成为企业发展的核心逻辑。CDA(Certified Data Analyst) ...
2026-02-24CDA一级知识点汇总手册 第五章 业务数据的特征、处理与透视分析考点52:业务数据分析基础考点53:输入和资源需求考点54:业务数 ...
2026-02-23CDA一级知识点汇总手册 第四章 战略与业务数据分析考点43:战略数据分析基础考点44:表格结构数据的使用考点45:输入数据和资源 ...
2026-02-22CDA一级知识点汇总手册 第三章 商业数据分析框架考点27:商业数据分析体系的核心逻辑——BSC五视角框架考点28:战略视角考点29: ...
2026-02-20CDA一级知识点汇总手册 第二章 数据分析方法考点7:基础范式的核心逻辑(本体论与流程化)考点8:分类分析(本体论核心应用)考 ...
2026-02-18第一章:数据分析思维考点1:UVCA时代的特点考点2:数据分析背后的逻辑思维方法论考点3:流程化企业的数据分析需求考点4:企业数 ...
2026-02-16在数据分析、业务决策、科学研究等领域,统计模型是连接原始数据与业务价值的核心工具——它通过对数据的规律提炼、变量关联分析 ...
2026-02-14在SQL查询实操中,SELECT * 与 SELECT 字段1, 字段2,...(指定个别字段)是最常用的两种查询方式。很多开发者在日常开发中,为了 ...
2026-02-14对CDA(Certified Data Analyst)数据分析师而言,数据分析的核心不是孤立解读单个指标数值,而是构建一套科学、完整、贴合业务 ...
2026-02-14