TestNG retrying failed tests doesn't output the correct test results

后端 未结 5 1194
别那么骄傲
别那么骄傲 2020-12-13 07:41

Setup: I have a class that extends the IRetryAnalyzer and have implemented a simple retry logic overriding the following method: public boolean retry(IT

5条回答
  •  一向
    一向 (楼主)
    2020-12-13 08:10

    I tried, tried and tried. But now finally it worked

    MyRetryAnalyzer.java

    import org.testng.IRetryAnalyzer;
    import org.testng.ITestResult;
    
    import java.util.concurrent.atomic.AtomicInteger;
    
    
    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 to retry test case: " + result.getMethod() + ", " + (MAX_RETRY_COUNT - count.intValue() + 1) + " out of " + MAX_RETRY_COUNT);
            retry = true;
            count.decrementAndGet();
        }
        return retry;
    }
    }
    

    MyTestListenerAdapter.java

    import org.testng.*;
    
    import java.util.*;
    
    
    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()) {
                } else {
                    result.setStatus(ITestResult.FAILURE);
                }
                Reporter.setCurrentTestResult(result);
            }
        }
    
    @Override
        public void onFinish(ITestContext context) {
            Iterator 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 as dup:" + failedTestCase.getTestClass().toString());
                    failedTestCases.remove();
                } else {
    
                    if (context.getPassedTests().getResults(method).size() > 0) {
                        System.out.println("failed test case remove as pass retry:" + failedTestCase.getTestClass().toString());
                        failedTestCases.remove();
                    }
                }
            }
        }
    }
    

    You test class

    @Listeners(value = MyTestListenerAdapter.class)
    
    public class Test  {
    
    //Your data provider
    @DataProvider
    
    @Test(retryAnalyzer = MyRetryAnalyzer.class)
    public void testMethod () {
        //your code goes here
     }
    
    }
    

提交回复
热议问题