TL; DR
Menulis tes yang baik dan bermanfaat sulit, dan memiliki biaya tinggi dalam C ++. Dapatkan Anda pengembang yang berpengalaman membagikan alasan Anda tentang apa dan kapan menguji?
Cerita panjang
Saya biasa melakukan pengembangan yang digerakkan oleh tes, seluruh tim saya sebenarnya, tetapi itu tidak berhasil bagi kami. Kami memiliki banyak tes, tetapi tampaknya tidak pernah mencakup kasus di mana kami memiliki bug dan regresi sebenarnya - yang biasanya terjadi ketika unit berinteraksi, bukan dari perilaku mereka yang terisolasi.
Hal ini seringkali sangat sulit untuk diuji pada tingkat unit sehingga kami berhenti melakukan TDD (kecuali untuk komponen yang benar-benar mempercepat pengembangan), dan sebagai gantinya menginvestasikan lebih banyak waktu untuk meningkatkan cakupan uji integrasi. Sementara tes unit kecil tidak pernah menangkap bug nyata dan pada dasarnya hanya pemeliharaan overhead, tes integrasi benar-benar sepadan dengan usaha.
Sekarang saya telah mewarisi proyek baru, dan saya bertanya-tanya bagaimana cara mengujinya. Ini adalah aplikasi C ++ / OpenGL asli, jadi tes integrasi sebenarnya bukan pilihan. Tetapi pengujian unit dalam C ++ sedikit lebih sulit daripada di Jawa (Anda harus membuat barang secara eksplisit virtual
), dan program ini tidak terlalu berorientasi objek, jadi saya tidak bisa mengejek / mematikan beberapa hal.
Saya tidak ingin mencabik-cabik dan OO-ize semuanya hanya untuk menulis beberapa tes demi tes menulis. Jadi saya bertanya kepada Anda: Untuk apa saya harus menulis tes? misalnya:
- Fungsi / Kelas yang saya harapkan akan sering berubah?
- Fungsi / Kelas yang lebih sulit untuk diuji secara manual?
- Fungsi / Kelas yang sudah mudah diuji?
Saya mulai menyelidiki beberapa basis kode C ++ yang terhormat untuk melihat bagaimana mereka melakukan pengujian. Saat ini saya sedang mencari kode sumber Chromium, tetapi saya merasa sulit untuk mengekstrak alasan pengujian dari kode tersebut. Jika ada yang punya contoh atau posting yang baik tentang seberapa populer pengguna C ++ (orang-orang dari komite, penulis buku, Google, Facebook, Microsoft, ...) mendekati ini, itu akan sangat membantu.
Memperbarui
Saya telah mencari di situs ini dan di web sejak menulis ini. Menemukan beberapa barang bagus:
- Kapan tepat untuk tidak menguji unit?
- /programming/109432/what-not-to-test-when-it-comes-to-unit-testing
- http://junit.sourceforge.net/doc/faq/faq.htm#best
Sayangnya, semua ini agak Java / C # centric. Menulis banyak tes di Java / C # bukan masalah besar, jadi manfaatnya biasanya melebihi biaya.
Tapi seperti yang saya tulis di atas, lebih sulit di C ++. Terutama jika basis kode Anda tidak begitu-OO, Anda harus mengacaukan segalanya untuk mendapatkan cakupan tes unit yang baik. Sebagai contoh: Aplikasi yang saya warisi memiliki Graphics
ruang nama yang merupakan lapisan tipis di atas OpenGL. Untuk menguji entitas mana pun - yang semuanya menggunakan fungsinya secara langsung - saya harus mengubahnya menjadi antarmuka dan kelas dan menyuntikkannya ke semua entitas. Itu hanya satu contoh.
Jadi ketika menjawab pertanyaan ini, harap diingat bahwa saya harus melakukan investasi yang agak besar untuk tes menulis.
sumber
Jawaban:
Nah, Unit Testing hanya satu bagian. Tes integrasi membantu Anda dengan masalah tim Anda. Tes Integrasi dapat ditulis untuk semua jenis aplikasi, juga untuk aplikasi asli dan OpenGL. Anda harus memeriksa "Growing Object Oriented Software Dipandu oleh Tes" oleh Steve Freemann dan Nat Pryce (mis. Http://www.amazon.com/Growing-Object-Oriented-Software-Guided-Signature/dp/0321503627 ). Ini menuntun Anda langkah demi langkah melalui pengembangan aplikasi dengan GUI dan komunikasi jaringan.
Pengujian Perangkat Lunak yang tidak digerakkan oleh tes adalah cerita lain. Lihat Michael Feathers "Bekerja Secara Efektif dengan Kode Warisan" (http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052).
sumber
Sayang TDD "tidak bekerja dengan baik untuk Anda." Saya pikir itulah kunci untuk memahami ke mana harus berpaling. Tinjau kembali dan pahami bagaimana TDD tidak berfungsi, apa yang bisa Anda lakukan dengan lebih baik, mengapa ada kesulitan.
Jadi, tentu saja unit test Anda tidak menangkap bug yang Anda temukan. Itu intinya. :-) Anda tidak menemukan bug itu karena Anda mencegahnya terjadi sejak awal dengan memikirkan bagaimana antarmuka harus bekerja dan bagaimana memastikan mereka diuji dengan benar.
Untuk menjawab, Anda mempertanyakan, seperti yang telah Anda simpulkan, kode pengujian unit yang tidak dirancang untuk diuji sulit. Untuk kode yang ada, mungkin lebih efektif untuk menggunakan lingkungan uji fungsional atau integrasi daripada lingkungan uji unit. Uji keseluruhan sistem dengan fokus pada area tertentu.
Tentu saja pengembangan baru akan mendapat manfaat dari TDD. Ketika fitur baru ditambahkan, refactoring untuk TDD mungkin membantu untuk menguji pengembangan baru, sementara juga memungkinkan pengembangan unit test baru untuk fungsi-fungsi warisan.
sumber
Saya belum melakukan TDD di C ++ jadi saya tidak bisa mengomentari itu, tetapi Anda seharusnya menguji perilaku yang diharapkan dari kode Anda. Sementara implementasinya dapat berubah, perilaku seharusnya (biasanya?) Tetap sama. Di dunia Java \ C # centric, itu berarti Anda hanya menguji metode publik, menulis tes untuk perilaku yang diharapkan dan melakukan itu sebelum implementasi (yang biasanya lebih baik dikatakan daripada dilakukan :)).
sumber