如何解决,当启用 pytest-rerunfailures 时,pytest-timeout 无法按预期工作

发布时间 2023-08-30 15:30:01作者: nocoding126

遇到的问题

pytest在用例失败的情况下,再次重试用例,导致pytest-timeout插件无法正常使用,示例如图

对应报告如图

在对应插件上寻找问题

https://github.com/pytest-dev/pytest-timeout/issues/18

解决方式

不要同时使用pytest-timeout与pytest-rerunfailures,这会导致pytest-timeout的超时判断无效,且此判断方式有悖于插件设计的初衷

可以不使用超时插件,改为自定义装饰器来判断用例超时问题,如下

def timeout(seconds=5):
    """返回装饰器的函数,实现用例超时断言"""
    def decorator(func):
        def handler(signum, frame):
            raise f'E Failed: Timeout >{seconds}s'

        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            # 设置信号处理器,在超时时触发 TimeoutError 异常
            signal.signal(signal.SIGALRM, handler)
            signal.alarm(seconds)  # 设置超时时间
            try:
                result = func(*args, **kwargs)
            except Exception as err:
                raise f'ERROR {err}'
            finally:
                signal.alarm(0)  # 取消超时设置
            return result
        return wrapper
    return decorator

该方式避开了插件冲突的问题,也算一种解决方案吧!!!!