如何为单个测试用例禁用设置autouse=True的pytest fixture?
禁用autouse fixture的解决方案
pytest没有直接的fixture=False这种开关语法,以下是两种原生支持的实现方案:
方案1:自定义标记控制(最推荐)
通过自定义测试标记判断是否执行fixture的补丁逻辑,对原有代码侵入小,可复用性高。
- 调整原有autouse fixture,加入标记判断逻辑:
@pytest.fixture(autouse=True) def patch_server_wrapper(monkeypatch, request): # 检测当前测试是否标记了跳过mock if request.node.get_closest_marker("no_mock_server"): yield return # 原有mock逻辑保持不变 def post_to_server_override(): class response: status_code = 200 return response() monkeypatch.setattr(server_wrapper, 'post_to_server', post_to_server_override)
- 给不需要该fixture的测试加上对应标记即可:
@pytest.mark.no_mock_server def test_server(): some_func_that_calls_server_and_actually_needs_to_hit_it()
方案2:主动撤销补丁(无需修改原有fixture)
如果不想调整已有的fixture代码,可以在需要真实请求的测试内主动撤销monkeypatch的改动:
def test_server(monkeypatch): # 清空所有monkeypatch改动,恢复原始方法 monkeypatch.undo() some_func_that_calls_server_and_actually_needs_to_hit_it()
注意:该方案会撤销当前测试上下文内所有monkeypatch操作,如果你有其他用monkeypatch打的补丁也会一起失效,仅适合只有单个monkeypatch的场景。
内容的提问来源于stack exchange,提问作者mareoraft
相关产品推荐
相关产品推荐

