测试崩溃时如何立即重启?仅二次失败判定为真失败
实现单测失败立即重试一次的轻量方案
不用额外安装库,自己写个简单的装饰器就能搞定,既避免了每个测试用例里写冗余的try-except,又能实现失败立即重试、二次失败才判定真失败的需求。
基础版装饰器(通用所有失败场景)
写一个可复用的装饰器,给需要重试的测试用例打上标记即可:
import pytest def retry_once_on_failure(func): def wrapper(*args, **kwargs): # 第一次执行测试 try: return func(*args, **kwargs) except Exception as first_exc: # 第一次失败,立即重试 try: return func(*args, **kwargs) except Exception: # 第二次失败,抛出第一次的异常(保留原始错误信息) raise first_exc return wrapper # 使用示例 @retry_once_on_failure def test_server_availability(): # 你的测试逻辑:比如发起服务器请求 response = your_server_request_method() assert response.status_code == 200
精准版装饰器(仅重试服务器不可用场景)
如果只想针对服务器不可用的特定异常(比如ConnectionError、TimeoutError)重试,避免无关失败(比如断言错误)被重复执行,可以优化装饰器:
def retry_once_on_server_unavailable(func): def wrapper(*args, **kwargs): try: return func(*args, **kwargs) except (ConnectionError, TimeoutError) as first_exc: # 仅当服务器连接/超时失败时重试 try: return func(*args, **kwargs) except (ConnectionError, TimeoutError): raise first_exc # 其他异常直接抛出,不触发重试 return wrapper
方案优势
- 无需额外安装依赖,代码轻量易维护
- 装饰器可复用,不用在每个测试用例里写重复的
try-except逻辑 - 失败后立即重试,不会等待其他测试用例执行
- 二次失败才判定真失败,符合你的需求
内容的提问来源于stack exchange,提问作者Fedor March
相关产品推荐
相关产品推荐

