Lebih suka pengujian ke antarmuka daripada pengujian pada implementasi.
Ini pemahaman saya bahwa metode pribadi tidak dapat diuji
Ini tergantung pada lingkungan pengembangan Anda, lihat di bawah.
[metode pribadi] tidak perlu khawatir karena API publik akan memberikan informasi yang cukup untuk memverifikasi integritas objek.
Benar, TDD berfokus pada pengujian antarmuka.
Metode pribadi adalah detail implementasi yang dapat berubah selama siklus faktor-ulang. Seharusnya dimungkinkan untuk faktor ulang tanpa mengubah antarmuka atau perilaku kotak hitam . Bahkan, itu adalah bagian dari manfaat TDD, kemudahan yang Anda gunakan untuk menghasilkan kepercayaan bahwa perubahan internal ke kelas tidak akan memengaruhi pengguna kelas itu.
Yah, mungkin bagi saya untuk membuat objek yang hanya memiliki metode pribadi dan berinteraksi dengan objek lain dengan mendengarkan acara mereka. Ini akan sangat dirangkum, tetapi sama sekali tidak dapat diuji.
Bahkan jika kelas tidak memiliki metode umum, itu event yang itu antarmuka publik , dan terhadap yang antarmuka publik bahwa Anda dapat menguji.
Karena peristiwa adalah antarmuka maka itu adalah peristiwa yang Anda perlu hasilkan untuk menguji objek itu.
Lihatlah menggunakan benda tiruan sebagai lem untuk sistem pengujian Anda. Seharusnya dimungkinkan untuk membuat objek tiruan sederhana yang menghasilkan suatu peristiwa dan mengambil perubahan status yang dihasilkan (dimungkinkan oleh objek tiruan penerima lain).
Juga, itu dianggap praktik buruk untuk menambahkan metode demi pengujian.
Tentu saja, Anda harus sangat berhati - hati dalam mengekspos keadaan internal.
Apakah ini berarti TDD bertentangan dengan enkapsulasi? Apa saldo yang tepat?
Benar-benar tidak.
TDD seharusnya tidak mengubah implementasi kelas Anda selain untuk menyederhanakannya (dengan menerapkan YAGNI dari poin sebelumnya).
Praktik terbaik dengan TDD identik dengan praktik terbaik tanpa TDD, Anda baru tahu mengapa lebih cepat, karena Anda menggunakan antarmuka saat Anda mengembangkannya.
Saya cenderung membuat sebagian besar atau semua metode saya publik sekarang ...
Ini lebih baik membuang bayi keluar dengan air mandi.
Anda tidak perlu membuat semua metode terbuka agar Anda dapat mengembangkannya dengan cara TDD. Lihat catatan saya di bawah ini untuk melihat apakah metode pribadi Anda benar-benar tidak dapat diuji.
Pandangan yang lebih rinci pada pengujian metode pribadi
Jika Anda benar-benar harus menguji beberapa perilaku pribadi kelas, tergantung pada bahasa / lingkungannya, Anda mungkin memiliki tiga opsi:
- Letakkan tes di kelas yang ingin Anda uji.
- Letakkan tes di file kelas / sumber lain & paparkan metode pribadi yang ingin Anda uji sebagai metode publik.
- Gunakan lingkungan pengujian yang memungkinkan Anda untuk menjaga kode pengujian dan produksi terpisah, namun masih memungkinkan akses kode pengujian ke metode pribadi dari kode produksi.
Jelas opsi ke-3 sejauh ini adalah yang terbaik.
1) Letakkan tes di kelas yang ingin Anda uji (tidak ideal)
Menyimpan kasus uji dalam file kelas / sumber yang sama dengan kode produksi yang sedang diuji adalah pilihan paling sederhana. Tetapi tanpa banyak arahan pra-prosesor atau anotasi Anda akan berakhir dengan kode pengujian Anda menggembungkan kode produksi Anda tidak perlu, dan tergantung pada bagaimana Anda telah menyusun kode Anda, Anda mungkin berakhir secara tidak sengaja mengekspos implementasi internal kepada pengguna kode itu.
2) Ekspos metode pribadi yang ingin Anda uji sebagai metode publik (benar-benar bukan ide yang baik)
Seperti yang disarankan ini adalah praktik yang sangat buruk, menghancurkan enkapsulasi dan akan memaparkan implementasi internal kepada pengguna kode.
3) Gunakan lingkungan pengujian yang lebih baik (opsi terbaik, jika tersedia)
Di dunia Eclipse, 3. dapat dicapai dengan menggunakan fragmen . Di dunia C #, kita mungkin menggunakan kelas parsial . Bahasa / lingkungan lain sering memiliki fungsi yang serupa, Anda hanya perlu menemukannya.
Dengan asumsi 1. atau 2. adalah satu-satunya pilihan yang kemungkinan akan menghasilkan perangkat lunak produksi yang penuh dengan kode uji atau antarmuka kelas yang buruk yang mencuci linen kotor mereka di depan umum. * 8 ')
- Secara keseluruhan - jauh lebih baik untuk tidak menguji terhadap implementasi swasta sekalipun.