Selama pelatihan TDD berdasarkan kasus perangkat lunak medis, kami menerapkan kisah berikut: "Ketika pengguna menekan tombol Simpan, sistem harus menambah pasien, menambah perangkat, dan menambahkan catatan data perangkat".
Implementasi akhir akan terlihat seperti ini:
if (_importDialog.Show() == ImportDialogResult.SaveButtonIsPressed)
{
AddPatient();
AddDevice();
AddDeviceDataRecords();
}
Kami memiliki dua cara untuk mengimplementasikannya:
- Tiga tes di mana masing-masing memverifikasi satu metode (AddPatient, AddDevice, AddDeviceDataRecords) dipanggil
- Satu tes yang memverifikasi ketiga metode dipanggil
Dalam kasus pertama jika ada sesuatu yang salah terjadi jika kondisi klausa, ketiga tes akan gagal. Tetapi dalam kasus kedua jika tes gagal, kami tidak yakin apa yang sebenarnya salah. Apa yang Anda inginkan?
sumber
Granularitas dalam contoh Anda tampaknya merupakan perbedaan antara tes unit dan penerimaan.
Unittest menguji unit fungsionalitas tunggal, dengan sesedikit mungkin dependensi. Dalam kasus Anda, mungkin ada 4 unittests
Unittests adalah untuk pengembang , sehingga mereka mendapatkan kepercayaan, bahwa kode mereka secara teknis benar
Tes penerimaan harus menguji fungsi gabungan, dari perspektif pengguna. Mereka harus dimodelkan di sepanjang cerita pengguna, dan setinggi mungkin. Jadi, Anda tidak perlu memeriksa apakah fungsi dipanggil, tetapi jika manfaat yang terlihat oleh pengguna tercapai:
ketika pengguna memasukkan data, klik ok dan ...
tes penerimaan adalah untuk pelanggan , atau, untuk membangun komunikasi yang lebih baik dengan mereka.
Untuk menjawab pertanyaan Anda "apa yang Anda inginkan": apa masalah yang lebih besar bagi Anda saat ini, bug dan regresi (=> lebih banyak yang tidak diundang) atau memahami dan memformalkan gambaran besar (=> lebih banyak tes penerimaan)
sumber
Itu salah.
Anda harus melakukan ini untuk memastikan itu berfungsi.
Anda juga harus melakukan ini untuk memastikan API berfungsi.
Kelas - sebagai satu unit - harus diuji sepenuhnya. Setiap metode.
Anda bisa mulai dengan tes yang mencakup ketiga metode, tetapi tidak banyak memberi tahu Anda.
Benar. Itu sebabnya Anda menguji semua metode.
Anda harus menguji antarmuka publik. Karena kelas ini melakukan tiga ditambah satu hal (bahkan jika mereka dibundel dalam satu metode karena cerita pengguna) Anda harus menguji keempat hal tersebut. Tiga tingkat rendah dan satu bundel.
sumber
Kami menulis pengujian unit kami untuk kalimat fungsional yang bermakna yang berkali-kali memetakan suatu metode (jika Anda telah menulis kode dengan baik), tetapi kadang-kadang menjadi lebih besar, mencakup banyak metode.
Misalnya, bayangkan menambahkan pasien ke sistem Anda memerlukan beberapa subrutin (fungsi anak) untuk dipanggil:
Kami mungkin juga menulis unit test untuk masing-masing fungsi ini.
sumber
Salah satu aturan praktis sederhana yang saya ikuti adalah memberi nama tes sehingga menjelaskan dengan tepat apa yang dilakukan tes. Jika nama tes menjadi terlalu kompleks itu adalah tanda bahwa tes itu mungkin terlalu banyak. Jadi misalnya penamaan tes untuk melakukan apa yang Anda usulkan dalam opsi 2 mungkin terlihat seperti PatientIsAddedDeviceIsAddedAndDeviceDataRecordsWhenSaved yang jauh lebih kompleks dari tiga tes terpisah PatiIAddedWhenSaved, DeviceIsAddedWhenSaved, DataRecordsWhenSaved. Saya juga berpikir pelajaran yang dapat dipelajari dari BDD cukup menarik di mana setiap tes benar-benar mewakili satu persyaratan yang dapat dijelaskan dalam bahasa alami.
sumber