Python中mock及monkeypatch工具

版权声明:此文章转载自麦穗技术

如需转载请联系听云College团队成员阮小乙,邮箱:ruanqy#tingyun.com

首先,我想向大家推荐两款基本的模拟数据的工具:mock和pytest monkeypatch。

为什么要模拟数据?

我们的应用中有一些部分需要依赖外部的库或对象。为了隔离开这部分,我们需要代替这些外部依赖,因而就用到了模拟数据。我们模拟外部的API来产生特定的行为,比如说返回符合之前定义的恰当的返回值。

模拟函数

我们有一个function.py的模块:

99.1121.jpg

然后我们来看下如何将其与Mock库结合使用的:

99.3343.jpg

这里发生了什么?1-4行是为了兼容python 2和3来引入的代码,在python 3中mock是一个标准库,而在python 2中你需要手动安装(pip install mock)。

在第13行对square函数调用mock的Patch方法,一定要在使用该函数的地方调用patch方法。比如,我将在程序自身中调用square(5)函数,因而我在__main__中使用patch,举例来说python tests/test_function.py。而如果我使用pytest的话,那么我将使用test_function.square来替换此处的__main__.square。

在第18-19行,我针对square和cube方法调用了patch函数,因为它们将在main函数中被使用。最后的两个assert语句是为了确保mock被恰当地使用。

同样也可以用monkeypatching来完成此工作:

980.jpg

你能看到我使用monkeypatch.setattr来针对给定的函数设置返回值,同样我也需要在恰当的地方调用monkeypatch函数。

模拟类

我有一个名叫square的模块:

98765.jpg

使用方法如下:

0989.jpg

在第13行我对类Square进行patch,而15和16行表示了mocking的实例,首先mocked_instance是一个模拟对象,针对mock.calculate_area我添加了return_value的值为1.在23行我使用MagicMock方法,它同样是一个标准的mock类,只是它可以从一个给定的对象中检索出相应的方法。最后我使用patch.object来模拟Square类中的方法。

Pytest中代码如下:

00981.jpg

这里的问题在于test_mocking_class_methods在python 3中工作正常,但是python 2中却不行。目前我还没有太想清楚这一点,希望你能帮助我!

所有的示例都能在这里找到。

英文原文:http://krzysztofzuraw.com/blog/2016/mocks-monkeypatching-in-python.html

译者:meyshine

想阅读更多技术文章,请访问听云技术博客,访问听云官方网站感受更多应用性能优化魔力。

关于作者

阮小乙

人生就该充满正能量!

我要评论

评论请先登录,或注册