[pytest] pytest-mock簡單入門


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM