什么是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')