遇到的問題
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
該方式避開了插件沖突的問題,也算一種解決方案吧!!!!
浙公網安備 33010602011771號