Saya menjalankan tes JUnit pada basis kode yang besar, dan saya menyadari bahwa terkadang saya mendapatkan "Kesalahan" sementara di lain waktu saya mendapatkan "Kegagalan". Apa bedanya?
93
Oke, saya baru saja memperhatikan sebuah pola dan berpikir saya telah menemukannya (perbaiki saya jika saya salah). Menurut saya, kegagalan adalah saat kasus pengujian Anda gagal - misalnya, pernyataan Anda salah. Kesalahan adalah kesalahan tak terduga yang terjadi saat mencoba menjalankan pengujian - pengecualian, dll.
java.lang.AssertionError
dilemparkan, itu akan ditampilkan sebagai kegagalan pengujian, bukan kesalahan pengujian. Anda harus mempertimbangkan untuk menerima jawaban Anda sendiri karena itu benar.@Test
denganexpected = SomeException.class
.Jika pengujian Anda menampilkan pengecualian yang tidak digelembungkan melalui kerangka kerja Assertion di Junit, itu akan dilaporkan sebagai kesalahan. Misalnya, pengecualian NullPointer, atau ClassNotFound akan melaporkan kesalahan:
atau,
Karena itu, berikut ini akan melaporkan kegagalan:
atau,
atau bahkan:
Itu tergantung pada versi Junit yang Anda gunakan. Junit 4 akan membuat perbedaan antara kegagalan dan kesalahan, tetapi Junit 4 menyederhanakannya sebagai kegagalan saja.
Tautan berikut memberikan masukan yang lebih menarik:
http://www.devx.com/Java/Article/31983/1763/page/2
sumber
Dari "Pengujian Unit Pragmatis di Java 8 dengan JUnit":
Assertion (atau asserts) di JUnit adalah panggilan metode statis yang Anda masukkan ke pengujian. Setiap pernyataan adalah kesempatan untuk memverifikasi bahwa beberapa kondisi benar. Jika kondisi yang ditegaskan tidak berlaku, pengujian berhenti di sana, dan JUnit melaporkan kegagalan pengujian.
(Mungkin juga saat JUnit menjalankan pengujian Anda, pengecualian akan muncul dan tidak tertangkap. Dalam kasus ini, JUnit melaporkan error pengujian.)
sumber
Tes di bawah ini menjelaskan perbedaan antara Test Error vs Test failure .
Saya telah mengomentari baris yang melempar kesalahan pengujian dan kegagalan pengujian.
Jadi Junit menunjukkan kesalahan pengujian setiap kali Anda mendapatkan pengecualian, dan pengujian gagal saat nilai hasil yang Anda harapkan tidak sesuai dengan nilai sebenarnya
sumber
Kelas sumber: JUnitReportReporter.java
Seperti yang Anda lihat di bawah garis dalam metode di atas
jumlah kesalahan bertambah ketika itu adalah instance dari AssertionError, sebaliknya (semua Throwable) dihitung sebagai kegagalan.
sumber
Anda benar bahwa kegagalan berasal dari AssertionErrors yang muncul oleh metode pernyataan JUnit, atau dengan melemparkan AssertionError, atau dengan memberikan pengecualian yang Anda nyatakan dalam
@Test
anotasi Anda , dan Kesalahan berasal dari Pengecualian tak terduga lainnya. Tetapi ada perbedaan penting di antara keduanya:Kegagalan berarti pengujian Anda berjalan dengan benar, dan mengidentifikasi kerusakan pada kode Anda.
Kesalahan bisa berarti bug dalam kode Anda, tetapi yang bahkan belum Anda uji. Ini juga bisa berarti bahwa bug sedang dalam pengujian itu sendiri.
Singkatnya, kegagalan berarti Anda perlu menulis ulang kode yang sedang diuji. Kesalahan berarti mungkin tes unit yang perlu Anda tulis ulang. Ini mungkin berarti ini bahkan jika kegagalan ada dalam kode Anda, seperti a
NullPointerException
, karena Anda mendeteksi cacat yang bahkan tidak Anda uji, jadi mungkin bijaksana untuk mengujinya.sumber
Ironisnya, junit dan kerangka kerja terkait pengujian lainnya (testng, hamcrest) menyediakan operasi assert yang memverifikasi kondisi dan jika gagal, maka "under-the-hood" java.lang.AssertionError sedang dilempar, yang btw memperluas java.lang.Error.
Namun tidak mungkin bertentangan dengan jawaban di atas yang tentunya sepenuhnya valid. Jadi untuk menandai aliran pengujian tertentu sebagai kegagalan, seseorang dapat melempar AssertionError, namun saya tidak yakin itu benar-benar didokumentasikan dalam manual yang sesuai, karena lebih sesuai untuk menggunakan API fail () khusus. Jenis Throwable lainnya akan dianggap sebagai kesalahan, bukan kegagalan.
sumber
Pada dasarnya, kegagalan mengacu pada pernyataan yang tidak terpenuhi sementara kesalahan disebabkan oleh eksekusi uji yang tidak normal . dan menurut saya setiap IDE memiliki ikon simbolik dengan warna berbeda untuk lulus , gagal , dan dengan uji kesalahan .
Untuk informasi lebih lanjut, periksa ini .
sumber