Как автоматически перезапустить проваленные тесты TestNG на Jenkins - PullRequest
0 голосов
/ 08 мая 2018

Я работаю на последних этапах создания пакета автоматизации Selenium для корпоративной среды. Это настроено с TestNG, работающим на Jenkins. Пакет состоит в основном из тестов пользовательского интерфейса. Как типично для этой установки, тесты являются нестабильными, и переработка тестов, чтобы в меньшей степени зависеть от автоматизации пользовательского интерфейса, невозможна в наши сроки.

Учитывая, что я уже работаю над оптимизацией кода, я хотел бы настроить что-то, что автоматически перезапускает неудачные тесты, чтобы минимизировать необходимость ручного исследования сбоев. Я исследовал несколько вариантов, но ни один из них не подходит для нашей установки:

  • Идеальным решением было бы использование плагина Maven Surefire , который имеет свойство rerunFailingTestsCount, но эта функция поддерживается только для JUnit (мы используем TestNG)
  • Плагин Jenkins Flaky Test Handler был разработан теми же людьми ^ и, похоже, также зависит от JUnit

Буду признателен за решение, которое будет работать с нашей настройкой.

Ответы [ 3 ]

0 голосов
/ 08 мая 2018

Вы можете добавить Retry Listener:

Класс повторных попыток:

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

Вам нужно добавить вышеуказанное объявление перед объявлением класса.

0 голосов
/ 21 мая 2018

ПРИМЕЧАНИЕ. Этот ответ заменяет предыдущий ответ, который был удален модератором. См. Следующий ответ для получения подробной информации о том, как определить и подключить анализатор повторов TestNG. Я бы предпочел, чтобы мой ответ последовал этому, но вместо этого он появляется здесь.

В дополнение к методу файла комплекта TestNG, показанному ниже, вы можете указать, что анализатор повторных попыток выполняется через файл конфигурации загрузчика служб. http://testng.org/doc/documentation-main.html#listeners-service-loader

Этот механизм ServiceLoader имеет преимущество в том, что он работает, как ожидается, независимо от того, как определен проект или как он запускается.

0 голосов
/ 08 мая 2018

Для неудачных тестов testNG отчет об ошибках сохраняется как testngfialed.xml. Добавьте это к вашему XML Suite, что-то вроде этого должно работать:

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

Это может быть гепатит: Запустить testngfailed.xml через Jenkins

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...