【问题标题】:Is there a way to disable org.junit.runner.JUnitCore's stdout output?有没有办法禁用 org.junit.runner.JUnitCore 的标准输出?
【发布时间】:2016-12-21 11:35:18
【问题描述】:

我想通过使用JUnit 4's JUnitCore 的脚本运行一些单元测试。 脚本相当简单:

java -cp "bin:lib/*" org.junit.runner.JUnitCore my.Tests

“问题”是我想处理我的测试的输出(写入 stdout 和 stderr),并且运行器本身将输出添加到 stdout(就像每次测试后的单个“.”(点))。

有没有办法阻止运行器的输出(即静默 JUnitCore 的默认输出)?过滤这些点有点烦人。

【问题讨论】:

  • 如问题所述,已经生成了一些必须处理的输出。所以我想压制一切都没有用!?
  • @Inian:loonytune 是对的,我有一些输出要处理。我只想关闭默认输出。
  • @MarkusWeninger:bash 有点像java -cp "bin:lib/*" org.junit.runner.JUnitCore my.Tests | while read line; do echo "${line//./}"; done 之类的操作
  • 这也会删除我输出中的点。因为我正在写浮点数(使用点作为小数),所以这不起作用。
  • @MarkusWeninger:您能否通过提供示例输入和预期输出来更具体一点,例如您想删除行尾的点。

标签: java bash unit-testing junit junit4


【解决方案1】:

查看JUnitCore,您可以编写自己的主包装器,它只使用另一个JUnitSystem 并从JUnitCore 调用runMain,例如:

Result result = new JUnitCore().runMain(new NoopPrintStreamSystem(), args);
System.exit(result.wasSuccessful() ? 0 : 1);

然后您可以根据您的需要实施NoopPrintStreamSystem,例如PrintStream 什么都不做。

【讨论】:

    【解决方案2】:

    除了罗兰的回答,我会提供我的意见。首先 - 我认为您不应该在代码中使用 System.out/System.err,即使在单元测试中也是如此。我将提出两个主要原因(与测试更相关):

    • 性能(正确插入和设置的日志系统将使单元测试运行得更快)

    • 处理不灵活 - 您可以设置日志系统以将输出流式传输到文件或其他内容中,然后再进行处理。在 CI 中,您可以创建日志系统(绑定)的 No-Op 实现,这可能是运行它们的最快方式。关键是你可以决定。

    例如,您可以使用 slf4j 系统-在测试中使用 api 模块(仅记录器类的接口)和 2 个相关绑定:

    • 简单绑定(重定向到文件)
    • 无操作绑定 - 不打印任何内容

    在生产代码中,您可以使用真实绑定到您选择的真实日志记录系统。

    现在,如果您绝对需要将 System.outSystem.err 重定向到另一个地方(比如文件),那么有一种旧技术:

    System.setOut(new PrintStream(new WhatEverOutputStreamYouWant()));
    System.setErr(__Just__the__same__as__above__)
    

    您可以编写一些 JUnit 规则,这些规则将为每个 TestCase 调用并且您将被设置。

    【讨论】:

    • 感谢您的回答。不幸的是,我需要写入stdout / stderr,因为脚本的输出是由另一个工具读取的,而这个工具依赖于脚本的stdout / stderr 输出。否则,我会使用具体的记录器系统。 :)
    • 或者,在这种情况下,您可能确实想使用混凝土日志记录系统。只需将 2 个不同的 appender 分配给同一个 logger - out 将写入 stdout/stderr,另一个将是文件 appender,它将生成文件。您稍后将能够在您的项目中处理它们。有帮助吗?
    【解决方案3】:

    就这么简单:

    addListener(new MyTextListener(System.out));
    

    重写 TextListener.testStarted 方法:

    private class MyTextListener extends TextListener {
    
        public MyTextListener(PrintStream writer) {
            super(writer);
        }
    
        @Override
        public void testStarted(Description description) {
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-29
      • 1970-01-01
      • 1970-01-01
      • 2020-02-28
      • 2019-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多