Apakah saya melakukan itu benar? Kalau bukan apa tepatnya aku harus berubah
Sulit dikatakan hanya dari uraian singkat itu, tetapi saya curiga, tidak, Anda tidak melakukannya dengan benar. Catatan: Saya tidak mengatakan bahwa apa yang Anda lakukan tidak berfungsi atau dalam beberapa hal buruk, tetapi Anda tidak melakukan TDD. Bagian tengah "D" berarti "Didorong", tes menggerakkan segalanya, proses pengembangan, kode, desain, arsitektur, semuanya .
Tes memberi tahu Anda apa yang harus ditulis, kapan harus menulis, apa yang harus ditulis selanjutnya, kapan harus berhenti menulis. Mereka memberi tahu Anda desain dan arsitekturnya. (Desain dan arsitektur muncul dari kode melalui refactoring.) TDD bukan tentang pengujian. Ini bahkan bukan tentang menulis tes pertama: TDD adalah tentang membiarkan tes membuat Anda, menulis mereka terlebih dahulu hanyalah prasyarat yang diperlukan untuk itu.
Tidak masalah apakah Anda benar-benar menulis kode, atau membuatnya sepenuhnya berubah: Anda menulis kode (kerangka) di kepala Anda, kemudian menulis tes untuk kode itu. Itu bukan TDD.
Melepaskan kebiasaan itu sulit . Sangat, sangat sulit. Tampaknya sangat sulit bagi programmer berpengalaman.
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
Biasanya, ini akan mengarah pada desain yang sangat berbeda dari "metode pseudo-TDD" yang sering dipraktikkan, membayangkan di kepala Anda seperti apa desainnya, kemudian menulis tes untuk memaksa desain itu, mengimplementasikan desain yang sudah Anda bayangkan sebelum menulis Anda tes ".
Ketika sekelompok orang menerapkan sesuatu seperti permainan tic tac toe menggunakan pseudo-TDD, mereka biasanya berakhir dengan desain yang sangat mirip yang melibatkan beberapa jenis Board
kelas dengan array 3 × 3 Integer
s. Dan setidaknya sebagian programmer benar-benar telah menulis kelas ini tanpa tes untuk itu karena mereka "tahu bahwa mereka akan membutuhkannya" atau "perlu sesuatu untuk menulis tes mereka terhadap". Namun, ketika Anda memaksa kelompok yang sama untuk menerapkan TDD As If You Meant It, mereka akan sering berakhir dengan keragaman desain yang sangat berbeda, seringkali tidak menggunakan apa pun yang bahkan mirip dengan a Board
.
Apakah ada cara Anda dapat mengidentifikasi apakah tes yang Anda tulis sudah cukup?
Ketika mereka memenuhi semua persyaratan bisnis. Tes adalah penyandian persyaratan sistem.
Apakah praktik yang baik untuk menulis tes untuk fungsionalitas yang sangat sederhana yang mungkin setara dengan 1 + 1 = 2 atau hanya overplay?
Sekali lagi, Anda memilikinya mundur: Anda tidak menulis tes untuk fungsionalitas. Anda menulis fungsionalitas untuk tes. Jika fungsionalitas untuk lulus tes ternyata sepele, itu hebat! Anda baru saja memenuhi persyaratan sistem dan bahkan tidak perlu bekerja keras untuk itu!
Apakah baik untuk mengubah fungsionalitas dan menguji apakah persyaratan berubah?
Tidak. Sebaliknya. Jika persyaratan berubah, Anda mengubah tes yang sesuai dengan persyaratan itu, melihatnya gagal, lalu mengubah kode agar lulus. Tes selalu diutamakan.
Sulit untuk melakukan ini. Anda perlu lusinan, mungkin ratusan jam latihan yang disengaja untuk membangun semacam "memori otot" untuk mencapai suatu titik, di mana ketika tenggat waktu tampak dan Anda berada di bawah tekanan, Anda bahkan tidak perlu memikirkannya , dan melakukan ini menjadi cara tercepat dan paling alami untuk bekerja.