How to optimize testng and seleniums tests

后端 未结 3 1503
陌清茗
陌清茗 2021-02-02 04:12

For my internship, I have to use TestNG and selenium for testing a web-application. But I have a problem, sometimes selenium or the Browser is not working for some random reason

3条回答
  •  自闭症患者
    2021-02-02 04:40

    You can use a combination of the IRetryAnalyzer, a Listener and a custom reporter to do what you are looking for.

    IRetryAnalyzer:

    public class RetryAnalyzer implements IRetryAnalyzer  { 
    private int count = 0; 
    // this number is actually twice the number
    // of retry attempts will allow due to the retry
    // method being called twice for each retry
    private int maxCount = 6; 
    protected Logger log;
    private static Logger testbaseLog;
    
    static {
        PropertyConfigurator.configure("test-config/log4j.properties");
        testbaseLog = Logger.getLogger("testbase.testng");
    }
    
    public RetryAnalyzer()
    {
        testbaseLog.trace( " ModeledRetryAnalyzer constructor " + this.getClass().getName() );
        log = Logger.getLogger("transcript.test");
    }
    
    @Override 
    public boolean retry(ITestResult result) { 
        testbaseLog.trace("running retry logic for  '" 
                + result.getName() 
                + "' on class " + this.getClass().getName() );
            if(count < maxCount) {                     
                    count++;                                    
                    return true; 
            } 
            return false; 
    }
    }
    

    RetryListener:

    public class RetryTestListener extends TestListenerAdapter  {
    private int count = 0; 
    private int maxCount = 3; 
    
    @Override
    public void onTestFailure(ITestResult result) {     
        Logger log = Logger.getLogger("transcript.test");
        Reporter.setCurrentTestResult(result);
    
        if(result.getMethod().getRetryAnalyzer().retry(result)) {    
            count++;
            result.setStatus(ITestResult.SKIP);
            log.warn("Error in " + result.getName() + " with status " 
                    + result.getStatus()+ " Retrying " + count + " of 3 times");
            log.info("Setting test run attempt status to Skipped");                 
        } 
        else
        {
            count = 0;
            log.error("Retry limit exceeded for " + result.getName());
        }       
    
        Reporter.setCurrentTestResult(null);
    }
    
    @Override
    public void onTestSuccess(ITestResult result)
    {
        count = 0;
    }
    

    However, there appears to be a bug within TestNG that actually causes some of the test results to be reported as both skipped AND failed. To prevent this, I recommend that you override whatever Reporter you wish to use and include a method such as the one included below:

    private IResultMap removeIncorrectlyFailedTests(ITestContext test)
    {     
      List failsToRemove = new ArrayList();
      IResultMap returnValue = test.getFailedTests();
    
      for(ITestResult result : test.getFailedTests().getAllResults())
      {
        long failedResultTime = result.getEndMillis();          
    
        for(ITestResult resultToCheck : test.getSkippedTests().getAllResults())
        {
            if(failedResultTime == resultToCheck.getEndMillis())
            {
                failsToRemove.add(resultToCheck.getMethod());
                break;
            }
        }
    
        for(ITestResult resultToCheck : test.getPassedTests().getAllResults())
        {
            if(failedResultTime == resultToCheck.getEndMillis())
            {
                failsToRemove.add(resultToCheck.getMethod());
                break;
            }
        }           
      }
    
      for(ITestNGMethod method : failsToRemove)
      {
          returnValue.removeResult(method);
      }  
    
      return returnValue;
    }
    

    After all of this is done, you can add the reporter using using .addListener and specify the retryAnalyzer in the @Test annotation.

提交回复
热议问题