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