質問
アプリケーションでいくつかの JUnit テストを実行しています。すべてのテストには、それぞれのメソッドを 10000 回呼び出す for ループがあります。テストされたメソッドは大量のログを生成します。これらのログは、JUnit によってテスト出力として自動的に収集されます。JUnit が出力を保持する文字列バッファーが大きくなりすぎるため、この状況では OutOfMemoryError が発生します。テスト中にこれらのログは必要ないので、JUnit に「プログラム出力を保持しない」ように指示する方法があれば、それで十分です。何か案は?
解決
どのような種類のロギングを使用していますか?デフォルトのログ動作をオーバーライドして、すべてのログメッセージを無視する方法はありますか?
他のヒント
いくつかのオプション:
- 標準出力ではなくファイルにダンプするようにログを変更します。
- 最大ヒープ サイズを増やすには、
-Xmx <some number>M
, 、 のように-Xmx 256M
.
利用可能なメモリを増やすだけです。-Xmx256m -Xmx256m を VM に追加してみてください。
解決策はログのプロパティをオーバーライドすることでした。今、ログを無効にしましたが、すべてが機能しているようです(テストはまだ実行中です)。うまくいったら、ファイルにログを記録する方法を設定します。皆さんに感謝します (そして、このサイトを開設した 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 では、これにより、テストによって生成された出力がテスト フォーマッタに送信されなくなりました)。