注: 以下内容引自 http://blog.csdn.net/MenofGod/article/details/72846649
看过几个相关问题的帖子,内容类似,不过这篇解决问题的步骤和代码比较清晰,所以把这篇帖子也保存下来.
如何解决testng执行用例失败自动重跑问题
今天给大家分享一下testng执行用例失败自动重跑问题的解决办法,为什么要写这篇博客?有人会说了,网上找一车一车的,干嘛自己搁这儿写这个。。。
没错,网上是有很多,只是我感觉按照网上的说法去做不一定一次点亮,可能跟我们每个人的理解不一样,也可能是网上说的也不一定都准确,这个大家都能理解,所以呢,老套路:我想用我自己的方式,站在大家也有被此问题困惑的角度写出解决办法,我认为这个是最重要的。好了,废话少说,正儿八经的呈上:
一、首先新建Java类实现IRetryAnalyzer接口,代码如下(主要配置自动重跑次数maxRetryCount):
[java] view plain copy
1 public class OverrideIReTry implements IRetryAnalyzer { 2 public static Logger logger=Logger.getLogger(OverrideIReTry.class); 3 public int retryCount=0; 4 private static int maxRetryCount ; 5 static { 6 //外围文件配置最大运行次数,失败后重跑maxRetryCount+1次 7 8 maxRetryCount = 2;//也就是失败后重跑3次 9 logger.info("maxRunCount=" + (maxRetryCount)); 10 } 11 12 @Override public boolean retry(ITestResult iTestResult){ 13 if(retryCount <= maxRetryCount){String message = "running retry for '" + iTestResult.getName() + "' on class " + 14 this.getClass().getName() + " Retrying " + retryCount + " times"; 15 logger.info(message); 16 Reporter.setCurrentTestResult(iTestResult); 17 Reporter.log("RunCount=" + (retryCount + 1)); 18 retryCount++; 19 return true; 20 } return false; 21 } 22 }
[java] view plain copy
1 package TezitongAll; 2 3 import java.lang.reflect.Constructor; 4 import java.lang.reflect.Method; 5 6 import org.testng.IAnnotationTransformer; 7 import org.testng.IRetryAnalyzer; 8 import org.testng.annotations.ITestAnnotation; 9 10 public class RetryListener implements IAnnotationTransformer { 11 @Override 12 public void transform(ITestAnnotation annotation, @SuppressWarnings("rawtypes") Class testClass,@SuppressWarnings("rawtypes") Constructor testConstructor, Method testMethod) { 13 IRetryAnalyzer retry = annotation.getRetryAnalyzer(); 14 if (retry == null) { 15 annotation.setRetryAnalyzer(OverrideIReTry.class); 16 } 17 } 18 }
[java] view plain copy
1 package TezitongAll; 2 3 import java.util.Iterator; 4 import org.testng.ITestContext; 5 import org.testng.ITestNGMethod; 6 import org.testng.ITestResult; 7 import org.testng.TestListenerAdapter; 8 import org.testng.log4testng.Logger; 9 10 public class TestngListener extends TestListenerAdapter { 11 private static Logger logger = Logger.getLogger(TestngListener.class); 12 13 @Override 14 public void onTestFailure(ITestResult tr) { 15 super.onTestFailure(tr); 16 logger.info(tr.getName() + " Failure"); 17 } 18 19 @Override 20 public void onTestSkipped(ITestResult tr) { 21 super.onTestSkipped(tr); 22 logger.info(tr.getName() + " Skipped"); 23 } 24 25 @Override 26 public void onTestSuccess(ITestResult tr) { 27 super.onTestSuccess(tr); 28 logger.info(tr.getName() + " Success"); 29 } 30 31 @Override 32 public void onTestStart(ITestResult tr) { 33 super.onTestStart(tr); 34 logger.info(tr.getName() + " Start"); 35 } 36 37 @Override 38 public void onFinish(ITestContext testContext) { 39 super.onFinish(testContext); 40 Iterator<ITestResult> listOfFailedTests = testContext.getFailedTests().getAllResults().iterator(); 41 while (listOfFailedTests.hasNext()) { 42 ITestResult failedTest = (ITestResult) listOfFailedTests.next(); 43 ITestNGMethod method = failedTest.getMethod(); 44 if (testContext.getFailedTests().getResults(method).size() > 1) { 45 listOfFailedTests.remove(); 46 } 47 else { 48 if (testContext.getPassedTests().getResults(method).size() > 0) { 49 listOfFailedTests.remove(); 50 } 51 52 } 53 } 54 } 55 }
[html] view plain copy
1 <listeners> 2 <listener class-name="TezitongAll.TestngListener"></listener> //需要改成自己目录的路径和名称 3 <listener class-name="TezitongAll.RetryListener"></listener> //需要改成自己目录的路径和名称 4 </listeners> 5 6 //以下为你要运行的case在哪个类下边就配置相应的路径和name 7 <test name="usersinfo"> 8 <classes> 9 <class name="TezitongAll.TezitongAll" /> 10 </classes> 11 </test>
六、查看运行结果(***是我为了看到底有没有重跑,如果有重跑了几次而加上的标记),如下:
七、OK,到此完事。