5

我正在我的应用程序上运行一些 JUnit 测试。每个测试都有一个 for 循环调用相应的方法 10000 次。测试的方法会产生大量的日志。JUnit 也会自动收集这些日志作为测试输出。这种情况会导致 OutOfMemoryError,因为 JUnit 保存输出的字符串缓冲区变得太大。我在测试期间不需要这些日志,所以如果有办法告诉 JUnit“不要保留程序输出”就足够了。有任何想法吗?

4

6 回答 6

3

您使用的是什么类型的日志记录?有什么方法可以覆盖默认的日志记录行为以忽略所有日志消息?

于 2008-09-19T16:39:07.807 回答
1

一些选项:

  1. 更改您的日志记录,使其转储到文件而不是标准输出。
  2. 用 增加最大堆大小-Xmx <some number>M,例如-Xmx 256M
于 2008-09-19T16:38:32.287 回答
0

我只会增加可用内存。尝试将 -Xmx256m -Xmx256m 添加到您的虚拟机中。

于 2008-09-19T16:39:13.033 回答
0

解决方案是覆盖日志记录属性。现在我禁用了日志记录,似乎一切正常(测试仍在运行)。如果它有效,我将配置一种记录到文件的方式。谢谢大家(并祝贺 Jeff 和朋友们的这个网站)。

于 2008-09-19T17:20:51.747 回答
0

我看到一个答案已经被接受,但如果我把它输入并更快地测试,我会提交以下内容:

如果“记录”是指 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 的输出。

于 2008-09-19T22:52:29.827 回答
0

设置outputtoformatters="no"解决了我所有的内存问题(在 Ant 1.7.1 中,它阻止了测试生成的输出被发送到测试格式化程序)。

于 2009-05-06T23:21:19.717 回答