我们有一个多模块Maven项目,其中每个模块都包含测试。从单元测试到集成测试,我们大约有2000种测试。
我们使用TestNG和Log4j
这些集成测试做了很多工作。在开发过程中,有时我们会添加System.out.println
来打印一些调试信息。
我知道syso通常不是一个好主意,所以我尝试使用Log4j。
是否有一种简单的方法可以使用不同的log4j配置自动重新运行Maven和TestNG失败的测试
我想出了一个解决方案(根据上面的评论)
ERROR
的设置DEBUG
,并在之后重设为ERROR
的设置@Test
更改注解>我实现了三类:
要使此功能在maven surefire中起作用,您还需要将这些类添加到testng.xml
<suite name="Suite1" verbose="1"> <listeners> <listener class-name="my.package.RerunBeforeSuiteOnlyError" /> <listener class-name="my.package.RerunTestTransformer" /> <listener class-name="my.package.TestNamePrinter" /> </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) { if (!this.retried) { Configurator.setRootLevel(Level.DEBUG); this.retried = true; return true; } else { 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);
}
}
}