testng - Rerunning Selenium tests make Maven build fail -
we have set of ui tests run nightly, , of tests fail due network glitches. avoid false-negative test results, used irtetryanalyzer re-runs failed tests upto 3 times.
it works when run tests eclispe right-clicking on suite.xml - if test fails @ first passes when retried, first result not counted failure.
but when running same tests part of maven build, build fails if of tests fail, if pass @ retry.
for example, running suite of 5 tests 1 fails @ first passes on second attempt gives me output when run testng suite:
total tests run: 5, failures: 0, skips: 0
but maven, result different:
tests run: 6, failures: 1, errors: 0, skipped: 0
is there way make maven not count rerun tests failure?
finally got it. use code:
listenerapadter:
public class mytestlisteneradapter extends testlisteneradapter { @override public void ontestfailure(itestresult result) { if (result.getmethod().getretryanalyzer() != null) { myretryanalyzer retryanalyzer = (myretryanalyzer)result.getmethod().getretryanalyzer(); if(retryanalyzer.isretryavailable()) { result.setstatus(itestresult.skip); } else { result.setstatus(itestresult.failure); } reporter.setcurrenttestresult(result); } } @overrride public void onfinish(itestcontext context) { iterator<itestresult> failedtestcases =context.getfailedtests().getallresults().iterator(); while (failedtestcases.hasnext()) { system.out.println("failedtestcases"); itestresult failedtestcase = failedtestcases.next(); itestngmethod method = failedtestcase.getmethod(); if (context.getfailedtests().getresults(method).size() > 1) { system.out.println("failed test case remove dup:" + failedtestcase.gettestclass().tostring()); failedtestcases.remove(); } else { if (context.getpassedtests().getresults(method).size() > 0) { system.out.println("failed test case remove pass retry:" + failedtestcase.gettestclass().tostring()); failedtestcases.remove(); } } } } } retryanalizer:
public class myretryanalyzer implements iretryanalyzer { private static int max_retry_count = 3; atomicinteger count = new atomicinteger(max_retry_count); public boolean isretryavailable() { return (count.intvalue() > 0); } @override public boolean retry(itestresult result) { boolean retry = false; if (isretryavailable()) { system.out.println("going retry test case: " + result.getmethod() + ", " + (max_retry_count - count.intvalue() + 1) + " out of " + max_retry_count); retry = true; count.decrementandget(); } return retry; } } pom.xml -> surefire configuration:
this should configure "overwrite" surefire listener wich has own counters.
<plugin> <groupid>org.apache.maven.plugins</groupid> <artifactid>maven-surefire-plugin</artifactid> <version>2.18.1</version> <configuration> <suitexmlfiles><suitexmlfile>${basedir}/testng.xml</suitexmlfile></suitexmlfiles> <properties> <property> <name>listener</name> <value>utils.mytestlisteneradapter,utils.myretryanalizer</value> </property> </properties>
Comments
Post a Comment