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