python - 如何为多个测试打补丁
问题描述
考虑我的模块"mymodule.py"
# contents of "mymodule.py"
def func1(x):
return x * 2
我想模拟这个函数并改变它的返回。根据文档,我可以这样做:
# contents of "test_mymodule.py"
import mymodule
import pytest
@pytest.fixture
def mock_func1():
def mock_ret(*args, **kwargs):
return 2
def test_func1_a(monkeypatch, mock_func1):
monkeypatch.setattr(mymodule, "func1", mock_func1)
assert mymodule.func1(1) == 2
def test_func1_b(monkeypatch, mock_func1):
monkeypatch.setattr(mymodule, "func1", mock_func1)
assert mymodule.func1(1) != 37
但是,我不想为每个测试修补模块。monkeypatch.setattr
对整个测试模块的范围进行一次的正确方法是什么test_mymodule.py
?
我期待这样的事情
# contents of "test_mymodule.py"
import mymodule
import pytest
@pytest.fixture
def mock_func1():
def mock_ret(*args, **kwargs):
return 2
monkeypatch.setattr(mymodule, "func1", mock_func1)
def test_func1_a():
assert mymodule.func1(1) == 2
def test_func1_b():
assert mymodule.func1(1) != 37
但这让我
NameError: name 'monkeypatch' is not defined
解决方案
刚刚遇到这个答案,因为我正在尝试做类似的事情。您可以使用这样的装饰器对测试进行预处理。可以在装饰器下方添加其他 pytest 装饰mock_func_1_in_test
器。
# contents of "test_mymodule.py"
import mymodule
import pytest
@pytest.fixture
def mock_func1():
def mock_ret(*args, **kwargs):
return 2
return mock_ret
def mock_func_1_in_test(func):
def inner(monkeypatch, mock_func1, *args, **kwargs):
monkeypatch.setattr(mymodule, "func1", mock_func1)
return func(*args, **kwargs)
return inner
@mock_func_1_in_test
def test_func1_a():
assert mymodule.func1(1) == 2
@mock_func_1_in_test
def test_func1_b():
assert mymodule.func1(1) != 37
这如您所料:
$ pytest
================================== test session starts ===================================
platform darwin -- Python 3.6.6, pytest-3.6.0, py-1.6.0, pluggy-0.6.0
rootdir: /Users/delgadom/git/messin/pytest_test, inifile:
plugins: cov-2.5.1
collected 2 items
test_mymodule.py .. [100%]
================================ 2 passed in 0.03 seconds ================================
推荐阅读
- python-3.x - 从 python 脚本登录到 rsyslog 工具
- python - 当输出的矩阵维度的大小与标签的大小不匹配时,如何计算神经网络中的误差?
- python - 如何在python中将数组的列向上或向下移动一行?
- php - 登录后PHP不显示用户名
- assembly - orpd 等 SSE2 指令的意义何在?
- javascript - 请求失败,状态码 404 错误
- java - 为什么if条件总是假的?
- azure-devops - 更新托管机器上的 Xcode 版本
- python - 如何使用 scikit learn 将大型时间序列拆分为多个样本?
- apache-spark - Spark SQL对数据源的封装