如何为我的 Retry TestNG 方法添加休眠?

How do I add a sleep to my Retry TestNG method?

我目前正在结合 IAnnotationTransformer 实施 IRetryAnalyzer 方法,以便在我的测试失败时执行重试。我想在重试发生时添加一个 Thread.sleep() 。这是我目前拥有的:

public boolean retry(ITestResult result){
    if (retryCount < maxRetryCount) {
        retryCount++;
        return true;
    }
    return false;
}

当我添加 Thread.sleep() 时,它要求我为 Retry 方法添加抛出的异常:

public boolean retry(ITestResult result) throws Exception{
    if (retryCount < maxRetryCount) {
        retryCount++;
        Thread.sleep(5);
        return true;
    }
    return false;
}

然而,"Exception" 给我一个错误:"Overriden method does not throw java.lang.Exception"。尽管我已经尝试了很多,但似乎我实际上无法为这次重试添加睡眠。有人知道解决方法吗?

抓住并抑制将被抛出的 InterruptedException

try {
    Thread.sleep(5);
} catch (InterruptedException e) {
    //do nothing
}

这将使您无需将 throws 子句添加到方法定义中。

Thread.sleep(long) 可以抛出 InterrupedException。 您可以将它包含在 try catch 块中,也可以从方法中删除 throws Exception

public boolean retry(ITestResult result){

    if (retryCount < maxRetryCount) {

        retryCount++;

        try{

            Thread.sleep(5);

        }catch(Exception e){}

        return true;

    }

    return false;
}

'throws' 声明和 'try-catch' 块之间存在差异。不同之处在于,'try-catch' 吞下了异常,而 'throws' 将让它传播。参考下面link:

try/catch versus throws Exception

由于重试是一种重写方法,所以有一些关于方法重写和异常处理的规则。

规则是:

1。如果超类方法不声明异常,子类覆盖方法不能声明检查异常但可以声明未检查异常。

2。如果超类方法声明异常,子类覆盖方法可以声明相同、子类异常或无异常但不能声明父类异常。

所以,按照上面的规则声明一个异常或者像下面这样用try-catch块包围'Thread.sleep(5000)'。

try {
        Thread.sleep(5000);
    } catch (Exception e) {
        //do nothing
    }

注:

Thread.sleep() 实际上会将值视为毫秒,因此使用 5000 而不是 5。