Satu hal tentang pengujian otomatis adalah mengharuskan Anda untuk menulis kode agar dapat diuji. Ini bukan hal yang buruk di dalam dan dari dirinya sendiri (sebenarnya itu baik karena itu mencegah banyak praktik yang sebagai aturan harus dihindari), tetapi jika Anda mencoba menerapkan pengujian unit ke kode yang ada maka kemungkinan tidak telah ditulis dengan cara yang dapat diuji.
Hal-hal seperti lajang, metode statis, pendaftar, pelacak layanan dan sebagainya memperkenalkan dependensi yang sangat sulit untuk diejek. Pelanggaran Hukum Demeter berarti bahwa terlalu banyak bagian dari basis kode Anda yang tahu terlalu banyak tentang bagaimana bagian-bagian lain dari basis kode Anda berfungsi, memperkenalkan ketergantungan tersembunyi lebih lanjut yang mungkin sulit untuk dipatahkan. Semua hal ini membuatnya sulit untuk mengisolasi modul dari sisa basis kode, dan jika Anda tidak dapat menguji modul Anda dalam isolasi maka unit test kehilangan banyak nilainya. Jika tes gagal apakah itu karena kesalahan dalam unit yang diuji, atau karena kesalahan dalam salah satu dependensinya, atau mungkin itu karena data yang ditarik melalui sumber data dependen bukan seperti yang diharapkan oleh penulis tes ? Jika kamu bisa'
Kebanyakan basis kode yang saya lihat yang tidak dibangun dengan pengujian unit dalam pikiran cenderung secara inheren tidak dapat diuji, karena pembuat kode cenderung berfokus pada membuat kode berfungsi seperti yang mereka harapkan daripada melakukan pekerjaan yang diperlukan untuk menjaga sambungan tetap longgar dan ketergantungan secara eksplisit. . Kode yang ditulis dengan pengujian unit dalam pikiran cenderung terlihat sangat berbeda.
Banyak orang mengambil pendekatan naif untuk pengujian unit ketika mereka mulai melakukannya untuk pertama kalinya, mereka pikir mereka bisa menulis banyak tes untuk basis kode yang ada dan semuanya akan baik, tetapi tidak pernah berhasil seperti itu karena masalah yang disebutkan di atas. Mereka mulai menemukan bahwa mereka harus mengesampingkan jumlah pengaturan dalam tes unit untuk menjalankannya sama sekali, dan hasilnya sering dipertanyakan karena kurangnya isolasi dalam kode berarti Anda tidak dapat melacak apa yang menyebabkan kegagalan pengujian. Mereka juga cenderung mulai mencoba untuk menulis tes "pintar" yang menunjukkan beberapa aspek yang sangat abstrak tentang bagaimana sistem seharusnya bekerja. Ini cenderung gagal karena unit test "pintar" adalah sumber potensi bug itu sendiri. Apakah tes gagal karena bug dalam modul yang diuji, atau karena bug dalam ujian? Tes harus sangat sederhana sehingga jelas tidak ada kemungkinan bug bisa bersembunyi di dalamnya. Sebenarnya tes terbaik jarang lebih dari 2 baris, baris pertama memerintahkan unit yang diuji untuk melakukan sesuatu, yang kedua menyatakan bahwa apa yang dilakukannya adalah apa yang diharapkan.
Jika tim Anda serius untuk mengadopsi pengujian unit, maka tidak bijaksana untuk memulai dengan proyek yang ada. Proyek tim Anda yang sudah ada mungkin tidak dapat diuji tanpa refactoring besar. Anda lebih baik menggunakan proyek baru sebagai dasar belajar tentang pengujian unit, karena Anda memiliki batu tulis yang bersih untuk bekerja dengannya. Anda dapat mendesain basis kode baru untuk mendukung injeksi ketergantungan lebih dari lajang, pendaftar dan dependensi tersembunyi lainnya, Anda dapat menulisnya bergantung pada antarmuka alih-alih implementasi dan sebagainya. Anda juga dapat (dan harus) menulis tes di samping kode yang diuji, karena menulis tes kemudian menghasilkan tes unit yang memastikan modul yang diuji melakukan apa yang menurut Anda seharusnya dilakukan daripada tes yang menguji yang dilakukannya. apa yang harus dilakukan oleh spesifikasi.
Setelah Anda mendapatkan kepercayaan diri dengan pengujian unit, tim Anda mungkin akan mulai menyadari kekurangan dalam kode mereka yang ada yang akan menjadi hambatan untuk tes unit. Ini adalah saat Anda dapat mulai bekerja untuk memperbaiki kode yang ada agar lebih dapat diuji. Jangan ambisius dan berusaha melakukan ini sekaligus, atau mencoba mengganti sistem yang bekerja dengan yang sama sekali baru, cukup mulai dengan menemukan bit basis kode yang dapat dengan mudah diuji (yang tidak memiliki dependensi atau di mana dependensi terlihat jelas) dan tulis tes untuk itu. Saya tahu saya katakan menulis tes di samping kode lebih disukai daripada menulis tes setelah, tetapi bahkan tes yang ditulis kemudian masih memiliki nilai sebagai titik awal. Tulis tes seolah-olah Anda tidak tahu apa-apa tentang cara kerja kelas selain apa yang harus dilakukan spesifikasinya. Ketika Anda menjalankan tes dan mendapatkan kegagalan, maka spesifikasi atau implementasinya salah. Periksa keduanya untuk menentukan yang salah dan perbarui tes atau kode yang sesuai.
Setelah Anda memilih buah yang menggantung rendah, pekerjaan Anda yang sebenarnya dimulai. Anda harus mulai menemukan dependensi tersembunyi di basis kode Anda dan memperbaikinya, satu per satu. Jangan terlalu ambisius pada saat ini, cukup lakukan satu modul pada satu waktu, atau bahkan hanya satu masalah dalam satu modul, sampai hambatan untuk pengujian diperbaiki dan Anda dapat beralih ke bit berikutnya.
TL: DR: Sebagian besar orang berpikir pengujian itu mudah dan Anda dapat memasang kembali tes ke kode yang ada dengan mudah. Kedua asumsi ini salah. Jika Anda memulai suatu proyek untuk mendapatkan unit testing ke dalam proyek Anda dengan kedua fakta ini dalam pikiran Anda lebih mungkin untuk berhasil.