testng实现用例失败重跑[修改篇]

testng实现用例失败重跑,对原文做了修改和调整

                    原文:结合testng实现用例失败重跑        作者:saii

           既然是testng实现用例失败重跑,那么我们不谈maven相关,只谈testng的如何实现这个机制,因此对原文做了进一步修改。本来不想写这篇,还是记录下,同时也方便大家参考和学习。

        我们在运行自动化测试用例的时候,经常会出现一些异常的情况的情况导致用例失败的问题。所以我们可能会希望对于失败的测试用例再重新运行一次,下来我们来看看结合testng如何使用这个功能

你需要在你的项目中添加如下两个类
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的结果报告里边统计是正确的,如下:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章