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
将方法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方法,执行结果:
- 注意:
MagicMock(return_value=2, side_effect=s.div)
如果return_value
与side_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方法,执行结果:
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: - 在test_6中,我们将类Calc替换为Calc_Mock.add,执行结果为(a+b)*2
fixture的mock还支持其他的一些操作
如何使用可以点击上面的setattr
查看源码
- delattr 删除一个方法
- setitem 将字典某个key的value替换掉(不修改字典)
- setenv 修改返回的环境变量