当测试向System.out或System.err写入内容时,我希望我的CI构建失败。我希望有一个产生不需要的输出的测试列表。
我尝试使用mavens surefire插件添加了一个监听器,但这只是部分技巧,您可以从问题JUnit RunListener is removed on fail()
中看到其他人是否尝试过这样的事情,还有其他方法可以在CI构建上实现更清晰的控制台吗?
答案 0 :(得分:2)
您可以查看此Maven插件https://github.com/policeman-tools/forbidden-apis
,它会检查禁止的API调用。您可以在代码中定义禁止调用。
编辑显示排除不允许的api调用的简单示例。在示例中,除了一个测试类之外,不应在测试类中调用System.out.println
。
pom.xml
<build>
<plugins>
<plugin>
<groupId>de.thetaphi</groupId>
<artifactId>forbiddenapis</artifactId>
<version>2.0</version>
<executions>
<execution>
<goals>
<goal>check</goal>
<goal>testCheck</goal>
</goals>
</execution>
</executions>
<configuration>
<signaturesFiles>
<signaturesFile>${project.build.testOutputDirectory}/signatures.txt</signaturesFile>
</signaturesFiles>
<excludes>
<!-- specify the classes which should be excluded -->
<exclude>**/Permitted*</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
签名档案src\test\resources\signatures.txt
java.io.PrintStream#println(java.lang.String)
测试类
// the one which doesn't use System.out
package sub.optimal;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.junit.Assert;
import org.junit.Test;
public class NoSystemOutTest {
@Test
public void dummy() {
Logger logger = Logger.getGlobal();
logger.log(Level.INFO, "some info");
Assert.assertTrue(true);
}
}
// the one in which the use of System.out should be permitted
package sub.optimal;
import org.junit.Assert;
import org.junit.Test;
public class PermittedSystemOutTest {
@Test
public void dummy() {
System.out.println("permitted usage");
Assert.assertTrue(true);
}
}
// the one in which the use of System.out is not permitted
package sub.optimal;
import org.junit.Assert;
import org.junit.Test;
public class NotPermittedSystemOutTest {
@Test
public void dummy() {
System.out.println("not permitted usage");
Assert.assertTrue(true);
}
}
使用mvn test-compile forbiddenapis:testCheck
运行支票只会在NotPermittedSystemOutTest
中报告禁止的API使用情况。
[ERROR] Forbidden method invocation: java.io.PrintStream#println(java.lang.String)
[ERROR] in sub.optimal.NotPermittedSystemOutTest (NotPermittedSystemOutTest.java:9)
答案 1 :(得分:1)
您可以使用Checkstyle插件,以便使用不需要的代码进行测试失败,并在surfire报告中列为失败。
答案 2 :(得分:1)
您可以使用库System Rules
检查测试是否写入AbstractMessageSourceAdvice
System.out
使用public class YourTest {
@Rule
public final SystemOutRule systemOutRule = new SystemOutRule().enableLog();
@After
public void assertNoTextHasBeenWrittenToSystemOut() {
assertEquals("", systemOutRule.getLog())
}
...
}
可以与System.err
完成相同的操作。