2014-10-01 60 views
2

我做了很多搜索,這是我得到的最接近的答案,但沒有解決我的問題。 TestNG retrying failed tests doesn't output the correct test results如何發送TestNG DefaultSuite結果後重試分析器Maven Surefire插件

但是我需要將上面的問題從TestNG擴展到Maven。請幫忙。

我的項目堆棧:TestNG,Maven surefire插件,Maven。我正在從命令行運行測試 - 「mvn clean compile test」。我正在使用重試分析器重新運行第二次通過的失敗測試。我已經能夠使用CustomListener更新存儲在TestNG的testcontext中的結果(基於stackoverflow中的解決方案)。當我將測試作爲TestNG套件運行時,這一點得到了證實。

但是當我運行「mvn clean compile test」時,所有的重試都被視爲單獨的測試,並且構建總是失敗。我如何讓TestNG只將最終的套件結果發送給Maven Surefire插件?

TestNG的執行:

============================================ 
DefaultTest 
Total tests run: 4, Failures: 2, Skips: 0 
============================================ 

============================================ 
DefaultSuite 
Total tests run: 2, Failures: 0, Skips: 0 
============================================ 

MAVEN執行:

Tests run: 4, Failures: 2, Errors: 0, Skipped: 0, Time elapsed: 0.292 sec <<< FAILURE! 

Results : 

Failed tests: 
    test1(foo.TestClass1) 
    test1(foo.TestClass1) 

Tests run: 4, Failures: 2, Errors: 0, Skipped: 0 

[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD FAILURE 
[INFO] ------------------------------------------------------------------------ 

因爲重試通過的版本。我如何將TestNG重試套件結果反映到Maven?

+1

嗨!你解決了你的問題嗎?我將這個問題跟蹤到了將testan自己的聽衆安裝到testng的maven testng runner。它無視最終的櫃檯調整,因爲它保留了自己的櫃檯 – WarGoth 2015-02-20 19:26:35

+0

這裏同樣的問題。任何想法或更新?謝謝! – Morvader 2015-03-18 10:26:05

回答

0

終於明白了。我用這個代碼:

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 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(); 
      } 
     } 
    } 
    } 
} 

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 to 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聽他們有自己的計數器。

<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> 

+0

我在我的測試框架中有類似的設置,但我得到以下錯誤:Listener [email protected]必須是ITestListener,ISuiteListener,IReporter,IAnnotationTransformer,IMethodInterceptor或IInvokedMethodListener之一。你知道我該如何解決這個錯誤? – Ziska 2015-09-30 03:28:31

+0

經過一番研究,我發現我們不需要在pom.xml中聲明我們的IRetryAnalyzer的自定義實現。由於它不是典型的TestNG監聽器,因此上述錯誤是有效的。此外,糾正已執行測試總數的邏輯在TestListenerAdapter實現中。只要我們用pom文件聲明這個監聽器,Maven就會輸出正確的執行次數。 – Ziska 2015-09-30 04:23:45

0
Some suit info is incorrect, but maven surefire works properly 

maven-surefire-plugin 2.16 
testng 6.8.8 

// ===== InvokedMethodListener ===== 
import org.testng.IInvokedMethod; 
import org.testng.IInvokedMethodListener; 
import org.testng.ITestResult; 

public class InvokedMethodListener implements IInvokedMethodListener { 

    @Override 
    public void beforeInvocation(IInvokedMethod method, ITestResult testResult) { 
    } 

    @Override 
    public void afterInvocation(IInvokedMethod method, ITestResult testResult) { 
     RetryAnalyzer retryAnalyzer = (RetryAnalyzer)testResult.getMethod().getRetryAnalyzer(); 
     if (retryAnalyzer == null || retryAnalyzer.isFailed()) { 
      return; 
     } 
     if (testResult.getStatus() == ITestResult.FAILURE) { 
      testResult.setStatus(ITestResult.SUCCESS); 
     } 
    } 

} 

// ===== RetryAnalyzer ===== 
import org.testng.IRetryAnalyzer; 
import org.testng.ITestResult; 
import org.testng.Reporter; 

public class RetryAnalyzer implements IRetryAnalyzer { 
    private int count = 0; 
    private int maxCount = 2; 

    @Override 
    public boolean retry(ITestResult result) { 
     if (!result.isSuccess()) { 
      if (count < maxCount) { 
       count++; 
       return true; 
      } 
     } 
     return false; 
    } 

    public boolean isFailed() { 
     return count >= maxCount; 
    } 
} 


// ===== BaseTest ===== 
@Listeners({ ..InvokedMethodListener.class }) 
public abstract class BaseTest { 
... 
    @BeforeSuite(alwaysRun = true) 
    public void beforeSuite(ITestContext context) { 
     for (ITestNGMethod method : context.getAllTestMethods()) { 
      method.setRetryAnalyzer(new RetryAnalyzer()); 
     } 
    } 
} 
相關問題