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