一、什么是mock?

  • mock翻译过来有模拟的意思。主要功能是使用mock对象替代掉指定的python对象,以达到模拟对象的行为的目的。
  • 在python里面mock是辅助单元测试的一个模块,在2.x版本里面属于单独的模块,在python3以后已经集成到了unittest模块当中。

二、使用场景

  • 解决依赖:当测试某个接口或者功能模块时,如果被测接口所依赖的其他接口并没有开发完成,这个时候我们就可以使用mock来模拟依赖接口的返回,进行提前测试。
  • 模拟复杂业务接口:如果测试的某个功能,涉及其他系统,而其他系统测试数据构造相对复杂,该系统并不在本次迭代范围以内。此时可以使用mock来模拟这个复杂系统来降低测试成本提高测试效率。
  • 外部接口联调:当测试过程中需要与第三方公司联调,但是测试环境并没有打通的时候,此时可以根据第三方公司的接口文档来mock各种场景,提前进行我方系统的测试。

三、简单使用

导入模块

from unittest import mock

使用mock模拟函数返回
from unittest import mock
def test01():
    """
    test01函数并未实现,通过mock来模拟该函数的返回
    :return:
    """
    pass

test01 = mock.Mock(return_value=100) 创建Mock对象, 作为Test01的实例方法
print(test01()) 当调用test01方法时, 会返回定义Mock对象时指定的return_value值
输出:100
跟据不同传参返回不同的值
from unittest import mock
def test01():
    """
    根据传参模拟不同返回值
    :return:
    """
    pass

def test02(data):
    mock_data={
        "demo01":"支付中",
        "demo02":"支付成功",
        "demo03":"支付失败"
    }
    return mock_data[data]
test01 = mock.Mock(side_effect=test02)
print(test01("demo02"))
输出:支付成功
函数传参个数检查
from unittest import mock
def test01(x,y,z):
    pass
传参符合规范返回success,否则报错
test01=mock.create_autospec(test01,return_value="success")
print(test01(1,2,3))
输出:success
@path.object()装饰器使用
新建mymock.py
def test01():
    print("啥也不干")


新建demo01.py文件
from unittest.mock import patch
import mymock

@patch.object(target=mymock,attribute="test01")
def test02(mock_fun):
    """
    函数内调用模拟方法并返回模拟值
    demo01:类名称/模块名称
    "test01":被模拟的方法
    mock_fun:接收被模拟的函数
    """
    mock_fun.return_value={'status_code':'200'} 为mock对象设置返回值
    result = mymock.test01() 调用函数就相当于调用mock对象
    print(result)
test02()
输出:{'status_code':'200'}
总结
  • mock还有很多自带方法,而且功能非常强大,但是对于我们测试工程师而言,掌握这几个mock方法,平时工作中就足够了。本篇文章仅介绍mock的常用方法,其他方法感兴趣的同学可以去看官方文档。
  • 官方文档地址:https://docs.python.org/3/library/unittest.mock.html