JUnitの失敗とエラーの違い

  • link:/category/testing/ [テスト]

  • JUnit

1. 前書き

このチュートリアルでは、https://www.baeldung.com/junit-5 [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. エラーの例

別の可能性としては、テストの実行中に予期しない状況が発生する可能性があります。これは、おそらく例外が原因です*。たとえば、_null_参照にアクセスすると、_RuntimeException_が発生します。
電卓コードで例外をスローすることによって明示的に保護するゼロで除算しようとしているため、テストがエラーで中断する例を見てみましょう:
@Test
void whenDivideByZero_thenThrowsException(){
    SimpleCalculator.divideNumbers(10, 0);
}
これで、https://www.baeldung.com/junit-assert-exception [assertions]の1つとして例外を含めるだけで、このテストを修正できます。
@Test
void whenDivideByZero_thenAssertException(){
    assertThrows(ArithmeticException.class, () -> SimpleCalculator.divideNumbers(10, 0));
}
次に、例外がスローされた場合、テストに合格しますが、そうでない場合は別の失敗になります。

5. 結論

JUnitテストの失敗とエラーはどちらも望ましくない状況を示していますが、セマンティクスは異なります。 *無効なテスト結果の通知は失敗し、エラーは予期しないテスト実行を示します。*
また、https://github.com/eugenp/tutorials/tree/master/testing-modules/junit-5-basics [GitHub]でサンプルコードを確認してください。