Junit输出和OutOfMemoryError

时间:2020-03-06 14:26:50  来源:igfitidea点击:

我正在我的应用程序上运行一些JUnit测试。每个测试都有一个for循环,分别调用10000次方法。
经过测试的方法会产生大量日志。
这些日志还将由JUnit自动收集为测试输出。
这种情况将导致OutOfMemoryError,因为JUnit保留输出的字符串缓冲区太大了。
我在测试过程中不需要这些日志,因此,如果有一种方法可以告诉JUnit"不保留程序输出",那就足够了。
有任何想法吗?

解决方案

一些选项:

  • 更改日志记录,使其转储到文件而不是标准输出。
  • 用-Xmx <some number> M来增加最大堆大小,例如-Xmx 256M。

我们正在使用哪种类型的日志记录?有什么方法可以覆盖默认的日志记录行为而忽略所有日志消息?

我只会增加可用的内存。尝试将-Xmx256m -Xmx256m添加到VM。

解决方案是覆盖日志记录属性。现在,我禁用了日志记录,并且一切似乎都可以进行(测试仍在运行)。如果可行,我将配置一种记录文件的方法。
谢谢大家(并祝贺杰夫和朋友的网站)。

我看到答案已经被接受,但是如果我输入答案并进行更快的测试,这就是我会提交的内容:

如果通过"日志记录"表示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中,这可以防止将测试生成的输出发送到测试格式化程序)。