Salah satu contoh kasus kegagalan yang Anda ingin tangkap, adalah bahwa objek yang diuji menggunakan lapisan caching tetapi gagal untuk mempertahankan data sesuai kebutuhan. Kemudian jika Anda meminta objek itu akan mengatakan "yup, saya punya nama dan alamat baru", tetapi Anda ingin tes gagal karena belum benar-benar melakukan apa yang seharusnya.
Atau (dan mengabaikan pelanggaran tanggung jawab tunggal), anggaplah diperlukan untuk mempertahankan versi string UTF-8 yang dikodekan ke bidang berorientasi byte, tetapi sebenarnya tetap menggunakan Shift JIS. Beberapa komponen lain akan membaca basis data dan mengharapkan untuk melihat UTF-8, karena itu diperlukan. Kemudian bolak-balik melalui objek ini akan melaporkan nama dan alamat yang benar karena itu akan mengubahnya kembali dari Shift JIS, tetapi kesalahan tidak terdeteksi oleh pengujian Anda. Mudah-mudahan akan terdeteksi oleh beberapa tes integrasi nanti, tetapi inti dari tes unit adalah untuk menangkap masalah lebih awal, dan tahu persis komponen apa yang bertanggung jawab.
Jika salah satu dari mereka tidak melakukan apa yang seharusnya, maka test case-nya akan gagal dan kita dapat memperbaikinya dan menjalankan baterai tes lagi.
Anda tidak dapat menganggap ini, karena jika Anda tidak hati-hati Anda menulis serangkaian tes yang saling bergantung. "Apakah itu menyelamatkan?" tes memanggil metode simpan yang sedang diuji, dan kemudian metode memuat untuk mengonfirmasi bahwa metode itu disimpan. "Apakah dimuat?" test memanggil metode save untuk mengatur fixture test dan kemudian load method yang diuji untuk memeriksa hasilnya. Kedua pengujian bergantung pada kebenaran metode yang tidak mereka uji, yang berarti bahwa keduanya tidak benar-benar menguji kebenaran metode yang diuji.
Petunjuk bahwa ada masalah di sini, adalah bahwa dua tes yang seharusnya menguji unit yang berbeda sebenarnya melakukan hal yang sama . Mereka berdua memanggil seorang setter diikuti oleh seorang pengambil, kemudian memeriksa hasilnya adalah nilai asli. Tetapi Anda ingin menguji bahwa setter tetap menggunakan data, bukan bahwa pasangan setter / pengambil bekerja bersama-sama. Jadi Anda tahu ada sesuatu yang salah, Anda hanya perlu mencari tahu apa dan memperbaiki tes.
Jika kode Anda dirancang dengan baik untuk pengujian unit, maka setidaknya ada dua cara Anda dapat menguji apakah data telah benar-benar bertahan dengan metode yang diuji:
tiruan antarmuka basis data, dan minta tiruan Anda mencatat fakta bahwa fungsi yang tepat telah dipanggil, dengan nilai yang diharapkan. Ini menguji metode melakukan apa yang seharusnya, dan merupakan tes unit klasik.
berikan itu basis data aktual dengan maksud yang persis sama , untuk merekam apakah data telah bertahan dengan benar atau tidak. Tetapi alih-alih memiliki fungsi mengejek yang hanya mengatakan "yup, saya mendapat data yang tepat", tes Anda membaca kembali dari database secara langsung dan mengonfirmasi itu benar. Ini mungkin bukan tes semurni mungkin, karena seluruh mesin basis data adalah hal yang cukup besar untuk digunakan untuk menulis tiruan yang dimuliakan, dengan lebih banyak kesempatan saya melihat beberapa kehalusan yang membuat lulus ujian meskipun ada sesuatu yang salah (jadi misalnya saya tidak boleh menggunakan koneksi database yang sama untuk membaca seperti yang digunakan untuk menulis, karena saya mungkin melihat transaksi tidak berkomitmen). Tapi itu menguji hal yang benar, dan setidaknya Anda tahu persis mengimplementasikan seluruh antarmuka basis data tanpa harus menulis kode tiruan apa pun!
Jadi itu hanyalah detail implementasi tes apakah saya membaca data dari database tes oleh JDBC atau apakah saya mengejek database. Either way intinya adalah bahwa saya dapat menguji unit lebih baik dengan mengisolasinya daripada saya dapat jika saya membiarkannya berkonspirasi dengan metode yang salah lainnya di kelas yang sama agar terlihat benar bahkan ketika ada sesuatu yang salah. Oleh karena itu saya ingin menggunakan sarana yang mudah untuk memeriksa apakah data yang benar tetap ada, selain mempercayai komponen yang metodenya saya uji.
Jika kode Anda tidak dirancang dengan baik untuk pengujian unit, maka Anda mungkin tidak punya pilihan, karena objek yang metode yang ingin Anda uji mungkin tidak menerima database sebagai ketergantungan yang disuntikkan. Dalam hal ini diskusi tentang cara terbaik untuk mengisolasi unit yang sedang diuji, berubah menjadi diskusi tentang seberapa dekat mungkin untuk mengisolasi unit yang sedang diuji. Tapi kesimpulannya sama. Jika Anda dapat menghindari konspirasi di antara unit yang salah maka Anda melakukannya, tergantung pada waktu yang tersedia dan apa pun yang Anda pikirkan yang akan lebih efektif dalam menemukan kesalahan dalam kode.