我想使用JUnit 4's JUnitCore通过脚本运行一些单元测试。 脚本很简单:
java -cp "bin:lib/*" org.junit.runner.JUnitCore my.Tests
“问题”是我想处理我的测试的输出(写入stdout和stderr),并且跑步者本身将输出添加到stdout(在每次测试后像一个“。”(点))。
有没有办法阻止跑步者的输出(即安静的JUnitCore的默认输出)?过滤这些点有点烦人。
答案 0 :(得分:1)
查看JUnitCore,您可以编写自己的主包装,它只使用另一个JUnitSystem
并从runMain
调用JUnitCore
,例如:
Result result = new JUnitCore().runMain(new NoopPrintStreamSystem(), args);
System.exit(result.wasSuccessful() ? 0 : 1);
然后,您可以根据自己的需要实施NoopPrintStreamSystem
,例如PrintStream
无所事事。
答案 1 :(得分:1)
除了罗兰的回答,我还会提供我的意见。首先 - 我认为您不应该在代码中使用System.out / System.err,即使在单元测试中也是如此。我将提出两个主要原因(与测试更相关):
性能(正确插入和设置的日志记录系统将使单元测试运行得更快)
处理的不灵活性 - 您可以设置日志记录系统以将输出流式传输到文件或其他内容中,然后再进行处理。在CI中,您可以创建日志系统(绑定)的No-Op实现,它可能是运行它们的最快方法。关键是你可以决定。
例如,你可以在测试中使用slf4j system- use api模块(只有logger类的接口)和2个相关的绑定:
在生产代码中,您可以使用真实绑定到您选择的真实日志系统。
现在,如果您绝对需要将System.out
和System.err
重定向到另一个地方(例如文件),则有一种旧技术:
System.setOut(new PrintStream(new WhatEverOutputStreamYouWant()));
System.setErr(__Just__the__same__as__above__)
您可以编写一些将为每个TestCase调用的JUnit规则,您将被设置。
答案 2 :(得分:-1)
简单如:
addListener(new MyTextListener(System.out));
覆盖TextListener.testStarted方法:
private class MyTextListener extends TextListener {
public MyTextListener(PrintStream writer) {
super(writer);
}
@Override
public void testStarted(Description description) {
}
}