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的結果報告裏邊統計是正確的,如下:



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