如何创建带默认参数的自定义pytest flaky_screenshot标记?
解决pytest自定义截图重试标记无效的问题
你的自定义flaky_screenshot标记无效,核心原因是:你定义的普通函数无法被pytest标记系统正确识别并关联到flaky的重试逻辑上。以下是两种可行的修复方案:
方案1:直接创建预配置的标记实例(最简方案)
这种方式直接生成包含默认重试参数的flaky标记实例,无需额外钩子处理。
修改conftest.py:
import pytest # 预配置好重试规则的自定义标记 flaky_screenshot = pytest.mark.flaky( reruns=3, reruns_delay=1, only_rerun="Failed: --> Snapshots DO NOT match!" )
保留pytest.ini的标记描述(用于--markers命令展示说明):
[pytest] markers = flaky_screenshot: mark test to rerun flaky screenshots
测试用例中使用时不需要加括号:
@pytest.mark.flaky_screenshot def test_foo(page: Page, assert_snapshot): assert_snapshot(page.screenshot())
方案2:用装饰器函数实现(支持自定义参数扩展)
如果需要后续灵活调整重试参数,可以用带参数的装饰器实现:
修改conftest.py:
import pytest def flaky_screenshot(func=None, reruns=3, reruns_delay=1, only_rerun="Failed: --> Snapshots DO NOT match!"): def decorator(test_func): return pytest.mark.flaky( reruns=reruns, reruns_delay=reruns_delay, only_rerun=only_rerun )(test_func) # 处理带参数和不带参数的两种调用方式 if func is None: return decorator return decorator(func)
测试用例可以两种方式使用:
# 使用默认重试参数 @flaky_screenshot def test_foo(page: Page, assert_snapshot): assert_snapshot(page.screenshot()) # 自定义重试参数(按需调整) @flaky_screenshot(reruns=5, reruns_delay=2) def test_bar(page: Page, assert_snapshot): assert_snapshot(page.screenshot())
原方案无效的原因
你之前在conftest.py中定义的flaky_screenshot是普通函数,当用@pytest.mark.flaky_screenshot()调用时,pytest标记系统无法将函数返回的flaky标记实例绑定到测试用例上——@pytest.mark.xxx()生成的是pytest原生标记对象,和你函数返回的标记对象没有关联逻辑,因此重试规则不会生效。
内容的提问来源于stack exchange,提问作者GammaGames
相关产品推荐
相关产品推荐

