Following are the classes used to implement retry logic
TestRetry Class:
public class TestRetry implements IRetryAnalyzer { int counter=0; int retryLimit=2; @Override public boolean retry(ITestResult result) { if (counter < retryLimit) { TestReporter.logStep("Retrying Test "+result.getName()+" for number of times: "+(counter+1)); counter++; return true; } return false; }
RetryListener Class:
public class RetryListener implements IAnnotationTransformer { @Override public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod) { // TODO Auto-generated method stub IRetryAnalyzer retry = annotation.getRetryAnalyzer(); if (retry == null) { annotation.setRetryAnalyzer(TestRetry.class); }}}
SampleTest:
@Listeners(RetryListener.class)public class SampleTest { @BeforeSuite(alwaysRun = true) public void beforeSuite(ITestContext context) { for (ITestNGMethod method : context.getAllTestMethods()) { method.setRetryAnalyzer(new TestRetry()); } } @Test(priority=0) public void firsttest() { System.out.println(); TestReporter.assertEquals("Test", "Test", "pass"); } @Test(priority=1, dependsOnMethods="firsttest") public void secondtest() { TestReporter.assertEquals("Test", "Test1", "fail"); } @Test(priority=2,dependsOnMethods="secondtest") public void thirdtest() { TestReporter.assertEquals("Test", "Test", "pass"); }}
When I execute the above test, following is the outputfirsttest gets executed and passessecondtest depends on firsttest and gets executed, its failed - Retried 3 times and failed againthirdtest skipped because it depends on secondtest.
Output achieved as expected.
Question:Since the tests are dependent. If one of the tests fails, I want to execute the whole class from first. is there a way to do it?
Examples: If secondtest fails, I want to execute the whole class SampleTest again.
Thanks!