Повторить неудачные тесты с другим конфигом log4j (установлен на отладку)? - PullRequest
1 голос
/ 04 октября 2019

У нас есть многомодульный проект maven, в котором каждый модуль содержит тесты. У нас около 2000 тестов, от модульных тестов до интеграционных тестов.

Мы используем TestNG и Log4j

Эти интеграционные тесты выполняют довольно большую работу. Во время разработки мы иногда добавляем System.out.println для печати некоторой отладочной информации.

Я знаю, что syso, как правило, не очень хорошая идея, поэтому я пытаюсь использовать Log4j.

Есть ли простой способдля автоматического повторного запуска неудачных тестов с Maven и TestNG с другой конфигурацией log4j

1 Ответ

1 голос
/ 08 октября 2019

Я придумала решение (на основе приведенного выше комментария)

  • Настройка для установки глобальной конфигурации Log4j на ERROR
  • Настройка, чтобы изменить ее на DEBUG на 1-й повторной попытке и сброс на ERROR после
  • Трансформатора, поэтому мне не нужно менять аннотацию для каждого @Test

Я реализовал три класса:

Использование

Просто запустите: mvn test

Соответствующая часть pom.xml

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>${maven.surefire.plugin.version}</version>
            <configuration>
                <suiteXmlFiles>
                    <suiteXmlFile>src/test/resources/testng.xml</suiteXmlFile>
                </suiteXmlFiles>
            </configuration>
        </plugin>

(Чтобы сделать эту работу в Maven, убедитесь, что вытакже необходимо добавить эти классы в testng.xml)

testng.xml

<suite name="Suite1" verbose="1">
    <listeners>
        <listener class-name="my.package.RerunBeforeSuiteOnlyError" />
        <listener class-name="my.package.RerunTestTransformer" />
    </listeners>
    ...

RerunBeforeSuiteOnlyError

public class RerunBeforeSuiteOnlyError implements ISuiteListener {

    public static final Level DEFAULT_TEST_LOGGING_LEVEL = Level.ERROR;

    @Override
    public void onStart(final ISuite suite) {
        Configurator.setRootLevel(DEFAULT_TEST_LOGGING_LEVEL);
    }

    @Override
    public void onFinish(final ISuite suite) {

    }
}

RerunDebugModifier

public class RerunDebugModifier implements IRetryAnalyzer {

    boolean retried = false;

    @Override
    public boolean retry(final ITestResult result) {

        // do we need to retry?
        // 1st time YES -> retry with DEBUG level
        if (!this.retried) {
            Configurator.setRootLevel(Level.DEBUG);
            this.retried = true;
            return true;

        } else {
            // 2nd time NO -> reset to ERROR, don't retry
            Configurator.setRootLevel(RerunBeforeSuiteOnlyError.DEFAULT_TEST_LOGGING_LEVEL);

            return false;
        }

    }
}

RerunTestTransformer

public class RerunTestTransformer implements IAnnotationTransformer {


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

        final IRetryAnalyzer retry = testannotation.getRetryAnalyzer();

        if (retry == null) {
            testannotation.setRetryAnalyzer(RerunDebugModifier.class);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...