java testng重试逻辑

时间:2014-07-14 09:25:49

标签: java testng

我已经编写了一个代码,用于在selenium web驱动程序和java中重试失败的测试用例。 我们应该如何增强脚本以在测试用例输出中仅保存一条记录,即使是多次执行的相同测试用例。 我不希望测试输出报告包含任何冗余结果条目。

代码: 重试逻辑:

package tests;

import org.testng.IRetryAnalyzer;
import org.testng.ITestResult;

public class Retry implements IRetryAnalyzer {
    private int retryCount         = 0;
    private int maxRetryCount     = 2;   // retry a failed test 2 additional times

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

在课堂上实施

@Test(retryAnalyzer=Retry.class)
    public void example() throws CustomException
    {
        throw new CustomException("Example");
    }

请告诉我需要进行哪些更改。

谢谢和问候 Sushanth.G

1 个答案:

答案 0 :(得分:5)

之前我遇到过同样的问题。 我们使用jenkins来运行CI,并且需要确保所有测试用例结果都是SUCCESS(即使经过一些重试后),然后我们可以部署构建。

如果再次运行此测试,解决方案是添加TestListenerAdapter以将测试结果状态重新写入SKIP。

public class MyTestListenerAdapter extends TestListenerAdapter {
    @Override
    public void onTestFailure(ITestResult result) {
        if (result.getMethod().getRetryAnalyzer() != null) {
            MyRetryAnalyzer retryAnalyzer = (MyRetryAnalyzer)result.getMethod().getRetryAnalyzer();

            if(retryAnalyzer.isRetryAvailable()) {
                result.setStatus(ITestResult.SKIP);
            } else {
                result.setStatus(ITestResult.FAILURE);
            }
            Reporter.setCurrentTestResult(result);
        }
    }
}

RetryAnalyzer需要为TestListenerAdapter提供另一个方法(在此示例中为isRetryAvailable())。

public class MyRetryAnalyzer implements IRetryAnalyzer {
    private static int MAX_RETRY_COUNT = 3;

    AtomicInteger count = new AtomicInteger(MAX_RETRY_COUNT);

    public boolean isRetryAvailable() {
        return (count.intValue() > 0);
    }

    @Override
    public boolean retry(ITestResult result) {
        boolean retry = false;
        if (isRetryAvailable()) {
            System.out.println("Going to retry test case: " + result.getMethod() + ", " + (MAX_RETRY_COUNT - count.intValue() + 1) + " out of " + MAX_RETRY_COUNT);
            retry = true;
            count.decrementAndGet();
        }
        return retry;
    }
}

现在我们可以将此TestListenerAdapter添加到测试类。

@Listeners({MyTestListenerAdapter.class})
public class AppTest {
    @Test(retryAnalyzer=MyRetryAnalyzer.class)
    public void testSum(){
        MyClass c = new MyClass();
        Assert.assertEquals(c.sum(2, 3), 5);
    }
}

请在此处查看完整示例:https://github.com/haojiwu/testng-retry-example