遇到的问题
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 Exception(f'E Failed: Timeout >{seconds}s') from None
@functools.wraps(func)
def wrapper(*args, **kwargs):
# 设置信号处理器,在超时时触发 TimeoutError 异常
signal.signal(signal.SIGALRM, handler)
signal.alarm(seconds) # 设置超时时间
try:
return func(*args, **kwargs)
finally:
signal.alarm(0) # 取消超时设置
return wrapper
return decorator
该方式避开了插件冲突的问题,也算一种解决方案吧!!!!