TestNG 中失败用例重跑机制

发表于:2018-4-12 11:01

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:苏小沫    来源:博客园

  1、首先编写Java类实现IRetryAnalyzer接口
public class testNgRetry implements IRetryAnalyzer {
public static Logger log = Logger.getLogger(testNgRetry.class);
private static int maxRetryCount = 3;   //这个是最大跑多少次
private int retryCount = 1;                    //设置1次
public boolean retry(ITestResult result) {
// TODO Auto-generated method stub
if(retryCount<=maxRetryCount){     //失败之后跑3次
String message = "Running retry for '" + result.getName()
+ "' on class " + this.getClass().getName() + " Retrying "
+ retryCount + " times";
log.info(message);
Reporter.setCurrentTestResult(result);
Reporter.log("RunCount="+(retryCount+1));
retryCount++;
return true;
}
return false;
}
}
  2.编写重跑监听
public class RetryListener implements IAnnotationTransformer {
public void transform(ITestAnnotation annotation, Class testClass,Constructor testConstructor, Method testMethod) {
// TODO Auto-generated method stub
IRetryAnalyzer retry = annotation.getRetryAnalyzer();
if (retry == null) {
annotation.setRetryAnalyzer(testNgRetry.class);
}
}
}
  testng.xml中加一个监听
  <listener class-name="com.luray.testngsetting.RetryListener" />
  已上 就 可以 实现失败重跑了,但是,用例重跑之后,失败的结果也记录在运行结果中了,测试结果中运行的用例数增加了,不利于我们查看测试结果。因此,我们还需要把重复的用例去掉。
  解决办法就是重写onFinish
package com.luray.testngsetting;
import java.util.Iterator;
import org.apache.log4j.Logger;
import org.testng.ITestContext;
import org.testng.ITestNGMethod;
import org.testng.ITestResult;
import org.testng.TestListenerAdapter;
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  了
上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号