web-dev-qa-db-ja.com

JUnitテストケースで実際に使用する「失敗」とは何ですか?

JUnitテストケースで実際に使用する「失敗」とは何ですか?

109
Sanju

私はそれが有用であることがわかったいくつかのケース:

  • 不完全なテストにマークを付けると、テストは失敗し、完了するまで警告が表示されます
  • 例外がスローされることを確認する:
try{
  // do stuff...
  fail("Exception not thrown");
}catch(Exception e){
  assertTrue(e.hasSomeFlag());
}

注意:

JUnit4以降、例外がスローされていることをテストするよりエレガントな方法があります。アノテーション@Test(expected=IndexOutOfBoundsException.class)を使用します

ただし、例外も検査したい場合は機能しませんが、fail()が必要です。

124
sleske

テスト対象のコードで例外が発生する-veフローのテストケースを書いているとしましょう

try{
   bizMethod(badData);
   fail(); // FAIL when no exception is thrown
} catch (BizException e) {
   assert(e.errorCode == THE_ERROR_CODE_U_R_LOOKING_FOR)
}
11
kartheek

通常のユースケースは、ネガティブテストで例外がスローされなかったときに呼び出すことだと思います。

次の擬似コードのようなもの:

test_addNilThrowsNullPointerException()
{
    try {
        foo.add(NIL);                      // we expect a NullPointerException here
        fail("No NullPointerException");   // cause the test to fail if we reach this            
     } catch (NullNullPointerException e) {
        // OK got the expected exception
    }
}
8
philant

@Beforeメソッドで何かがおかしくなった場合に使用しました。

public Object obj;

@Before
public void setUp() {
    // Do some set up
    obj = new Object();
}

@Test
public void testObjectManipulation() {
    if(obj == null) {
        fail("obj should not be null");
     }

    // Do some other valuable testing
}
7
Ryan D

これが、Failメソッドの使用方法です。

テストケースは、次の3つの状態になります。

  1. 合格:テスト中の関数は正常に実行され、期待どおりにデータが返されました
  2. 未合格:テスト対象の関数は正常に実行されましたが、返されたデータは期待どおりではありませんでした
  3. 失敗:関数は正常に実行されず、これは実行されませんでした

意図された(例外が発生すると予想されるネガティブテストケースとは異なります)。

Eclipseを使用している場合、3つの状態がそれぞれ緑、青、赤のマーカーで示されます。

3番目のシナリオでは失敗操作を使用します。

例えば:public Integer add(integer a、Integer b){return Integer(a.intValue()+ b.intValue())}

  1. 渡されたケース:a = new Interger(1)、b = new Integer(2)、関数は3を返しました
  2. 未合格の場合:a = new Interger(1)、b = new Integer(2)、および関数が3以外のsoem値を返しました
  3. 失敗したケース:a = null、b = null、および関数はNullPointerExceptionをスローします
3
user3044364

たとえば、fail()を使用して、まだ終了していない(発生する)テストを示します。そうでなければ、成功したと表示されます。

これはおそらく、私がNUnitに存在する何らかのincomplete()機能を知らないという事実によるものです。

2
Alen Siljak

同時および/または非同期の設定では、特定のメソッド(デリゲート、イベントリスナー、応答ハンドラーなど)がnot呼び出されることを確認することができます。フレームワークのモックは別として、これらのメソッドでfail()を呼び出してテストに失敗することができます。期限切れのタイムアウトは、このようなシナリオの別の自然な障害状態です。

例えば:

final CountDownLatch latch = new CountDownLatch(1);

service.asyncCall(someParameter, new ResponseHandler<SomeType>() {
    @Override
    public void onSuccess(SomeType result) {
        assertNotNull(result);
        // Further test assertions on the result
        latch.countDown();
    }

    @Override
    public void onError(Exception e) {
        fail(exception.getMessage());
        latch.countDown();
    }
});

if ( !latch.await(5, TimeUnit.SECONDS) ) {
    fail("No response after 5s");
}
1
Raphael

最も重要なユースケースは、おそらく例外チェックです。

Junit4には、例外が発生したかどうかを確認するための expected element が含まれていますが、新しいjunit5の一部ではないようです。 expectedよりもfail()を使用するもう1つの利点は、finallyと組み合わせてテストケースのクリーンアップを行えることです。

dao.insert(obj);
try {
  dao.insert(obj);
  fail("No DuplicateKeyException thrown.");
} catch (DuplicateKeyException e) {
  assertEquals("Error code doesn't match", 123, e.getErrorCode());
} finally {
  //cleanup
  dao.delete(obj);
}

別のコメントで述べたように。テストの実装が完了するまでテストが失敗することも合理的です。

0
Udo Held