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的方式,使用其中一種即可,不要同時使用。