前言:
嗨喽~大家好呀,这里是魔王呐 ❤ ~!
python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取
在测试并行开发(TPD)中,代码开发是第一位的。
尽管如此,我们还是要写出开发的测试,并执行它们来验证代码的准确性(而不是直接运行代码或使用控制台)。
在Python中,我们有一个叫做单元测试的过程,里面有mock 和patch 函数。
这篇文章将讨论这两个角色的用途和区别。
Mock 和Patch 对象库的用途和区别
在这篇文章中,我们不会把单元测试作为一个整体来处理,而是更多地关注于mock 和patch 函数。
我们使用mock Python包,用mock 对象替换你的被测系统的特定组件,并对它们的使用进行断言。
它是Python标准库的一个组成部分,从Python 3.3开始可以作为unittest.mock 。
unittest.mock 类消除了在整个测试套件中对几个存根的需要。
在执行了一个特定的动作后,我们可以设置关于我们使用了哪些方法/属性以及我们调用它们的参数的断言。
它让我们指定返回值并选择需要的功能。
MagicDock可以处理Magic 对象,它是Mock 的子类。
Mock 和MagicMock 对象在我们使用它们时自发地产生特性和方法,并记录使用信息。
嘲讽是基于action -> assertion (即先让mock 被使用,然后对它收到的调用进行断言)模式,而不是许多嘲讽框架使用的record -> replay 模式。
此外,mock 模块提供了一个叫做patch() 的装饰器,它负责在测试的上下文中修补类和模块级别的特性,并提供了一个用于产生唯一实例的哨兵。
示例代码:
from unittest.mock import patch
@patch('sample_module.sample_object')
def test_function(mock_object):
print(mock_object)
输出:
<MagicMock name='sample_object' id='1870192341512'>
上面的代码片段等同于下面的代码片段:
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:926207505
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def test_function():
with patch('sample_module.sample_module') as mock_object:
print(mock_object)
该函数允许我们用mock 对象替换任何对象,以避免调用生产代码,并检查原始对象如何被调用(如果该对象是一个函数)。
使用patch (或类似的方法)是首选,因为这可以确保补丁在测试后被还原(或在第二种情况下在上下文管理器范围后被还原),这样其他测试或程序就不会受到影响。
结论
我们可以注意到以下几点来帮助我们的决策:
-
为了方便地用mock 对象(或其他对象)来替代对象,并在完成后恢复之前的状态,
或者在出现异常的情况下,使用patch 装饰器/上下文管理器函数。
-
mock.patch 创建mock 或衍生对象,我们可以手工制作。
手动构建的只用于修复本地函数或其他不需要重置的模拟。
尾语
最后感谢你观看我的文章呐~本次航班到这里就结束啦 🛬
希望本篇文章有对你带来帮助 🎉,有学习到一点知识~
躲起来的星星🍥也在努力发光,你也要努力加油(让我们一起努力叭)。