今天给大家推荐两款基本的Python模拟数据工具:mock和pytest monkeypatch。
为什么要模拟数据?
我们的应用中有一些部分需要依赖外部的库或对象。为了隔离开这部分,我们需要代替这些外部依赖,因而就用到了模拟数据。我们模拟外部的API来产生特定的行为,比如说返回符合之前定义的恰当的返回值。
模拟函数
我们有一个function.py的模块:
然后我们来看下如何将其与Mock库结合使用的:
这里发生了什么?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来完成此工作:
你能看到我使用monkeypatch.setattr来针对给定的函数设置返回值,同样我也需要在恰当的地方调用monkeypatch函数。
模拟类
我有一个名叫square的模块:
使用方法如下:
在第13行我对类Square进行patch,而15和16行表示了mocking的实例,首先mocked_instance是一个模拟对
象,针对mock.calculate_area我添加了return_value的值为1.在23行我使用MagicMock方法,它同样是一个标准的
mock类,只是它可以从一个给定的对象中检索出相应的方法。最后我使用patch.object来模拟Square类中的方法。
Pytest中代码如下:
这里的问题在于test_mocking_class_methods在python 3中工作正常,但是python 2中却不行。目前我还没有太想清楚这一点,希望你能帮助我!
所有的示例都能在这里找到。
顺便再给大家推荐一个Python视频教程:http://www.maiziedu.com/course/python/里面有各种Python基础知识讲解和Python开发项目,非常适合菜鸟和Python程序员看。