Saya sedang mengerjakan sebuah proyek di mana panggilan internal kelas biasa tetapi hasilnya berkali-kali nilai sederhana. Contoh ( bukan kode sebenarnya ):
public boolean findError(Set<Thing1> set1, Set<Thing2> set2) {
if (!checkFirstCondition(set1, set2)) {
return false;
}
if (!checkSecondCondition(set1, set2)) {
return false;
}
return true;
}
Tes unit menulis untuk jenis kode ini benar-benar sulit karena saya hanya ingin menguji sistem kondisi dan bukan penerapan kondisi aktual. (Saya melakukan itu dalam tes terpisah.) Sebenarnya akan lebih baik jika saya melewati fungsi yang menerapkan kondisi dan dalam tes saya cukup memberikan beberapa tiruan. Masalah dengan pendekatan ini adalah kebisingan: kami banyak menggunakan obat generik .
Solusi yang berfungsi; Namun, adalah untuk membuat objek yang diuji menjadi mata - mata dan mengejek panggilan ke fungsi internal.
systemUnderTest = Mockito.spy(systemUnderTest);
doReturn(true).when(systemUnderTest).checkFirstCondition(....);
Kekhawatiran di sini adalah bahwa implementasi SUT diubah secara efektif dan mungkin bermasalah untuk menjaga agar tes tetap sinkron dengan implementasi. Apakah ini benar? Apakah ada praktik terbaik untuk menghindari gangguan pemanggilan metode internal ini?
Perhatikan bahwa kita berbicara tentang bagian-bagian suatu algoritma, jadi membaginya ke beberapa kelas mungkin bukan keputusan yang diinginkan.
sumber
Jika keduanya
findError()
dancheckFirstCondition()
lain-lain adalah metode publik untuk kelas Anda, makafindError()
secara efektif fasad untuk fungsi yang sudah tersedia dari API yang sama. Tidak ada yang salah dengan itu, tetapi itu berarti bahwa Anda harus menulis tes untuk itu yang sangat mirip dengan tes yang sudah ada. Duplikasi ini hanya mencerminkan duplikasi di antarmuka publik Anda. Itu bukan alasan untuk memperlakukan metode ini berbeda dari yang lain.sumber
Tes unit harus menguji kontrak; itu satu-satunya hal yang penting bagi mereka. Menguji apa pun yang bukan bagian dari kontrak tidak hanya membuang-buang waktu, itu merupakan sumber kesalahan potensial. Setiap kali Anda melihat pengembang mengubah tes ketika dia mengubah detail implementasi, bel alarm akan berbunyi; pengembang itu mungkin (baik sengaja atau tidak) menyembunyikan kesalahannya. Sengaja menguji detail implementasi memaksa kebiasaan buruk ini, membuatnya lebih mungkin bahwa kesalahan akan ditutup-tutupi.
Panggilan internal adalah detail implementasi dan seharusnya hanya menarik dalam mengukur kinerja . Yang biasanya bukan tugas unit test.
sumber
a
berisi panggilan ke metodeb
di kelas yang sama, maka tesa
harus menyertakan tesb
. Dan tidak ada cara untuk mengubah ini selamab
tidak dilewatkana
sebagai parameter Tapi tidak ada solusi lain, saya mengerti.b
merupakan bagian dari antarmuka publik, itu harus tetap diuji. Jika tidak, tidak perlu diuji. Jika Anda mempublikasikannya hanya karena Anda ingin mengujinya, Anda melakukan kesalahan.Pertama, saya bertanya-tanya apa yang sulit untuk diuji tentang fungsi contoh yang Anda tulis? Sejauh yang saya bisa lihat, Anda cukup mengirimkan berbagai input dan memeriksa untuk memastikan nilai boolean yang benar dikembalikan. Apa yang saya lewatkan?
Sedangkan untuk mata-mata, jenis yang disebut pengujian "kotak putih" yang menggunakan mata-mata dan ejekan adalah perintah yang besarnya lebih banyak pekerjaan untuk ditulis, bukan hanya karena ada begitu banyak kode uji untuk ditulis, tetapi setiap saat implementasinya berubah, Anda juga harus mengubah tes (bahkan jika antarmuka tetap sama). Dan pengujian semacam ini juga kurang dapat diandalkan dibandingkan pengujian kotak hitam, karena Anda perlu memastikan bahwa semua kode pengujian tambahan itu benar, dan meskipun Anda dapat percaya bahwa pengujian unit kotak hitam akan gagal jika tidak cocok dengan antarmuka. , Anda tidak dapat mempercayai soal kode yang terlalu sering mengejek karena terkadang tes bahkan tidak menguji banyak kode nyata - hanya tiruan. Jika tiruannya salah, kemungkinan tes Anda akan berhasil, tetapi kode Anda masih rusak.
Siapa pun yang memiliki pengalaman dengan pengujian white-box dapat memberi tahu Anda bahwa mereka payah untuk menulis dan memelihara. Ditambah dengan fakta bahwa mereka kurang dapat diandalkan, pengujian kotak putih jauh lebih rendah dalam banyak kasus.
sumber