Perbezaan Antara Kegagalan dan Kesalahan di JUnit

1. Pengenalan

Dalam tutorial ini, kita akan meneroka perbezaan antara kegagalan dan kesalahan dalam ujian JUnit.

Ringkasnya, kegagalan adalah pernyataan yang tidak dipenuhi sementara kesalahan disebabkan oleh pelaksanaan ujian yang tidak normal.

2. Contoh Kod

Mari kita pertimbangkan contoh yang sangat sederhana, iaitu kelas kalkulator yang mempunyai satu kaedah untuk membahagi dua nilai ganda :

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

Perhatikan bahawa Java sebenarnya tidak membuang ArithmeticException sendiri untuk pembahagian berganda - ia mengembalikan Infinity atau NaN .

3. Contoh Kegagalan

Semasa menulis ujian unit dengan JUnit, kemungkinan ada situasi apabila ujian gagal. Satu kemungkinan adalah bahawa kod kami tidak memenuhi kriteria ujiannya. Ini bermaksud satu atau lebih kes ujian gagal kerana penegasan tidak dipenuhi.

Dalam contoh berikut, penegasan akan gagal, kerana hasil pembahagiannya adalah 2 dan bukan 15. Ketegasan kami dan hasil sebenarnya tidak sepadan:

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

4. Kesalahan Contoh

Kemungkinan lain adalah bahawa kita mempunyai situasi yang tidak dijangka semasa pelaksanaan ujian, kemungkinan besar disebabkan oleh pengecualian ; sebagai contoh, mengakses rujukan nol akan meningkatkan RuntimeException .

Mari kita lihat satu contoh, di mana ujian akan dibatalkan dengan ralat kerana kita cuba membahagi dengan sifar yang secara tegas kita jaga dengan membuang pengecualian dalam kod kalkulator kami:

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

Sekarang, kami dapat menyelesaikan ujian ini dengan memasukkan pengecualian sebagai salah satu penegasan kami.

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

Kemudian, jika pengecualian dilemparkan, ujian itu lulus, tetapi jika tidak maka itu akan menjadi kegagalan lain.

5. Kesimpulan

Kedua-dua kegagalan dan kesalahan dalam ujian JUnit menunjukkan keadaan yang tidak diingini, tetapi semantiknya berbeza. Kegagalan memberitahu hasil ujian yang tidak sah, kesalahan menunjukkan pelaksanaan ujian yang tidak dijangka.

Juga, sila periksa kod contoh di GitHub.