簡體   English   中英

如何在Jenkins上自動重新運行失敗的TestNG測試

[英]How to automatically re-run failed TestNG tests on Jenkins

我正在為企業環境構建Selenium自動化套件的最后階段。 它配置了在Jenkins上運行的TestNG。 該套件主要包含UI測試。 作為這種設置的典型,測試是不穩定的,並且在我們的時間線內重新進行測試以減少對UI自動化的依賴是不可行的。

鑒於我已經在進行代碼優化,我想設置一些自動重新運行失敗測試的東西,以最大限度地減少手動調查失敗的需要。 我已經調查了幾個選項,但沒有一個適合我們的設置:

  • 一個理想的解決方案是使用具有rerunFailingTestsCount屬性的Maven Surefire插件,但此功能僅支持JUnit(我們使用TestNG)
  • Jenkins Flaky Test Handler插件是由同一個人開發的,並且似乎也依賴於JUnit

建議您使用我們的設置解決方案,我們將不勝感激。

您可以添加重試監聽器:

重試類:

import org.testng.IRetryAnalyzer;

import org.testng.ITestResult;


public class Retry implements IRetryAnalyzer {

    private int retryCount = 0;

    private int maxRetryCount = 1;


    public String getResultStatusName(int status) {

        String resultName = null;

        if (status == 1)

            resultName = "SUCCESS";

        if (status == 2)

            resultName = "FAILURE";

        if (status == 3)

            resultName = "SKIP";

        return resultName;

    }


    /*

     * Below method returns 'true' if the test method has to be retried else

     * 'false' and it takes the 'Result' as parameter of the test method that

     * just ran

     * 

     * @see org.testng.IRetryAnalyzer#retry(org.testng.ITestResult)

     */

    @Override

    public boolean retry(ITestResult result) {

        if (retryCount < maxRetryCount) {

            System.out.println("Retrying test " + result.getName() + " with status " + getResultStatusName(result.getStatus()) + " for the " + (retryCount + 1) + " time(s).");

            retryCount++;

            return true;

        }

        return false;

    }

並添加此偵聽器:

import java.lang.reflect.Constructor;

import java.lang.reflect.Method;


import org.testng.IAnnotationTransformer;

import org.testng.IRetryAnalyzer;

import org.testng.annotations.ITestAnnotation;


public class RetryListener implements IAnnotationTransformer {


    @Override

    public void transform(ITestAnnotation testannotation, Class testClass, Constructor testConstructor, Method testMethod) {

        IRetryAnalyzer retry = testannotation.getRetryAnalyzer();


        if (retry == null) {

            testannotation.setRetryAnalyzer(Retry.class);

        }

    }


}

你有2個選項可以調用上面的監聽器:

從您的xml testng運行程序如下:

<listeners>

        <listener class-name="package path....com.listeners.RetryListener" />

        <listener class-name="org.uncommons.reportng.HTMLReporter" />

        <listener class-name="org.uncommons.reportng.JUnitXMLReporter" />

</listeners>

從測試類:

@Listeners({ package path....com.listeners.RetryListener })

您需要在類聲明之前添加上述聲明。

對於失敗的testNG測試,失敗報告存儲為testngfialed.xml。 將它添加到您的XML Suite,這樣的東西應該工作:

<suiteXmlFiles>
  <suiteXmlFile>src/test/<your path>.../testng.xml</suiteXmlFile>
  <suiteXmlFile>target/surefire-reports/testngfailed.xml</suiteXmlFile>
</suiteXmlFiles>

這可能是: 通過Jenkins運行testngfailed.xml

注意:此響應替換了主持人刪除的先前響應。 有關如何定義和連接TestNG重試分析器的詳細信息,請參閱下一個響應。 我希望我的回復能夠遵循那個,但它會在這里顯示出來。

除了下面顯示的TestNG套件文件方法之外,您還可以通過服務加載程序配置文件指定重試分析器。 http://testng.org/doc/documentation-main.html#listeners-service-loader

無論項目的定義方式或運行方式如何,此ServiceLoader機制都具有按預期工作的優勢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM