gpt4 book ai didi

python - 如何根据测试的固定装置签名动态地将新固定装置添加到测试中

转载 作者:太空宇宙 更新时间:2023-11-03 14:37:56 26 4
gpt4 key购买 nike

所以我想实现的是使用 pytest 自动模拟各个模块中的函数。所以我在 conftest.py 中定义了这个:

import sys
import __builtin__
from itertools import chain


# Fixture factory magic START
NORMAL_MOCKS = [
"logger", "error", "logging", "base_error", "partial"]
BUILTIN_MOCKS = ["exit"]


def _mock_factory(name, builtin):
def _mock(monkeypatch, request):
module = __builtin__ if builtin else request.node.module.MODULE
ret = Mock()
monkeypatch.setattr(module, name, ret)
return ret
return _mock


iterable = chain(
((el, False) for el in NORMAL_MOCKS),
((el, True) for el in BUILTIN_MOCKS))
for name, builtin in iterable:
fname = "mock_{name}".format(name=name)
_tmp_fn = pytest.fixture(name=fname)(_mock_factory(name, builtin))
_tmp_fn.__name__ = fname
setattr(
sys.modules[__name__],
"mock_{name}".format(name=name), _tmp_fn)
# Fixture normal factory magic END

这一切都有效,但我想省略 NORMAL_MOCKSBUILTIN_MOCKS 列表的使用。所以基本上在 pytest Hook 中,我应该能够看到有一个 mock_foo 固定装置,但它尚未注册,因此我使用工厂为其创建一个模拟并注册它。我只是不知道该怎么做。基本上我正在研究 pytest_runtest_setup 函数,但无法弄清楚如何进行实际的装置注册。所以基本上我想知道我可以通过哪个钩子(Hook)/调用从这个钩子(Hook)以编程方式注册新的装置函数。

最佳答案

其中一种方法是在收集/生成阶段参数化测试,即在测试执行开始之前:https://docs.pytest.org/en/latest/example/parametrize.html

# conftest.py 
import pytest

def mock_factory(name):
return name

def pytest_generate_tests(metafunc):
for name in metafunc.fixturenames:
if name.startswith('mock_'):
metafunc.parametrize(name, [mock_factory(name[5:])])

# test_me.py
def test_me(request, mock_it):
print(mock_it)

一个非常简单的解决方案。但缺点是测试被报告为参数化,但实际上并非如此:

$ pytest -s -v -ra
====== test session starts ======

test_me.py::test_me[it] PASSED

====== 1 passed in 0.01 seconds ======
<小时/>

要在没有参数化的情况下完全模拟函数 args,您可以使用一个不太明显的技巧:

# conftest.py
import pytest

def mock_factory(name):
return name

@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_protocol(item, nextitem):
for name in item.fixturenames:
if name.startswith('mock_') and name not in item.funcargs:
item.funcargs[name] = mock_factory(name[5:])
yield

pytest_runtest_setup 钩子(Hook)也是一个好地方,只要我刚刚尝试过。

请注意,在这种情况下您不会注册灯具。对于灯具注册来说为时已晚,因为所有灯具都在收集/参数化阶段更早地收集和准备。在此阶段,您只能执行测试并提供值。您有责任计算 fixture 值并随后销毁它们。

关于python - 如何根据测试的固定装置签名动态地将新固定装置添加到测试中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46774636/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com