TestNG 中失败用例重跑机制

1、首先编写Java类实现IRetryAnalyzer接口

public class OverrideRetry implements IRetryAnalyzer {
private int count = 1;
private int max_count = 3;

@Override
public boolean retry(ITestResult result) {
System.out.println("执行用例:"+result.getName()+",第"+count+"次失败");
if (count < max_count) {
count++;
return true;
}
return false;
}
}

2.编写重跑监听

public class RetryListener implements IAnnotationTransformer {

public void transform(ITestAnnotation annotation, Class testClass,Constructor testConstructor, Method testMethod) {

IRetryAnalyzer retry = annotation.getRetryAnalyzer();
if (retry == null) {
annotation.setRetryAnalyzer(OverrideRetry .class);  // 这个类名一定要和上方的对上

}
}
}

testng.xml中加一个监听

   

<listeners>
<listener class-name="com.traapi.request.Teacher.RetryListener ">
</listener>
</listeners>
<test name="test">
<classes>
<class name="com.traapi.request.Teacher.RetryTest">
<methods>
<include name="test1"/>
<include name="test2"/>
</methods>
</class>
</classes>
</test>

已上 就 可以 实现失败重跑了,但是,用例重跑之后,失败的结果也记录在运行结果中了,测试结果中运行的用例数增加了,不利于我们查看测试结果。因此,我们还需要把重复的用例去掉。 

解决办法就是重写onFinish

   

public class TestngListener extends TestListenerAdapter {
    private static Logger logger = Logger.getLogger(TestngListener.class);

@Override
public void onTestFailure(ITestResult tr) {
super.onTestFailure(tr);
logger.info(tr.getName() + " Failure");
}

@Override
public void onTestSkipped(ITestResult tr) {
super.onTestSkipped(tr);
logger.info(tr.getName() + " Skipped");
}

@Override
public void onTestSuccess(ITestResult tr) {
super.onTestSuccess(tr);
logger.info(tr.getName() + " Success");
}

@Override
public void onTestStart(ITestResult tr) {
super.onTestStart(tr);
logger.info(tr.getName() + " Start");
}

@Override
public void onFinish(ITestContext testContext) {
super.onFinish(testContext);
Iterator<ITestResult> listOfFailedTests = testContext.getFailedTests().getAllResults().iterator();
while (listOfFailedTests.hasNext()) {
ITestResult failedTest = (ITestResult) listOfFailedTests.next();
ITestNGMethod method = failedTest.getMethod();
if (testContext.getFailedTests().getResults(method).size() > 1) {
listOfFailedTests.remove();
} else {
if (testContext.getPassedTests().getResults(method).size() > 0) {
listOfFailedTests.remove();
}

}
}
}
}

重新添加监听

<suite name="Suite1" verbose="1">
<test name="CheckName">
<classes>
<class name="com.luray.testsuite.CheckStockList" />
</classes>
</test>
<listeners>
<listener class-name="com.luray.testngsetting.RetryListener" />
<listener class-name="com.luray.testngsetting.TestngListener" />
<listener class-name="org.uncommons.reportng.HTMLReporter" />
<listener class-name="org.uncommons.reportng.JUnitXMLReporter" />
</listeners>

</suite>

这次就只记录最后一次结果了

Ok  了

原文地址:https://www.cnblogs.com/lixiaowei395659729/p/8745051.html