5

我正在使用一些System.out.print本身有一些命令的遗留代码。我的 eCobertura 插件将此行显示为红色,因此我想对它们进行单元测试。

在stackoverflow中,我找到了一种对控制台输出进行单元测试的方法,我觉得这很有趣。

我就是这样做的:

        private final ByteArrayOutputStream outContent = new ByteArrayOutputStream();

        @Before
        public void setUpStreams() {
            System.setOut(new PrintStream(outContent));
        }

        @After
        public void cleanUpStreams() {
            System.setOut(null);
        }

        @Test
        public void out() {
            System.out.print("Some message from the system");
            assertEquals("Some message from the system", outContent.toString());
        }

到目前为止一切顺利,测试变为绿色,但是当我再次运行代码覆盖率插件时,我收到以下消息:

net.sourceforge.cobertura.coveragedata.TouchCollector.applyTouchesOnProjectData(TouchCollector.java:186) 处的线程“Thread-0”java.lang.NullPointerException 中的异常 net.sourceforge.cobertura.coveragedata.ProjectData.saveGlobalProjectData(ProjectData.java:267) ) 在 net.sourceforge.cobertura.coveragedata.SaveTimer.run(SaveTimer.java:31) 在 java.lang.Thread.run(Thread.java:662)

我有些疑惑:

  • 尝试进行单元测试是否正确System.out.print()'s
  • eCoberturrain 是否与此类测试兼容?
  • 如果 eCobertura 与此类测试不兼容,为什么它会显示红色线?
  • 我的测试有问题吗?
  • 我正在使用 jUnit 4.11 你认为这与它有关吗?
  • 为什么 eCobertura 给我这个错误?
4

2 回答 2

6

尝试对 System.out.print() 进行单元测试是否正确?

这在很大程度上取决于您要测试的内容。我认为没有必要测试 System.out.print() 本身,我希望 Sun/Oracle 已经做到了这一点。但是,如果您的应用程序将重要信息输出到控制台并且这是您验证输出的唯一方法,那么是的,您需要对其进行测试。如果您可以通过测试相应的类来测试您的代码,那么您可能不需要测试输出流本身。

例如,查看数据库:我不测试自身的 JDBC 驱动程序,但我会测试所有代码/功能,这些代码/功能是从数据库加载/保存数据的一部分。

红线仅表示代码行从未执行过。这可能没问题,或者这可能意味着您的测试没有触及它们应该触及的代码部分。提高测试覆盖率很重要,但可能并不总是需要以 100% 为目标(想想帕累托原则)

至于你的空指针异常

System.setOut(null);将 System.out 设置为 null 的调用,eCobertura 可能会尝试向 Standard Out 写入一些内容,该标准输出现在为 null。您可能需要在 @Before 方法中保存原始输出流并在我们的 @After 方法中恢复它,以允许后面的代码使用 StdOut

eCobertura 是否与此类测试不兼容?

如果 eCobertura 与此类测试不兼容,为什么它会显示红色线?

为什么 eCobertura 给我这个错误?

eclipse 和 eCobertura 之间的通信可能是通过 Standard Out 进行的,但我不确定。如果是这种情况,那么如果您重定向标准输出,不仅您的输出而且来自 Cobertura 的输出都会被重定向,并且 GUI 不再看到执行的内容和不执行的内容,因此将其着色为红色

我的测试有问题吗?

可能需要确保正确恢复 StdOut。

我正在使用 jUnit 4.11 你认为这与它有关吗?

不,我不这么认为

于 2013-03-02T14:05:42.470 回答
3

如果在代码中使用 System.out.println 是正确的,那么(单元/集成)测试它们是正确的。

有一个有用的系统测试实用程序称为系统规则来测试这种代码。

http://stefanbirkner.github.com/system-rules/

于 2013-03-02T13:56:37.100 回答