如何解决TestNG Retry的问题

发布时间:   来源:文档文库   
字号:
我们使用TestNG来作为自动化测试框架的基础。在运行一批testcase之后呢,我们希望能够自动RetryfailedtestcaseTestNG提供了一个IRetryAnalyzer的接口,@Testannotation里面可以指定使用Retry类来执行retry的功能。@Test(retryAnalyzer=TestRetryAnalyzer.class
TestRetryAnalyzer类实现了IRetryAnalyzer接口。
实现逻辑为:在retry方法里,判断Retry次数是否已经超过指定的最大retry次数。如果没有返回true,否则返回false
_______________________________________________________________________________importorg.testng.IRetryAnalyzer;importorg.testng.ITestResult;
publicclassTestRetryAnalyzerimplementsIRetryAnalyzer{privatestaticfinalStringTEST_RETRY_COUNT="testRetryCount";privateintcount=1;privateintmaxCount=1;publicTestRetryAnalyzer({StringretryMaxCount=System.getProperty(TEST_RETRY_COUNT;if(retryMaxCount!=null{maxCount=Integer.parseInt(retryMaxCount;}}publicintgetCount({returnthis.count;}publicintgetMaxCount({returnthis.maxCount;}publicsynchronizedbooleanretry(ITestResultresult{StringtestClassName=String.format("%s.%s",result.getMethod(.getRealClass(.toString(,result.getMethod(.getMethodName(;if(count<=maxCount{result.setAttribute("RETRY",newInteger(count;Logging.log("[RETRYING]"+testClassName+"FAILED,"+"Retrying"+count+"time",true;count+=1;returntrue;

}returnfalse;}}
_______________________________________________________________________________
然后,我们需要定义一个TestNGListener,来处理TestCaseRetry的状态。在onTestFailure法里,未达到最大retry次数的失败Case我们把它的状态设置为SKIP这样TestNG不会把它统计为Failedtestcase
OnFinish方法里面处理最后TestCaseResult
publicclassRetryTestListenerextendsTestListenerAdapter{

publicsynchronizedvoidonTestFailure(ITestResultarg0{
publicvoidonFinish(finalITestContextarg0{
if(isRetryHandleNeeded
}
{{}
skippedCases=arg0.getSkippedTests(;failedCases=arg0.getFailedTests(;
removeIncorrectlySkippedTests(arg0,failedCases;removeFailedTestsInTestNG(arg0;
}
}
isRetryHandleNeeded=true;

if(arg0.getMethod(.getRetryAnalyzer(!=null{
TestRetryAnalyzertestRetryAnalyzer=(TestRetryAnalyzer
if(testRetryAnalyzer.getCount(<=}else
failedCases.addResult(arg0,arg0.getMethod(;arg0.setStatus(ITestResult.SKIP;Reporter.setCurrentTestResult(null;
arg0.getMethod(.getRetryAnalyzer(;
testRetryAnalyzer.getMaxCount({
}else

TestNG可能会把TestCase同时放在SkippedFailed里面,所以我们在Skippedtestcase里面剔除真正FailedTestCase(最后一次Retry失败的Case
protectedIResultMapremoveIncorrectlySkippedTests(ITestContexttest,IResultMapmap
IResultMap只提供了删除某个方法的removeResult(Method方法,如果使用了
Dataprovider,我们不能直接调用此方法在FailedResult里面直接删除该方法的结果。这会造成testcase结果的混淆。同一个TestMethod可能一个Data的结果Pass,另一个Data的结果Failed。所以我们使用failedCases来记录真正失败的result。同时我们在for(ITestResultresult:returnValue.getAllResults({
for(ITestResultresultToCheck:map.getAllResults({
if(resultToCheck.getMethod(.equals(result.getMethod({
failsToRemove.add(resultToCheck.getMethod(;break;}}
for(ITestResultresultToCheck:{
if(resultToCheck.getMethod(.equals(result.getMethod({
failsToRemove.add(resultToCheck.getMethod(;break;}}}
for(ITestNGMethodmethod:failsToRemove{
returnValue.removeResult(method;}
skippedCases=returnValue;
returnreturnValue;}{
ListfailsToRemove=newArrayList(;IResultMapreturnValue=test.getSkippedTests(;
test.getPassedTests(.getAllResults(

自己的Report中把FailedCases显示出来。
在下面这个方法里面,我们在failedTests里面查找,如果failedCases里面没有该方法,就把该方法的结果删除掉。这样确保TestNG能够报告Suite的整体Pass/Fail状态。有些同学问,为什么要这么做?我们之前不是把testcase设置为skip了么?还记得我们前面提过的,TestNG可能会把result放在两个Map里面了,所以还是需要做这一步来确保正确。
privatevoidremoveFailedTestsInTestNG(ITestContexttest}
test.getFailedConfigurations(.removeResult(result.getMethod(;}}}
System.out.println("Passed:"+result.getMethod(.getMethodName(;
isFailed=true;break;}}
if(!isFailed{
returnValue.removeResult(result.getMethod(;{
IResultMapreturnValue=test.getFailedTests(;
for(ITestResultresult:returnValue.getAllResults({
for(ITestResultresultToCheck:failedCases.getAllResults({
if(result.getMethod(.equals(resultToCheck.getMethod({

booleanisFailed=false;

我们这么做了之后,基本能够保证报告的正确性。但是TestNGRetryDataProvider的支https://groups.google.com/forum/#!msg/testng-users/7S9BFshqivk/R0dCG14kSccJ
另外,此代码基于TestNG6.7之上。
CI中也需要做修改,否则Retry成功了,CI仍然会报告失败。


org.apache.maven.pluginsmaven-surefire-plugin2.9

src/main/java/com/ebay/maui/test/demo/testng_retry.xml

usedefaultlistenersfalse

listener
com.ebay.maui.reporter.HTMLReporter


本文来源:https://www.2haoxitong.net/k/doc/e2eed14069eae009581becef.html

《如何解决TestNG Retry的问题.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式