Junit输出和OutOfMemoryError
我正在我的应用程序上运行一些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中,这可以防止将测试生成的输出发送到测试格式化程序)。