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 了