博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何解决TestNG Retry的问题
阅读量:6085 次
发布时间:2019-06-20

本文共 3430 字,大约阅读时间需要 11 分钟。

出自: http://www.51testing.com/html/75/5175-823395.html

我们使用TestNG来作为框架的基础。在运行一批 case之后呢,我们希望能够自动Retry failed的test case。TestNG提供了一个IRetryAnalyzer的接口,在@Test annotation里面可以指定使用Retry类来执行retry的功能。

@Test(retryAnalyzer = TestRetryAnalyzer.class)

 

TestRetryAnalyzer类实现了IRetryAnalyzer接口。

实现逻辑为:在retry方法里,判断Retry次数是否已经超过指定的最大retry次数。如果没有返回true,否则返回false。

_______________________________________________________________________________

import org.testng.IRetryAnalyzer;

import org.testng.ITestResult;

 

public class TestRetryAnalyzer implements IRetryAnalyzer {

        private static final String TEST_RETRY_COUNT = "testRetryCount";

        private int count = 1;

        private int maxCount = 1;

 

        public TestRetryAnalyzer() {

                  String retryMaxCount = System.getProperty(TEST_RETRY_COUNT);

                  if (retryMaxCount != null) {

                           maxCount = Integer.parseInt(retryMaxCount);

                  }

        }

 

        public int getCount() {

                  return this.count;

        }

        

        public int getMaxCount() {

                  return this.maxCount;

        }

        

        public synchronized boolean retry(ITestResult result) {

                  String testClassName = String.format("%s.%s", result.getMethod()

                                    .getRealClass().toString(), result.getMethod().getMethodName());

                  

                  if (count <= maxCount) {

                           result.setAttribute("RETRY", new Integer(count));

 

                           Logging.log("[RETRYING] " + testClassName + " FAILED, "

                                              + "Retrying " + count + " time", true);

 

                           count += 1;

                           return true;

                  }

                  return false;

        }

}

_______________________________________________________________________________

 

然后,我们需要定义一个TestNGListener,来处理TestCase Retry的状态。在onTestFailure方法里,未达到最大retry次数的失败Case,我们把它的状态设置为SKIP,这样TestNG不会把它统计为Failed的test case。

 

在OnFinish方法里面处理最后TestCase的Result。

 

public class RetryTestListener extends TestListenerAdapter {

 

publicsynchronizedvoidonTestFailure(ITestResult arg0) {

      if(arg0.getMethod().getRetryAnalyzer() !=null) {

          TestRetryAnalyzer testRetryAnalyzer = (TestRetryAnalyzer) arg0.getMethod().getRetryAnalyzer();

          

          if(testRetryAnalyzer.getCount() <= testRetryAnalyzer.getMaxCount()) {

             arg0.setStatus(ITestResult.SKIP);

             Reporter.setCurrentTestResult(null);

          }

          else

             failedCases.addResult(arg0, arg0.getMethod());

 

          isRetryHandleNeeded=true;

      }

   }

 

public void onFinish(final ITestContext arg0) {

if(isRetryHandleNeeded)

      {

          removeIncorrectlySkippedTests(arg0,failedCases);

          removeFailedTestsInTestNG(arg0);

      }else

      {

          skippedCases= arg0.getSkippedTests();

          failedCases= arg0.getFailedTests();

      }

      

   }

 

TestNG可能会把TestCase同时放在SkippedFailed里面,所以我们在Skippedtestcase里面剔除真正FailedTest Case(最后一次Retry失败的Case

 

protectedIResultMapremoveIncorrectlySkippedTests(ITestContext test,IResultMap map)

   {    

    List<ITestNGMethod> failsToRemove =newArrayList<ITestNGMethod>();

    IResultMap returnValue = test.getSkippedTests();

 

    for(ITestResult result : returnValue.getAllResults())

    {

      for(ITestResult resultToCheck : map.getAllResults())

      {

          if(resultToCheck.getMethod().equals(result.getMethod()))

          {

              failsToRemove.add(resultToCheck.getMethod());

              break;

          }

      }   

      for(ITestResult resultToCheck : test.getPassedTests().getAllResults())

      {

          if(resultToCheck.getMethod().equals(result.getMethod()))

          {

              failsToRemove.add(resultToCheck.getMethod());

              break;

          }

      }    

    }

    

    for(ITestNGMethod method : failsToRemove)

    {

        returnValue.removeResult(method);

    } 

    skippedCases= returnValue;

    

    

    returnreturnValue;

   }

 

IResultMap只提供了删除某个方法的removeResult(Method)方法,如果使用了Dataprovider,我们不能直接调用此方法在FailedResult里面直接删除该方法的结果。这会造成test case结果的混淆。同一个TestMethod可能一个Data的结果Pass,另一个Data的结果Failed。所以我们使用failedCases来记录真正失败的result。同时我们在自己的Report中把FailedCases显示出来。

 

转载于:https://www.cnblogs.com/qingshuihe/p/5046380.html

你可能感兴趣的文章
什么样的企业可以称之为初创企业?
查看>>
Python爬虫之BeautifulSoup
查看>>
《HTML 5与CSS 3权威指南(第3版·下册)》——第20章 使用选择器在页面中插入内容...
查看>>
如何判断自己适不适合做程序员?这几个特点了解一下
查看>>
newinstance()和new有什么区别
查看>>
android下载封装类
查看>>
[node] 用 node-webkit 开发桌面应用
查看>>
Nginx访问控制和虚拟主机
查看>>
report widget not working for external users
查看>>
windows phone 摄像头得到图片是旋转90°
查看>>
Linux--sed使用
查看>>
没有显示器的情况下安装和使用树莓派
查看>>
【android】使用handler更新UI
查看>>
mochiweb 源码阅读(十五)
查看>>
前端面试中的常见的算法问题
查看>>
计算机语言的基本理论
查看>>
nodejs流之行读取器例子
查看>>
批量文件重命名工具
查看>>
简单说一下UWP中的JumpList
查看>>
unity将object[]或者string对象转换成枚举enum
查看>>