===============
1.首先需要在项目中添加如下两个类
TestNGRetry.java
package com.imooc.day04;
import org.testng.IRetryAnalyzer;
import org.testng.ITestResult;
/**
* 创建类TestNGRetry,实现IRetryAnalyzer接口,并重写retry()方法
*
* @author HW
*
* @date 2021年5月4日 下午4:38:36
*
*/
public class TestNGRetry implements IRetryAnalyzer {
private int retryCount = 0;
private int maxRetryCount = 2;// 失败之后重跑2次
/**
* 一旦测试方法失败,就会调用retry(ITestResult result)方法。
* 如果想重新执行失败的测试用例,那么就让此方法返回true,如果不想重新执行测试用例,则返回false。
*/
@Override
public boolean retry(ITestResult result) {
if (retryCount < maxRetryCount) {
System.out.println("第 " + (retryCount + 1) + " 次重跑失败,测试用例名称是: " + result.getName());
retryCount++;
return true;
}
return false;
}
}
RetryListener.java
package com.imooc.day04;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import org.testng.IAnnotationTransformer;
import org.testng.IRetryAnalyzer;
import org.testng.annotations.ITestAnnotation;
/**
* 创建类 RetryListener(用例重跑监听器),实现注解转换器IAnnotationTransformer接口,并重写transform()方法,实现用例失败时重跑功能
* @author HW
*
* @date 2021年5月4日 下午4:37:18
*
*/
public class RetryListener implements IAnnotationTransformer {
@Override
public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod) {
IRetryAnalyzer iRetryAnalyzer = annotation.getRetryAnalyzer();
System.out.println("iRetryAnalyzer:" + iRetryAnalyzer);
if(iRetryAnalyzer == null) {
annotation.setRetryAnalyzer(TestNGRetry.class);
}
}
}
2.添加完如上两个类以后,需要在LoginTest.xml文件里面添加对应的监听器
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" parallel="none">
<listeners>
<listener class-name="com.imooc.day04.RetryListener"/>
</listeners>
<test name="Test">
<classes>
<class name="com.imooc.day04.LoginTest"/>
</classes>
</test> <!-- Test -->
</suite> <!-- Suite -->
3.测试类LoginTest中有5个测试方法,其中有一个测试方法testLogin1()是测试失败的情况
package com.imooc.day04;
import org.testng.Assert;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
public class LoginTest {
// @Test(retryAnalyzer = TestNGRetry.class)
@Test
public void testLogin1() {
Assert.assertEquals(true, false);
}
@Test
public void testLogin2() {
Assert.assertEquals(true, true);
}
@Test
public void testLogin3() {
Assert.assertEquals(true, true);
}
@Test
public void testLogin4() {
Assert.assertEquals(true, true);
}
@Test
public void testLogin5() {
Assert.assertEquals(true, true);
}
}
4.执行结果如下:
[TestNG] Running:
D:\develop\Workspaces\WebProjects\AutoTest\LoginTest2.xml
第 1 次重跑失败,测试用例名称是: testLogin1
第 2 次重跑失败,测试用例名称是: testLogin1
===============================================
Suite
Total tests run: 7, Failures: 3, Skips: 0
===============================================
说明:这个结果显然是有问题的,我们只有5个测试,按照如上的重跑机制,结果里却有7个,失败3个,这是由于这个结果统计不合理,将失败的case也计算在内了。
5.接着创建一个TestNGListener.java的类实现ITestListener 的接口,如下所示:
package com.imooc.day04;
import java.util.Iterator;
import org.testng.ITestContext;
import org.testng.ITestListener;
import org.testng.ITestNGMethod;
import org.testng.ITestResult;
import org.testng.TestListenerAdapter;
public class TestNGListener extends TestListenerAdapter {
@Override
public void onTestSuccess(ITestResult tr) {
super.onTestSuccess(tr);
}
@Override
public void onTestFailure(ITestResult tr) {
super.onTestFailure(tr);
}
@Override
public void onTestSkipped(ITestResult tr) {
super.onTestSkipped(tr);
}
@Override
public void onTestStart(ITestResult result) {
super.onTestStart(result);
}
@Override
public void onFinish(ITestContext testContext) {
super.onFinish(testContext);
Iterator<ITestResult> listOfFailedTests = testContext.getFailedTests().getAllResults().iterator();
while (listOfFailedTests.hasNext()) {
ITestResult failedTest = (ITestResult) listOfFailedTests.next();
ITestNGMethod method = failedTest.getMethod();
if (testContext.getFailedTests().getResults(method).size() > 1) {
listOfFailedTests.remove();
} else {
if (testContext.getPassedTests().getResults(method).size() > 0) {
listOfFailedTests.remove();
}
}
}
}
}
然后在LoginTest.xml文件里面添加对应的监听器
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" parallel="none">
<listeners>
<listener class-name="com.imooc.day04.RetryListener"/>
<listener class-name="com.imooc.day04.TestNGListener"/>
</listeners>
<test name="Test">
<classes>
<class name="com.imooc.day04.LoginTest2"/>
</classes>
</test> <!-- Test -->
</suite> <!-- Suite -->
6.再次执行LoginTest.xml,期望得到下面的结果,但实际上仍是Total tests run: 7, Failures: 3,网上查了好久资料,仍没有得到如下所示的结果。。。
[TestNG] Running:
D:\develop\Workspaces\WebProjects\AutoTest\LoginTest2.xml
第 1 次重跑失败,测试用例名称是: testLogin1
第 2 次重跑失败,测试用例名称是: testLogin1
===============================================
Suite
Total tests run: 5, Failures: 1, Skips: 0
===============================================