写入System.out或.err时测试失败

时间:2015-10-19 12:41:53

标签: java maven junit continuous-integration

当测试向System.out或System.err写入内容时,我希望我的CI构建失败。我希望有一个产生不需要的输出的测试列表。

我尝试使用mavens surefire插件添加了一个监听器,但这只是部分技巧,您可以从问题JUnit RunListener is removed on fail()

中看到

其他人是否尝试过这样的事情,还有其他方法可以在CI构建上实现更清晰的控制台吗?

3 个答案:

答案 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完成相同的操作。