Я придумала решение (на основе приведенного выше комментария)
- Настройка для установки глобальной конфигурации 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);
}
}
}