1. 序章

このチュートリアルでは、JUnitテストの失敗とエラーの違いを探ります。

つまり、失敗は満たされていないアサーションであり、エラーは異常なテスト実行によるものです。

2. サンプルコード

非常に単純な例、つまり2つのdouble値を除算する1つのメソッドを持つ計算機クラスを考えてみましょう。

public static double divideNumbers(double dividend, double divisor) {  
    if (divisor == 0) { 
        throw new ArithmeticException("Division by zero!"); 
    } 
    return dividend / divisor; 
}

Javaは、 double除算に対してArithmeticExceptionを実際にスローするのではなく、InfinityまたはNaNを返すことに注意してください。

3. 失敗の例

JUnitを使用して単体テストを作成する場合、テストが失敗する状況が発生する可能性があります。 1つの可能性はそれです私たちのコードはそのテスト基準を満たしていません。 これは、1つ以上のテストケースが次の理由で失敗することを意味しますアサーションが実行されていません。

次の例では、除算の結果が15ではなく2であるため、アサーションは失敗します。 私たちの主張と実際の結果は単に一致しません:

@Test
void whenDivideNumbers_thenExpectWrongResult() {
    double result = SimpleCalculator.divideNumbers(6, 3);
    assertEquals(15, result);
}

4. エラーの例

もう1つの可能性は、テストの実行中に予期しない状況が発生したことです。これは、おそらく例外が原因です。 たとえば、 null 参照にアクセスすると、RuntimeExceptionが発生します。

計算機コードで例外をスローすることによって明示的に保護するゼロで除算しようとしているため、テストがエラーで中止される例を見てみましょう。

@Test
void whenDivideByZero_thenThrowsException(){
    SimpleCalculator.divideNumbers(10, 0);
}

これで、アサーションの1つとして例外を含めるだけで、このテストを修正できます。

@Test
void whenDivideByZero_thenAssertException(){
    assertThrows(ArithmeticException.class, () -> SimpleCalculator.divideNumbers(10, 0));
}

次に、例外がスローされた場合、テストは合格しますが、そうでない場合、それは別の失敗になります。

5. 結論

JUnitテストの失敗とエラーはどちらも望ましくない状況を示していますが、それらのセマンティクスは異なります。 無効なテスト結果の通知に失敗しました。エラーは予期しないテスト実行を示します。

また、GitHubのサンプルコードも確認してください。