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

来源:互联网 发布:logstash json 编辑:程序博客网 时间:2024/05/22 09:39

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 {@Testpublic void test1(){Assert.assertEquals(">>>>>>>>>> test1", 1, 1);}@Testpublic void test2(){Assert.assertEquals(">>>>>>>>>> test2", 6, 6);}@Testpublic void test3(){Assert.assertEquals(">>>>>>>>>> test3", 1, 1);}@Testpublic void test4(){System.out.println("******************* 测试重跑是否实现 ***********************");Assert.assertEquals(">>>>>>>>>> test4", 1, 2);}@Testpublic 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 stubIterator<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的结果报告里边统计是正确的,如下:



阅读全文
0 0
原创粉丝点击