2

エラー状態を作成する単体テストがあります。通常、テスト対象のクラスはこのエラーをログに書き込みます(この場合はlog4jを使用しますが、それは重要ではないと思います)。を使用して、ログレベルを一時的に変更できます

Logger targetLogger = Logger.getLogger(ClassUnderTest.class);
Level oldLvl = targetLogger.getLevel();
targetLogger.setLevel(Level.FATAL);

theTestObject.doABadThing();

assertTrue(theTestObject.hadAnError());

targetLogger.setLevel(oldLvl);

ただし、これは、テスト中に無関係/意図しないエラーが発生した場合、その情報もログに表示されないことも意味します。

ここで使用することになっているベストプラクティスまたは一般的なパターンはありますか?私はそれを助けることができればログレベルをプロデュースするのは好きではありませんが、ERROR将来の開発者を怖がらせる可能性のあるテスト出力にたくさんのノイズがあるのも好きではありません。

4

2 に答える 2

1

ロギングレイヤーで許可されている場合は、エラーメッセージに対してアサーションを作成することをお勧めします。これを行うには、メッセージを(出力せずに)アサートする独自のロガーを実装するか、メモリバッファーロガーを使用してログバッファーの内容を確認します。

いかなる状況でも、エラーメッセージが単体テスト実行ログに記録されることはありません。これにより、人々はログのエラーに慣れ、他のエラーを隠すことになります。要するに、あなたのオプションは次のとおりです。

  1. 最も好ましい:ハーネスでメッセージをキャッチし、それを表明します。
  2. ややOK:レベルを上げてメッセージを無視します。
  3. OKではありません:何もせず、ログメッセージをstderr/syslogに到達させます。
于 2013-02-12T11:18:57.667 に答える
0

XUnitスタイルのユニットテスト(Junit、Pyunitなど)を想定してこれにアプローチする方法

@Test(expected = MyException)  
 foo_1() throws Exception
{
    theTestObject.doABadThing(); //MyException here
}

ロギングを行う際の問題は、誰かがログファイルにアクセスして実際に解析する必要があることです。これには時間がかかり、エラーが発生しやすくなります。ただし、生成された場合、テストは上記に合格し、MyException生成されなかった場合は失敗します。これにより、テスターがログを正しく読み取ることを期待する代わりに、ビルドを自動的に失敗させることができます。

于 2013-02-12T14:36:09.023 に答える