我正在我的应用程序上运行一些 JUnit 测试。每个测试都有一个 for 循环调用相应的方法 10000 次。测试的方法会产生大量的日志。JUnit 也会自动收集这些日志作为测试输出。这种情况会导致 OutOfMemoryError,因为 JUnit 保存输出的字符串缓冲区变得太大。我在测试期间不需要这些日志,所以如果有办法告诉 JUnit“不要保留程序输出”就足够了。有任何想法吗?
6 回答
您使用的是什么类型的日志记录?有什么方法可以覆盖默认的日志记录行为以忽略所有日志消息?
一些选项:
- 更改您的日志记录,使其转储到文件而不是标准输出。
- 用 增加最大堆大小
-Xmx <some number>M
,例如-Xmx 256M
。
我只会增加可用内存。尝试将 -Xmx256m -Xmx256m 添加到您的虚拟机中。
解决方案是覆盖日志记录属性。现在我禁用了日志记录,似乎一切正常(测试仍在运行)。如果它有效,我将配置一种记录到文件的方式。谢谢大家(并祝贺 Jeff 和朋友们的这个网站)。
我看到一个答案已经被接受,但如果我把它输入并更快地测试,我会提交以下内容:
如果“记录”是指 System.out.println() 或 System.err.println(),并且您确定您的测试确实不需要日志,那么您可以以编程方式重定向 stdout 和 stderr。
// Save the original stdout and stderr
PrintStream psOut = System.out;
PrintStream psErr = System.err;
PrintStream psDevNull = null;
try
{
// Send stdout and stderr to /dev/null
psDevNull = new PrintStream(new ByteArrayOutputStream());
System.setOut(psDevNull);
System.setErr(psDevNull);
// run tests in loop
for (...)
{
}
}
finally
{
// Restore stdout and stderr
System.setOut(psOut);
System.setErr(psErr);
if (psDevNull != null)
{
psDevNull.close();
psDevNull = null;
}
}
这样,您的测试输出将被禁用,但 JUnit 的其他输出不会被禁用,就像您在命令行上使用重定向时一样:
ant test &> /dev/null
命令行重定向导致所有 Ant/JUnit 的输出都被重定向,而不仅仅是来自您正在测试的类的输出,所以这可能不是您想要的。程序化重定向仅导致程序中对 System.out 和 System.err 的打印/写入被重定向,并且您仍将获得来自 Ant 和 JUnit 的输出。
设置outputtoformatters="no"
解决了我所有的内存问题(在 Ant 1.7.1 中,它阻止了测试生成的输出被发送到测试格式化程序)。