Tes yang lulus sejak awal biasanya akan terjadi ketika seseorang mengimplementasikan sesuatu dengan cara yang lebih umum daripada yang sebenarnya diperlukan untuk tes yang ada. Ini cukup normal : unit test hanya dapat memberikan sejumlah kecil nilai input terbatas untuk fungsi yang diberikan, tetapi sebagian besar fungsi ditulis untuk sejumlah besar nilai input yang mungkin. Seringkali implementasi yang dirancang khusus untuk kasus uji saat ini akan lebih rumit daripada solusi yang lebih umum. Jika itu masalahnya, maka akan menjadi rumit dan rawan kesalahan untuk secara artifisial merancang kode dengan cara hanya bekerja untuk kasus uji dan gagal untuk yang lainnya.
Misalnya, katakanlah Anda memerlukan fungsi untuk mengembalikan minimum beberapa nilai dari array yang diberikan. Anda membuat implementasi, didorong oleh tes dengan larik yang hanya berisi satu atau dua nilai. Tetapi alih-alih mengimplementasikan ini dengan cara yang berbelit-belit dengan melakukan perbandingan pada elemen yang berbeda (mungkin hanya dua elemen pertama), Anda memanggil fungsi array minimum dari pustaka standar ekosistem bahasa Anda dan menjadikan implementasinya satu garis . Saat Anda sekarang memutuskan untuk menambahkan tes dengan array lima elemen, tes mungkin akan lulus sejak awal.
Tapi bagaimana Anda tahu kalau tesnya tidak "hijau" karena ada bug dalam tes itu sendiri? Cara sederhana dan mudah untuk mendekati ini adalah dengan membuat modifikasi sementara pada subjek yang diuji untuk membuat tes gagal. Misalnya, Anda dapat dengan sengaja menambahkan garis if (array.size()==5) return 123
ke fungsi Anda. Sekarang tes lima elemen Anda akan gagal, jadi Anda tahu
- tes dieksekusi
- panggilan Assert dalam tes dijalankan
- panggilan tegas dalam tes memvalidasi hal yang benar
yang seharusnya memberi Anda kepercayaan diri dalam ujian. Setelah Anda melihat tes gagal, batalkan modifikasi, dan tes harus lulus lagi.
Atau, Anda dapat mengubah hasil tes yang diharapkan: katakanlah tes kelulusan Anda berisi pernyataan seperti
int result = Subject.UnderTest(...);
Assert.AreEqual(1,result);
maka Anda dapat mengedit tes dan mengganti "1" dengan "2". Ketika tes gagal (seperti yang diharapkan), Anda tahu itu berfungsi sebagaimana mestinya, dan Anda dapat membatalkan penggantian dan melihat apakah tes sekarang menjadi hijau. Risiko memasukkan bug ke dalam pengujian dengan penggantian semacam itu sangat kecil, jadi ini mungkin dapat diterima untuk sebagian besar kasus dunia nyata.
Cara lain yang mungkin bisa diperdebatkan adalah dengan menetapkan breakpoint ke dalam tes dan menggunakan debugger untuk melewatinya. Itu juga harus memberi Anda rasa percaya diri bahwa kode pengujian benar-benar dijalankan, dan memberi Anda kemungkinan untuk memvalidasi jalur melalui pengujian dengan inspeksi langkah demi langkah. Namun, seseorang harus sangat berhati-hati untuk tidak mengabaikan kesalahan dalam jalur kode khusus untuk tes gagal. Untuk pengujian yang rumit, Anda dapat mempertimbangkan untuk melakukan keduanya - membuatnya gagal secara buatan dan menggunakan debugger untuk memeriksanya.