什么是mock
写测试写到一定程度,就会发现,不做mock是不行的, 一个长达5个小时的计算代码,总不能每次测试都跑一次吧?
这个时候我们就需要mock住代码
所谓mock,简单理解就是模拟代码的行为, 并不真正运行代码本身,从而能够减少重复测试,减少测试的时间.
pytest-mock
python自带的单元测试库是unittest,有对应的unittest.mock 可以来进行mock.
pytest对应的mock就是pytest-mock module.
我个人更加喜欢使用pytest, pytest里的mocker也相对简单一些, 大部分unittest.mock的接口, mocker都是支持的.
比如mocker.patch() 和mock 的patch接口是一样的, 参考 https://docs.python.org/3/library/unittest.mock.html#patch
Mocker
Assert
{mock}.assert_not_called()
{mock}.assert_called()
{mock}.assert_called_with()
{mock}.assert_called_once()
{mock}.assert_called_once_with()
{mock}.assert_has_calls()
{mock}.assert_any_call()
使用方法举例
import os def tt(): os.remove('fake_path') class TestTry: def test_tt(self): remove = mocker.patch('os.remove') tt() remove.assert_called_once()
注意你引入的mock的module不一定要是一个第三方包,也可以是你自己的python代码, 比如mypython.py, 使用 'import mypython'
这样就可以测试你自己写的代码.
patch的必须是一个已经存在的东西,可以使用{module}.{function}来调用的这种.
如果想要mock你的py代码引用的module里的function,则需要在你的py代码里使用 'from module import function',在测试代码里就可以使用 mypython.function 来对其进行mock
测试代码 mypython_test.py
import mypython def test_mypython(mocker): remove = mocker.patch('mypython.remove') mypython.main() remove.assert_called_once()
你的代码 mypython.py
from os import remove def main(): remove('fake_path')