use*_*046 6 python testing unit-testing mocking
首先,我真的很想了解为什么我应该使用模拟(Python Mock 库)。
快速制作一个小对象来测试某些东西和使用模拟对象有什么区别?
与其他方法相比,模拟有哪些优点(我真的需要一些“实时”示例来理解这个方法)?在某些情况下嘲笑是必要的吗?
另外:模拟对象和 magicmock 对象有什么区别?他们如何连接?
第二件事是模拟什么/在哪里。
例如,我应该只模拟数据库查询结果吗?我的意思是:模拟数据是否应该始终是远程数据?
tl;dr:请向从未在任何语言中使用过 Python 的人解释一下 Python 中的模拟概念。
模拟对象旨在快速、轻松地表示一些复杂的对象,而无需在测试期间手动检查并为该对象设置存根。它只是一个有用的实用程序,可以使编写测试变得更容易一些。
至于模拟什么/在哪里模拟,被测模块外部的任何东西都应该被模拟。您想要测试的只是当前模块代码,而不是被测试模块正在调用的某些模块的代码。
一个简单的例子是一些使用该simplejson模块的代码。
import simplejson
def my_fn(args):
return simplejson.dumps({'args': args})
Run Code Online (Sandbox Code Playgroud)
您想要测试的只是该函数my_fn是否正确调用simplejson.dumps(),以便您模拟simplejson。您并不真正关心传递给的对象是否simplejson正确转换为 json 作为模块范围内的测试simplejson(模块有自己的一组测试,如果您愿意的话可以运行)。
import working_code
import mock
@mock.patch('working_code.simplejson')
def test_my_fn(mock_simplejson):
working_code.my_fn('test-args')
mock_simplejson.dumps.assert_called_with({'args': 'test-args'})
Run Code Online (Sandbox Code Playgroud)
请注意,这mock.patch只是为特定测试注入和删除模拟的一种好方法。test_my_fnrun后,working_code.simplejson返回到函数调用前的状态。如果这令人困惑,您可以将测试示例视为:
import working_code
import mock
def test_my_fn():
mock_simplejson = mock.Mock()
working_code.simplejson = mock_simplejson
working_code.my_fn('test-args')
mock_simplejson.dumps.assert_called_with({'args': 'test-args'})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1030 次 |
| 最近记录: |