百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Python 中 Mock 到底该怎么玩?一篇文章告诉你

off999 2024-12-27 15:59 38 浏览 0 评论

来源:AirPython

作者:星安果

1. 前言

微服务架构下,由于各类服务开发进度的不一致,导致联调工作经常会存在不确定性,进而导致项目延期

在实际工作中,为了保证项目进度,我们经常需要针对部分未完成模块及不稳定模块采用 Mock 方式,以验证已开发完的模块

本篇文章将介绍 Python 实现 Mock 的几种常见方式

2. Mock 介绍

Mock 测试:在测试验证过程中,对于那些尚未完成或不稳定的对象,用一个虚拟对象来替代,以便测试的测试方法

因此,这个虚拟的对象是 Mock 对象,Mock 对象是真实对象在调试期间的代替品

它的优势包含:

  • 前、后端并行开发
  • 模拟无法访问的资源
  • 隔离系统,避免脏数据干扰测试结果
  • 3.1 mock

    在 Python 3.3 之前使用 mock,需要先安装依赖

    # 安装mock依赖
    pip3 install mock

    假设 Product 类中有 2 个方法

  • get_product_status_by_id
  • buy_product
  • 其中,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

    3.2 unittest.mock

    Python 3.3 之后,mock 作为标准库,已经内置到 unittest 中了

    还是以 3.1 的场景为例,使用 unittest 编写一个测试用例

    Mock 步骤如下:

  • 导入 unittest 框架中的 mock 文件
  • 实例化 Product 对象
  • mock.Mock(return_value=*) 方法对 get_product_status_by_id 方法进行 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()

    3.3 pytest.mock

    相比 unittest,pytest 由于强大的插件支持,用户群体可能更大!

    如果项目本身使用的框架是 pytest,则 Mock 更建议使用 pytest-mock 这个插件

    # pytest依赖
    pip3 install pytest

    Mock 步骤如下:

  • 使用 pytest 编写测试方法,参数为 mocker
  • 实例化 Product 对象
  • 使用 mocker.patch() 方法对 get_product_status_by_id 方法进行 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 对象的完整路径

    4. 最后

    文中对 Python 中常见的 Mock 方案进行了讲解,实际应用中,建议根据项目实际情况进行选型。

    如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!

    相关推荐

    win10系统下载的内容在哪(win10下载的软件在哪个文件夹)

    进入C:\Windows\SoftwareDistribution\Download目录下,通过win10应用商店中下载的安装包都放在此目录下。进入C:\Windows\SoftwareDistrib...

    下载原版xp系统光盘(xp光盘系统安装教程怎么安装)

    方法步骤步骤如下:1、首先打开计算机,在电脑光驱上放入XP光盘,启动电脑后不停按F12、F11、Esc等启动热键,在弹出的启动菜单中选择DVD选项,回车。2、进入光盘主菜单,按数字2或点击选项2运行w...

    windows7中文版下载安装(windows7安装包下载)

    谢邀,如果你戳设置-时间和语言-区域和语言,右边的语言提示“只允许使用一种语言包”,那么你的系统就是家庭中文版。家庭中文版限定系统界面只能使用简体中文显示,其他功能则与普通家庭版没有区别,也可以使用其...

    win7开机按f2怎么重装系统(win7开机按f12怎么重装系统)

    开机或重启时,在进入Windows前按F2进入BIOS。  ←→移动到第三个好像是BOOT。  然后将EXTENELBOOT选项设置为ENABLE  最后按F5将第一启动项目设置为EXTENEL...

    win10驱动管理(win10驱动程序)
    win10驱动管理(win10驱动程序)

    win10由于联网后会自动安装驱动,如果自动安装驱动没出现问题,即可视为最佳驱动,若出现问题,卸载出问题的驱动,然后去查自己主板型号,在主板供应商官网下载对应驱动即是最佳01Windows10驱动更新调整当前当你插入连接即插即用(Pn...

    2025-12-29 05:51 off999

    手机上怎么找qq邮箱登录(用手机怎么找到qq邮箱)

    入口是“联系人”选项卡。qq邮箱手机在QQ主菜单中选择下方的“联系人”选项卡;3、在“联系人”中选取“公众号”选项卡;4、在公众号中菜单中找到或搜索“QQ邮箱提醒”,点击进入;5、点击“进入邮箱”;6...

    amd显卡控制面板

    AMD显卡控制面板是用来管理你的AMD显卡的,可以在控制面板中进行设置一些简单的调整,来提升显卡性能和效果。1、先打开AMD控制面板。2、打开“垂直同步(V-SYNC)”功能,可调整细节,改善影像流畅...

    win10老是未响应卡死(window10总是未响应)

    具体方法:1、如果win10中的应用程序出现不响应的情况,应该是应用程序加载失败了。可以通过重置方法来解决win10应用程序无响应。2、登录win10系统,用管理员身份运行Powershell(可在C...

    usb安装系统步骤(USB安装系统步骤)

    1.准备一张U盘,将联想官网下载的系统镜像文件复制到U盘中;2.将U盘插入联想S41U电脑,重启电脑,按F12进入BIOS设置,将U盘设置为启动项;3.重启电脑,进入U盘安装界面,按提示操作,完成系统...

    win98安装教程(win98iso怎么安装)

    如何安装windows98  一、具体安装步骤  备份好重要文件之后,就可以安装windows98了。  第一步:启动安装程序。  用户如果原来已安装了windows95/97/98,现在拟对其进行升...

    雨林木风win7安装(雨林木风win732位安装教程)

      安装步骤如下:  1、光盘放入光驱,复制光盘上的win7.gho和安装系统.exe到硬盘非C盘的文件夹;(gho文件名可以是其他名字,后缀为gho,体积最大的就是。)  2、双击安装系统.exe;...

    win10解绑管理员账户(win10管理员账户怎么取消开机密码)

    要解除Windows10电脑上的管理员权限,您需要进行以下操作:1.打开“控制面板”:右键单击“开始”按钮,然后选择“控制面板”。2.进入“用户账户”:在控制面板中,选择“用户账户”。3.点击...

    win10家庭版没有组策略编辑器

    Win10组策略编辑器找不到怎么办  解决方法  一、win10系统版本本身不提供组策略的功能。  1、运行gpedit.msc直接提示找到gpedit.msc(组策略)。  2、运行MMC,在“添加...

    tplogin管理员登录入口(tplogin重新设置密码)

    tplogin.cn是新版tplink路由器的登录地址(管理页面地址),在浏览器中输入tplogin.cn,就可以打开tplink路由器的管理页面(登录页面)。具体的登录方法如下:1、打开电脑上的浏...

    psp模拟器怎么导入游戏(psp模拟器怎么导入游戏 Vivo手机)

    方法如下:1、打开能操作文件的助手软件,用pp链接后点击左下文件,然后点常用目录下的程序用户,会出现ppsspp的文件夹。2、打开ppsspp文件夹,会出来四个选项文件夹,第一个进去后是psp文件夹,...

    取消回复欢迎 发表评论: