如何为带some_marker标记的pytest测试自动添加some_fixture
自动为带标记的pytest测试绑定fixture
你当前的实现需要手动在测试函数参数中指定some_fixture,可以通过以下两种方式实现自动绑定,无需手动传入fixture参数:
方法一:利用autouse自动触发fixture
修改conftest.py中的some_fixture,设置autouse=True,并在fixture内部判断当前测试是否带有目标标记,仅当存在标记时执行上下文操作:
# conftest.py class ContextManager: def __init__(self, some_args): self.some_args = some_args def __enter__(self): # 执行测试前的操作 pass def __exit__(self, exc_type, exc_val, exc_tb): # 执行测试后的操作 pass @pytest.fixture(autouse=True) def some_fixture(request): marker = request.node.get_closest_marker("some_marker") if not marker: yield return some_args = marker.kwargs.get("some_args") with ContextManager(some_args): yield def pytest_configure(config): config.addinivalue_line("markers", "some_marker(some_args): 标记需要执行特定前后操作的测试")
修改后,测试代码无需手动传入some_fixture参数,只要标记了@pytest.mark.some_marker就会自动触发fixture逻辑:
# module_test.py import pytest @pytest.mark.some_marker(some_args=[...]) def test_function(): # 测试逻辑 pass
方法二:通过钩子函数修改测试依赖
如果不想让fixture全局自动触发,可使用pytest_collection_modifyitems钩子,在测试收集阶段为带标记的测试自动添加fixture依赖:
# conftest.py class ContextManager: def __init__(self, some_args): self.some_args = some_args def __enter__(self): # 执行测试前的操作 pass def __exit__(self, exc_type, exc_val, exc_tb): # 执行测试后的操作 pass @pytest.fixture def some_fixture(request): some_args = request.node.get_closest_marker("some_marker").kwargs.get("some_args") with ContextManager(some_args): yield def pytest_configure(config): config.addinivalue_line("markers", "some_marker(some_args): 标记需要执行特定前后操作的测试") def pytest_collection_modifyitems(items): for item in items: if item.get_closest_marker("some_marker"): # 为测试添加some_fixture依赖 item.fixturenames.append("some_fixture")
测试代码同样无需手动传入fixture参数:
# module_test.py import pytest @pytest.mark.some_marker(some_args=[...]) def test_function(): # 测试逻辑 pass
内容的提问来源于stack exchange,提问作者Kirill Lekhov
相关产品推荐
相关产品推荐

