遇到的問題

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

該方式避開了插件沖突的問題,也算一種解決方案吧!!!!