Saya memahami pengembangan yang digerakkan oleh tes sejauh ini sehingga Anda hanya diperbolehkan menulis kode produktif ketika Anda memiliki tes unit yang gagal (merah).
Tidak. Anda hanya diperbolehkan menulis kode sesederhana mungkin untuk mengubah pesan tes. Itu tidak mengatakan apa-apa tentang tes seperti apa.
Bahkan, Anda mungkin akan mulai dengan menulis tes penerimaan gagal (merah) untuk kriteria penerimaan, lebih tepatnya, Anda menulis tes penerimaan paling sederhana yang mungkin gagal; setelah itu Anda menjalankan tes, melihatnya gagal, dan memverifikasi bahwa itu gagal karena alasan yang tepat. Kemudian Anda menulis tes fungsional yang gagal untuk sepotong fungsionalitas kriteria penerimaan itu, sekali lagi, Anda menulis tes fungsional paling sederhana yang mungkin gagal, menjalankannya, menontonnya gagal, dan memverifikasi bahwa itu gagal karena alasan yang tepat. Kemudian Anda menulis tes unit gagal, tes unit paling sederhana yang mungkin gagal, jalankan melihatnya gagal, verifikasi bahwa itu gagal karena alasan yang tepat.
Sekarang , Anda menulis kode produksi paling sederhana yang dapat mengubah pesan kesalahan. Jalankan pengujian lagi, verifikasi bahwa pesan kesalahan telah berubah, bahwa itu berubah ke arah yang benar, dan bahwa kode itu mengubah pesan untuk alasan yang benar. (Idealnya, pesan kesalahan harus hilang sekarang, dan tes harus lulus, tetapi lebih sering daripada tidak, lebih baik untuk mengambil langkah kecil mengubah pesan daripada mencoba untuk mendapatkan tes untuk lulus dalam sekali jalan - itulah alasannya mengapa pengembang kerangka kerja uji coba menghabiskan begitu banyak upaya untuk pesan kesalahan mereka!)
Setelah tes unit berhasil, Anda memperbaiki kode produksi Anda di bawah perlindungan pengujian Anda. (Perhatikan bahwa saat ini, tes penerimaan dan tes fungsional masih gagal, tetapi tidak apa-apa, karena Anda hanya refactoring unit individual yang dicakup oleh tes unit.)
Sekarang Anda membuat tes unit berikutnya dan ulangi di atas, sampai tes fungsional juga berlalu. Di bawah perlindungan uji fungsional, kini Anda dapat melakukan refactor di beberapa unit.
Siklus tengah ini sekarang berulang hingga tes penerimaan berlalu, pada titik mana Anda sekarang dapat melakukan refactor di seluruh sistem.
Sekarang, Anda memilih kriteria penerimaan berikutnya dan siklus luar dimulai lagi.
Kent Beck, "penemu" dari TDD (dia tidak suka istilah "penemu", katanya orang telah melakukan ini selama ini, dia hanya memberi nama dan menulis buku tentang itu) menggunakan analogi dari fotografi dan menyebutnya "memperbesar dan memperkecil".
Catatan: Anda tidak selalu membutuhkan tiga tingkat tes. Mungkin, terkadang Anda membutuhkan lebih banyak. Lebih sering, Anda membutuhkan lebih sedikit. Jika kepingan fungsionalitas Anda kecil, dan uji fungsional Anda cepat, maka Anda bisa bertahan tanpa (atau dengan tes unit lebih sedikit). Seringkali, Anda hanya perlu tes penerimaan dan tes unit. Atau, kriteria penerimaan Anda sangat halus sehingga tes penerimaan Anda adalah tes fungsional.
Kent Beck mengatakan bahwa jika dia memiliki tes fungsional yang cepat, kecil, dan fokus, dia pertama-tama akan menulis unit test, biarkan unit test mengemudikan kode, kemudian hapus (beberapa) unit test lagi yang mencakup kode yang juga tercakup oleh tes fungsional cepat. Ingat: kode uji juga kode yang perlu dipertahankan dan dire-refored, semakin sedikit, semakin baik!
Namun, saya bertanya-tanya apakah pendekatan yang digerakkan oleh tes juga dapat diterapkan pada bentuk tes lainnya.
Anda tidak benar-benar menerapkan TDD pada tes. Anda menerapkannya pada seluruh proses pengembangan Anda. Itulah yang dimaksud dengan "didorong" dari Test- Driven -Development: semua pengembangan Anda didorong oleh tes. Tes tidak hanya mengarahkan kode yang Anda tulis, tetapi juga mengarahkan kode apa yang akan ditulis, kode mana yang akan ditulis selanjutnya. Mereka menggerakkan desain Anda. Mereka memberi tahu Anda ketika Anda selesai. Mereka memberi tahu Anda apa yang harus dikerjakan selanjutnya. Mereka memberi tahu Anda tentang cacat desain dalam kode Anda (ketika tes sulit untuk menulis).
Keith Braithwaite telah menciptakan latihan yang dia sebut TDD As If You Meant It . Ini terdiri dari seperangkat aturan (berdasarkan Tiga Aturan TDD Paman Bob Martin , tetapi jauh lebih ketat) yang harus Anda ikuti dengan ketat dan yang dirancang untuk mengarahkan Anda untuk menerapkan TDD dengan lebih ketat. Ini bekerja paling baik dengan pemrograman pasangan (sehingga pasangan Anda dapat memastikan Anda tidak melanggar aturan) dan seorang instruktur.
Aturannya adalah:
- Tulis persis satu tes baru, tes terkecil yang bisa Anda lakukan yang mengarah pada solusi
- Lihat itu gagal; kegagalan kompilasi dihitung sebagai kegagalan
- Buat tes dari (1) lulus dengan menulis kode implementasi paling tidak yang Anda bisa dalam metode pengujian .
- Refactor untuk menghilangkan duplikasi, dan jika tidak diperlukan untuk meningkatkan desain. Ketat menggunakan gerakan ini:
- Anda menginginkan metode baru — tunggu hingga waktu refactoring, lalu… buat metode baru (non-tes) dengan melakukan salah satu dari ini, dan tidak dengan cara lain:
- lebih disukai: lakukan Extract Method pada kode implementasi yang dibuat sesuai dengan (3) untuk membuat metode baru di kelas tes, atau
- jika Anda harus: memindahkan kode implementasi sesuai (3) ke metode implementasi yang ada
- Anda ingin kelas baru — tunggu sampai waktu refactoring, lalu ... buat kelas non-tes untuk memberikan tujuan untuk Metode Pindah dan tanpa alasan lain
- mengisi kelas implementasi dengan metode dengan melakukan Metode Pindah, dan tidak ada cara lain
Aturan-aturan ini dimaksudkan untuk melakukan TDD. Mereka tidak dimaksudkan untuk benar-benar melakukan TDD dalam produksi (meskipun tidak ada yang menghentikan Anda untuk mencobanya). Mereka bisa merasa frustasi karena kadang-kadang akan tampak seolah-olah Anda membuat ribuan langkah kecil mungil tanpa membuat kemajuan nyata.