Saya punya pertanyaan tentang junit assertEquals
untuk menguji nilai ganda. Membaca dokumen API saya bisa melihat:
@Deprecated public static void assertEquals(double expected, double actual)
Usang. Gunakan assertEquals sebagai gantinya
Apa artinya epsilon
nilainya? (Epsilon adalah huruf dalam alfabet Yunani, kan?).
Adakah yang bisa menjelaskan kepada saya bagaimana cara menggunakannya?
java
unit-testing
junit
Édipo Féderle
sumber
sumber
<=
tidak<
.doubleIsDifferent
(untuk membandingkan nilai ganda) dan mengembalikannyaMath.abs(d1 - d2) > delta
. Jadi jika perbedaan antara d1 dan d2 lebih tinggi dari delta, itu berarti nilainya berbeda dan akan mengembalikan true. Ini akan mengembalikan false jika nilainya dianggap sama. Metode itu disebut dalam assertEquals secara langsung dan jika itu mengembalikan nilai true, maka assertEquals akan memanggilfailNotEquals
dan hasil pengujian akan gagal.Versi JUnit manakah ini? Saya hanya pernah melihat delta, bukan epsilon - tapi itu masalah sampingan!
Dari jUnit javadoc :
Ini mungkin berlebihan, tetapi saya biasanya menggunakan jumlah yang sangat kecil, misalnya
Jika Anda menggunakan pernyataan hamcrest , Anda bisa menggunakan standar
equalTo()
dengan dua ganda (tidak menggunakan delta). Namun jika Anda ingin delta, Anda bisa menggunakancloseTo()
(lihat javadoc ), misFYI JUnit 5 mendatang juga akan membuat delta opsional saat memanggil
assertEquals()
dengan dua ganda. The pelaksanaan (jika Anda tertarik) adalah:sumber
Perhitungan floating point tidak tepat - sering ada kesalahan pembulatan, dan kesalahan karena representasi. (Misalnya, 0,1 tidak dapat secara tepat direpresentasikan dalam titik mengambang biner.)
Karena itu, secara langsung membandingkan dua nilai floating point untuk kesetaraan biasanya bukan ide yang baik, karena mereka dapat berbeda dengan jumlah kecil, tergantung pada bagaimana mereka dihitung.
"Delta", seperti yang disebut dalam javadocs JUnit , menjelaskan jumlah perbedaan yang dapat Anda toleransi dalam nilai agar mereka dianggap sama. Ukuran nilai ini sepenuhnya tergantung pada nilai yang Anda bandingkan. Saat membandingkan ganda, saya biasanya menggunakan nilai yang diharapkan dibagi 10 ^ 6.
sumber
Masalahnya adalah bahwa dua ganda mungkin tidak persis sama karena masalah presisi yang melekat pada angka floating point. Dengan nilai delta ini, Anda dapat mengontrol evaluasi kesetaraan berdasarkan faktor kesalahan.
Juga beberapa nilai floating-point dapat memiliki nilai khusus seperti NAN dan -Infinity / + Infinity yang dapat mempengaruhi hasil.
Jika Anda benar-benar berniat untuk membandingkan bahwa dua ganda sama persis, lebih baik membandingkannya sebagai representasi panjang
Atau
Yang bisa memperhitungkan nuansa ini.
Saya belum mempelajari metode Assert yang dipermasalahkan, tetapi saya hanya bisa berasumsi bahwa sebelumnya sudah tidak digunakan lagi untuk masalah seperti ini dan yang baru memperhitungkannya.
sumber
Epsilon adalah perbedaan antara
expected
danactual
nilai - nilai yang dapat Anda terima dengan menganggap mereka setara. Anda dapat mengatur.1
misalnya.sumber
Perhatikan bahwa jika Anda tidak melakukan matematika, tidak ada yang salah dengan menyatakan nilai floating point yang tepat. Misalnya:
Dalam hal ini, Anda ingin memastikan itu benar-benar
MIN_VALUE
, bukan nol atau-MIN_VALUE
atauMIN_NORMAL
atau nilai yang sangat kecil lainnya. Bisa dibilang begitutetapi ini akan memberi Anda peringatan penghentian. Untuk menghindarinya, Anda bisa menelepon
assertEquals(Object, Object)
:Dan, jika Anda benar-benar ingin terlihat pintar:
Atau Anda bisa menggunakan pernyataan gaya lancar Hamcrest:
Jika nilai Anda memeriksa sedang tidak datang dari melakukan beberapa matematika, meskipun, menggunakan epsilon tersebut.
sumber
sumber