[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