Testng是Java自动化测试的一个框架,它提供了一个对失败用例重新执行的监听器,即接口 - IRetryAnalyzer。
先准备一个测试类:
1import org.testng.annotations.Test; 2 3import static org.testng.Assert.assertTrue; 4 5public class ITTest { 6 @Test 7 public void f() { 8 assertTrue(false); 9 10 } 11}
测试类包含一个@Test方法,执行会失败。
另外,我们添加2个Java类。第一个,TestngRetry.java。该类实现了接口 IRetryAnalyzer,定义了retry的最大次数,当未达到retry最大数时,返回true;如果达到retry最大数,则返回false,停止retry。
1import org.testng.IRetryAnalyzer; 2import org.testng.ITestResult; 3 4public class TestngRetry implements IRetryAnalyzer { 5 6 private int count = 1; 7 private int maxRetryCount = 3; 8 9 public boolean retry(ITestResult result) { 10 // TODO Auto-generated method stub 11 if(count <= maxRetryCount){ 12 13 result.setAttribute("RETRY", new Integer(count)); 14 count++; 15 return true; 16 } 17 return false; 18 } 19}
接下来,添加监听器RetryListener.java,实现接口IAnnotationTransformer。
1package com.sso; 2 3import java.lang.reflect.Constructor; 4import java.lang.reflect.Method; 5import org.testng.IRetryAnalyzer; 6import org.testng.annotations.ITestAnnotation; 7import org.testng.internal.annotations.IAnnotationTransformer; 8 9public class RetryListener implements IAnnotationTransformer { 10 @SuppressWarnings("rawtypes") 11 public void transform(ITestAnnotation annotation, Class testClass, 12 Constructor testConstructor, Method testMethod) { 13 IRetryAnalyzer retry = annotation.getRetryAnalyzer(); 14 if (retry == null) { 15 annotation.setRetryAnalyzer(TestngRetry.class); 16 } 17 } 18 19 20}
然后,在testng.xml中添加listener,如:
1<?xml version="1.0" encoding="UTF-8"?> 2<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> 3<suite name="Suite"> 4 <test thread-count="3" name="Test"> 5 <classes> 6 <class name="com.sso.ITTest" /> 7 </classes> 8 </test> <!-- Test --> 9 10 <listeners> 11 <listener class-name="com.sso.RetryListener" /> 12 </listeners> 13</suite> <!-- Suite -->
运行testng,得到结果:
1[RemoteTestNG] detected TestNG version 6.14.3 2 3=============================================== 4Suite 5Total tests run: 4, Failures: 1, Skips: 3 6===============================================
用例一共重复执行3次,加上第一次的执行,共执行4次。重复执行后,失败的用例被标记成了Skip。
另外,除了在testng.xml添加listener,还有2种方式添加listener,其一是在通过@Listeners注释,如:
1import org.testng.annotations.Listeners; 2import org.testng.annotations.Test; 3 4import static org.testng.Assert.assertTrue; 5 6@Listeners(com.sso.RetryListener.class) 7public class ITTest { 8 @Test 9 public void f() { 10 assertTrue(false); 11 12 } 13}
还有一种是通过@Test注释,如:
1import org.testng.annotations.Test; 2import static org.testng.Assert.assertTrue; 3 4public class ITTest { 5 @Test(retryAnalyzer = com.sso.RetryListener.class) 6 public void f() { 7 assertTrue(false); 8 9 } 10}
三种添加listener的方式,使用其中一种即可,不要同时使用。