testng实现用例失败重跑,对原文做了修改和调整
原文:结合testng实现用例失败重跑 作者:saii
既然是testng实现用例失败重跑,那么我们不谈maven相关,只谈testng的如何实现这个机制,因此对原文做了进一步修改。本来不想写这篇,还是记录下,同时也方便大家参考和学习。
我们在运行自动化测试用例的时候,经常会出现一些异常的情况的情况导致用例失败的问题。所以我们可能会希望对于失败的测试用例再重新运行一次,下来我们来看看结合testng如何使用这个功能
注意:在 testng 版本为 6.10 验证通过
你需要在你的项目中添加如下两个类
Retry.java
import org.testng.IRetryAnalyzer;
import org.testng.ITestResult;
public class Retry implements IRetryAnalyzer {
private int retryCount = 0;
private int maxRetryCount = 2; // 失败测试重跑2次
@Override
public boolean retry(ITestResult result) {
if (retryCount <maxRetryCount) {
retryCount++;
return true;
}
return false;
}
}
RetryListener.java
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import org.testng.IAnnotationTransformer;
import org.testng.IRetryAnalyzer;
import org.testng.annotations.ITestAnnotation;
public class RetryListener implements IAnnotationTransformer {
public void transform(ITestAnnotation annotation, Class testClass,
Constructor testConstructor, Method testMethod) {
IRetryAnalyzer retry = annotation.getRetryAnalyzer();
if (retry == null) {
annotation.setRetryAnalyzer(Retry.class);
}
}
}
添加完如上两个类以后,你需要在你的testng.xml文件里面添加对应的监听器
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite">
<listeners>
<listener class-name="com.cheers.test.retrydemp.RetryListener" />
</listeners>
<test name="Test">
<classes>
<class name="com.cheers.test.retrydemp.retryDemoTC1"/>
</classes>
</test> <!-- Test -->
</suite> <!-- Suite -->
<listener class-name="com.cheers.test.retrydemp.TestListener" />
我们测试类如下5个测试test4测试失败情况:
package com.cheers.test.retrydemp;
import org.testng.annotations.Test;
import junit.framework.Assert;
public class retryDemoTC1 {
@Test
public void test1()
{
Assert.assertEquals(">>>>>>>>>> test1", 1, 1);
}
@Test
public void test2()
{
Assert.assertEquals(">>>>>>>>>> test2", 6, 6);
}
@Test
public void test3()
{
Assert.assertEquals(">>>>>>>>>> test3", 1, 1);
}
@Test
public void test4()
{
System.out.println("******************* 测试重跑是否实现 ***********************");
Assert.assertEquals(">>>>>>>>>> test4", 1, 2);
}
@Test
public void test5()
{
Assert.assertEquals(">>>>>>>>>> test5", 1, 1);
}
}
执行完结果如下:
[TestNG] Running:
C:\Users\huichang\workspace\RetryDemo1\testng.xml
******************* 测试重跑是否实现 ***********************
******************* 测试重跑是否实现 ***********************
******************* 测试重跑是否实现 ***********************
===============================================
Suite
Total tests run: 7, Failures: 3, Skips: 0
===============================================
说明:这个结果显然是有问题的,我们只有5个测试,按照如上的重跑机制,结果里却有7个,失败3个,这是由于这个结果统计不合理,将失败的case也计算在内了。
所以修改如下:
创建一个TestListner.java的类实现ITestListener 的接口,如下所示
package com.cheers.test.retrydemp;
import java.util.Iterator;
import org.testng.ITestContext;
import org.testng.ITestListener;
import org.testng.ITestNGMethod;
import org.testng.ITestResult;
public class TestListener implements ITestListener {
public void onTestStart(ITestResult result) {
// TODO Auto-generated method stub
}
public void onTestSuccess(ITestResult result) {
// TODO Auto-generated method stub
}
public void onTestFailure(ITestResult result) {
// TODO Auto-generated method stub
}
public void onTestSkipped(ITestResult result) {
// TODO Auto-generated method stub
}
public void onTestFailedButWithinSuccessPercentage(ITestResult result) {
// TODO Auto-generated method stub
}
public void onStart(ITestContext context) {
// TODO Auto-generated method stub
}
public void onFinish(ITestContext context) {
// TODO Auto-generated method stub
Iterator<ITestResult> listOfFailedTests=context.getFailedTests().getAllResults().iterator();
while(listOfFailedTests.hasNext())
{
ITestResult failedTest=listOfFailedTests.next();
ITestNGMethod method=failedTest.getMethod();
if(context.getFailedTests().getResults(method).size()>1)
{
listOfFailedTests.remove();
}else
{
if(context.getPassedTests().getResults(method).size()>0)
{
listOfFailedTests.remove();
}
}
}
}
}
在testng.xml文件里面添加对应的监听器
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite">
<listeners>
<listener class-name="com.cheers.test.retrydemp.RetryListener" />
<listener class-name="com.cheers.test.retrydemp.TestListener" />
</listeners>
<test name="Test">
<classes>
<class name="com.cheers.test.retrydemp.retryDemoTC1"/>
</classes>
</test> <!-- Test -->
</suite> <!-- Suite -->
再次执行testng.xml结果如下:
[TestNG] Running:
C:\Users\huichang\workspace\RetryDemo1\testng.xml
******************* 测试重跑是否实现 ***********************
******************* 测试重跑是否实现 ***********************
******************* 测试重跑是否实现 ***********************
===============================================
Suite
Total tests run: 5, Failures: 1, Skips: 0
===============================================
在test-output/index.html中也能看到testng的结果报告里边统计是正确的,如下: