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 了