在testng中重试失败的测试用例

时间:2015-01-29 06:22:44

标签: testng

我正在开发一个testng项目,我的目标是让testng自动重试失败的测试用例。例如,第一轮有10个测试用例,5个失败。所以在第一轮之后,我让testng选择5个失败的测试用例并重新运行它们。在第二轮中,可能有2个失败的测试用例,然后我重新运行这2个agian。

我尝试过IRetryAnalyzer,但它有所不同。 IRetryAnalyzer正在重试失败的测试用例,而不是每轮结束。

所以目前我想在ISuiteListener中使用onStart和onFinish来调用重试。在这种情况下,我实现了像这样的onFinish方法:

@Override
public void onFinish(ISuite suite) {
    logger.info("Round " + retryCounter
            + " Testing suit stops. onFinish method is invoked.");
    if (!doRetry()) {
        logger.info("Retry finished.");
        cleanReport(suite);
        return;
    }

    // I want to remove the passed cases here
    // and create a suite to run the failed test cases.
    suite.run();
}

这样可能吗?或者对这个要求更好的想法。

2 个答案:

答案 0 :(得分:2)

看起来这个问题很老,但仍然没有答案,所以这是我的解决方案。

首先,你必须实现这样的IRetryAnalyzer接口:

    public class Retry implements IRetryAnalyzer {

    private int retryCount = 0;
    private int maxRetryCount = 1;

    public boolean retry(ITestResult result) {
        if (retryCount < maxRetryCount) {
            System.out.println("Retrying test " + result.getName() + " with status "
                    + getResultStatusName(result.getStatus()) + " for the " + (retryCount+1) + " time(s).");
            retryCount++;
            return true;
        }
        return false;
    }

    public String getResultStatusName(int status) {
        String resultName = null;
        if(status==1)
            resultName = "SUCCESS";
        if(status==2)
            resultName = "FAILURE";
        if(status==3)
            resultName = "SKIP";
        return resultName;
    }
}

此处,maxRetryCount是您希望重新运行失败测试的次数。测试在失败后立即重新运行。

其次,实现IAnnotationTransformer接口:

public class RetryListener implements IAnnotationTransformer {

    @Override
    public void transform(ITestAnnotation testannotation, Class testClass,
                          Constructor testConstructor, Method testMethod)   {
        IRetryAnalyzer retry = testannotation.getRetryAnalyzer();

        if (retry == null)  {
            testannotation.setRetryAnalyzer(Retry.class);
        }

    }
}

现在,在带有测试的TestNG xml套件中,您应该添加listener:

<listeners>
    <listener class-name="Utils.reRunTest.RetryListener"/>
</listeners>

您也可以将它添加到您的pom.xml文件中:

 <properties>
     <property>
         <name>usedefaultlisteners</name>
         <value>false</value>
     </property>
     <property>
         <name>listener</name>
         <value>org.testng.reporters.EmailableReporter2, org.testng.reporters.XMLReporter, org.testng.reporters.FailedReporter, Utils.reRunTest.RetryListener
         </value>
     </property>

您可能还希望重新运行测试不会影响测试总数。这是通过实现TestListener接口并将其作为侦听器与RetryAnalyzer一起添加来完成的。将从总测试数量中删除片状测试和失败测试的实现是:

public class TestListener implements ITestListener {
    @Override
    public void onFinish(ITestContext context) {
        Set<ITestResult> failedTests = context.getFailedTests().getAllResults();
        Set<ITestResult> skippedTests = context.getSkippedTests().getAllResults();
        for (ITestResult temp : failedTests) {
            ITestNGMethod method = temp.getMethod();
            if (context.getFailedTests().getResults(method).size() > 1) {
                failedTests.remove(temp);
            } else {
                if (context.getPassedTests().getResults(method).size() > 0) {
                    failedTests.remove(temp);
                }
            }
        }
        for (ITestResult temp : skippedTests) {
            ITestNGMethod method = temp.getMethod();
            if (context.getSkippedTests().getResults(method).size() > 1) {
                skippedTests.remove(temp);
            } else {
                if (context.getPassedTests().getResults(method).size() > 0) {
                    skippedTests.remove(temp);
                }
            }
        }
    }

    public void onTestStart(ITestResult result) {
    }

    public void onTestSuccess(ITestResult result) {
    }

    public void onTestFailure(ITestResult result) {
    }

    public void onTestSkipped(ITestResult result) {
    }

    public void onTestFailedButWithinSuccessPercentage(ITestResult result) {
    }

    public void onStart(ITestContext context) {
    }
}

希望有所帮助。 P.S不要将它与TestNG 6.9.10版本一起使用,因为它有一些问题,你重新运行测试总是会通过,无视它们的真实状态。

答案 1 :(得分:0)

Testng在运行后在输出文件夹中创建一个testng-failed.xml,您可以在运行testng.xml之后运行该文件。所以你在testng.xml中有10个测试用例并运行它们,然后在你可以运行的testng-failed.xml中出现任何失败的错误。