python的mock简单使用

https://docs.python.org/dev/library/unittest.mock.html
在单元测试中,可以使用mock模拟指定方法的返回

  • python2* 可以直接安装mock模块
  • python3* 集成到了unittest.mock中

被测代码:

#calc.py
class Calc:
    def add(self, a, b):
        return a + b

    def div(self, a, b):
        if b==0:
            return None
        else:
            return a/b

class Calc_Mock():

    def add(self, a, b):
        return (a+b)*2

通过mock使方法返回指定的值

import pytest
from unittest.mock import MagicMock
import requests
from src.calc import Calc, Calc_Mock

class TestCalc():
    def test_1(self):
       s = Calc()
       Calc.add = MagicMock(return_value=2) #当方法调用s.add()时返回 2
       print(s.add(1,2))
       assert s.add(1,2) == 2

在上面的test_1方法中,我们将类Calc的方法add的返回指定为=2
image.png

将方法a替换为方法b

class TestCalc():
    def test_2(self):
       s = Calc()
       s.add = MagicMock(return_value=2, side_effect=s.div) #当方法调用s.add()时返回 s.div()的执行结果
       print(s.add(8,2))
       assert s.add(8,2) == 4

在上面的test_2中我们将实例s的add方法替换为div方法,执行结果:
image.png
  • 注意:MagicMock(return_value=2, side_effect=s.div)如果return_valueside_effect同时存在,只有side_effect会生效

将类替换掉

class TestCalc():
    def test_3(self):
       Calc = MagicMock(side_effect=Calc_Mock) #当方法调用s.add()时返回 s.div()的执行结果
       s = Calc()
       print(s.add(4,2))
       assert s.add(1,2) == 6

将类Calc替换为类Calc_Mock,调用了Calc_Mock中的add方法,执行结果:
image.png

fixture中的mock

@pytest.fixture()
def mock_add(monkeypatch):
    def m_add(null,a,b):
        return a+b+3
    monkeypatch.setattr(Calc, "add", m_add)

@pytest.fixture()
def mock_mock_add(monkeypatch):
    monkeypatch.setattr(Calc, "add", Calc_Mock.add)

def test_5(mock_add):
    s = Calc()
    print(s.add(1,2))

def test_6(mock_mock_add):
    s = Calc()
    print(s.add(3,2))
  • 在test_5中,我们使用monkeypatch.setattr(Calc, "add", m_add)将类Calc中的add方法 替换为m_add
    执行结果为a+b+3:
    image.png
  • 在test_6中,我们将类Calc替换为Calc_Mock.add,执行结果为(a+b)*2
    image.png

fixture的mock还支持其他的一些操作
如何使用可以点击上面的setattr查看源码

  • delattr 删除一个方法
  • setitem 将字典某个key的value替换掉(不修改字典)
  • setenv 修改返回的环境变量

你可能感兴趣的:(python的mock简单使用)