質問

アプリケーションでいくつかの JUnit テストを実行しています。すべてのテストには、それぞれのメソッドを 10000 回呼び出す for ループがあります。テストされたメソッドは大量のログを生成します。これらのログは、JUnit によってテスト出力として自動的に収集されます。JUnit が出力を保持する文字列バッファーが大きくなりすぎるため、この状況では OutOfMemoryError が発生します。テスト中にこれらのログは必要ないので、JUnit に「プログラム出力を保持しない」ように指示する方法があれば、それで十分です。何か案は?

役に立ちましたか?

解決

どのような種類のロギングを使用していますか?デフォルトのログ動作をオーバーライドして、すべてのログメッセージを無視する方法はありますか?

他のヒント

いくつかのオプション:

  1. 標準出力ではなくファイルにダンプするようにログを変更します。
  2. 最大ヒープ サイズを増やすには、 -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 では、これにより、テストによって生成された出力がテスト フォーマッタに送信されなくなりました)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top