Pengembangan yang didorong oleh tes - meyakinkan saya! [Tutup]

30

Saya tahu beberapa orang adalah pendukung besar pengembangan yang digerakkan oleh tes. Saya telah menggunakan unit test di masa lalu, tetapi hanya untuk menguji operasi yang dapat diuji dengan mudah atau yang saya percaya akan sangat mungkin benar. Cakupan kode lengkap atau hampir selesai terdengar seperti itu akan memakan banyak waktu.

  1. Untuk proyek apa Anda menggunakan pengembangan berbasis tes? Apakah Anda hanya menggunakannya untuk proyek di atas ukuran tertentu?
  2. Haruskah saya menggunakannya atau tidak? Yakinkan aku!
Casebash
sumber
3
Saya memiliki banyak kesulitan hanya menulis tes. Sampai pada titik di mana saya hanya memverifikasi semuanya secara manual.
TheLQ
Lihatlah pertanyaan ini: stackoverflow.com/questions/301693/…
systempuntoout
1
@TheLQ ... coba beri tahu pelanggan saya bahwa perangkat lunak kontrol-penerbangan saya OK karena saya sudah melakukan tinjauan kode manual :-)
Andrew

Jawaban:

32

Ok, beberapa keuntungan untuk TDD:

  1. Itu berarti Anda berakhir dengan lebih banyak tes. Semua orang suka memiliki tes, tapi beberapa orang seperti menulis mereka. Membangun tes-menulis ke dalam alur pengembangan Anda berarti Anda berakhir dengan lebih banyak tes.
  2. Menulis ke sebuah tes memaksa Anda untuk berpikir tentang testability dari desain Anda, dan desain yang dapat diuji hampir selalu merupakan desain yang lebih baik. Tidak sepenuhnya jelas bagi saya mengapa hal ini terjadi, tetapi pengalaman saya dan sebagian besar penginjil TDD tampaknya membuktikannya.
  3. Berikut ini sebuah penelitian yang mengatakan bahwa walaupun TDD membutuhkan waktu lebih lama untuk menulis, ada pengembalian investasi yang baik karena Anda mendapatkan kode kualitas yang lebih tinggi, dan karenanya lebih sedikit bug untuk diperbaiki.
  4. Ini memberi Anda kepercayaan diri dalam refactoring. Perasaan yang hebat untuk dapat mengubah satu sistem tanpa khawatir akan merusak yang lainnya karena cukup tercakup oleh unit test.
  5. Anda hampir tidak pernah mendapatkan bug berulang, karena setiap orang yang Anda temukan harus mendapatkan tes sebelum diperbaiki.

Anda diminta diyakinkan, jadi ini adalah manfaatnya. Lihat pertanyaan ini untuk tampilan yang lebih seimbang.

Fishtoaster
sumber
10
"desain yang dapat diuji hampir selalu merupakan desain yang lebih baik" - Saya pikir alasan utama untuk ini adalah karena kode yang dapat diuji umumnya modular dan dengan dependensi yang disederhanakan.
Skilldrick
"Semua orang suka ujian, tetapi sedikit orang yang suka menulisnya." - apakah ini benar? Sepertinya akan menyenangkan untuk memikirkan tes yang baik, untuk mencoba menjebak perangkat lunak yang diuji.
DarenW
3
@ DarenW- Saya tidak tahu tentang Anda, tapi saya lebih suka membuat hal-hal berfungsi daripada menghancurkannya. Yang mengatakan, seseorang yang tidak berpikir seperti yang Anda sarankan sangat berharga sebagai tester. Tidak ada cukup QA yang berkualitas di dunia.
Fishtoaster
Saya mendapatkan 403 Forbidden error pada lnk ke PDF itu
Neil N
Diperbarui pada apa yang saya cukup yakin adalah pdf yang sama (beberapa tahun yang lalu)
Fishtoaster
11

Robert C. Martin awalnya membuat poin-poin ini - saya dapat mendukungnya dari pengalaman saya sendiri:

  • Anda secara otomatis akan membangun suite uji regresi unit test saat Anda pergi.
  • Anda hampir tidak pernah menghabiskan waktu untuk debugging, seolah-olah Anda membuat kode sendiri ke dalam lubang, lebih mudah untuk membatalkan kode Anda ke titik ketika tes terakhir berlalu, daripada membuka debugger.
  • Setiap beberapa menit Anda memverifikasi bahwa kode Anda berfungsi - semuanya (atau setidaknya semua perilaku yang tercakup oleh tes, yang jika Anda lakukan TDD adalah persentase yang sangat tinggi).

Saya cukup banyak melakukan TDD sepanjang waktu, apakah saya sedang mengerjakan produksi atau bermain kode; Saya merasa sulit untuk kode cara lain hari ini.

Paddyslacker
sumber
6

(Penafian: Saya hampir tidak melakukan hal-hal UI, jadi saya tidak bisa membahas TDD untuk UI.)

Saya menggunakan TDD di hampir semua yang saya lakukan, dari aplikasi sepele hingga seluruh tumpukan SIP.

Saya tidak menggunakan TDD di situs web warisan PHP yang saya ambil. Saya merasa sakit karena tidak menjalani tes. Dan saya merasa sangat mengganggu secara tidak sengaja merusak bagian-bagian situs karena saya tidak memiliki suite uji regresi yang mengatakan bahwa saya telah merusak sesuatu. Klien tidak memiliki anggaran bagi saya untuk (a) menulis tes untuk basis kode dan (b) dalam proses membuat kode diuji di tempat pertama, jadi saya hanya tahan dengan itu.

Frank Shearar
sumber
1
  • Kapan pun klien Anda dapat disuplai dengan lebih efektif (mereka mungkin akan berhubungan dengan baik dengan tes - dan setidaknya akan mengurangi diskusi akhir proyek)
  • Kapan pun akan memakan waktu lebih lama, beri tahu rekan pengembang Anda tentang SETIAPNYA dalam kode daripada berupaya membangun tes - dan ini lebih cepat dari yang Anda kira
Tobiasopdenbrouw
sumber
-1

Apa? Tidak ada jawaban negatif !?

Penafian: Saya bukan anti-unit-testing. Ketika orang mengatakan TDD, saya berasumsi itu berarti versi penyakit yang terdengar di mana mereka menulis tes sebelum mereka menulis kode untuk 80-100% dari semua kode yang mereka tulis.

Saya Akan Berdebat:

  • Itu enabler. Jika menangkap masalah regresi adalah masalah besar bagi Anda sehingga TDD otomatis penuh sejak awal tampaknya bermanfaat, menulis tes untuk setiap bagian terakhir dari kode yang Anda tulis, sebenarnya dapat membantu Anda mengabaikan masalah sebenarnya.

  • Ini membantu orang mengabaikan masalah sebenarnya. Ketika memperbaiki satu bug berubah menjadi permainan whack-a-mole di mana dua pop-up lagi, arsitekturnya meledak. Fokus. Fokus pada masalah sebenarnya. Melihat tahi lalat sebelum mereka harus dihantam rapi tetapi Anda tidak harus ada di tempat pertama.

  • Itu memakan banyak waktu. Saya menemukan bug sesekali. Saya tidak menekan begitu banyak sehingga sepertinya layak untuk mengawali setiap hal baru yang saya tulis dengan tes untuk itu. Menangkap masalah yang kemungkinan akan terjadi. Tangani kesalahan sedemikian rupa sehingga mudah didiagnosis. Mengesahkan. Tes pada titik-titik utama tumpang tindih / bottleneck. Tetapi untuk menangis dengan keras jangan menguji setiap pengambil dan penyetel terakhir dalam sesuatu yang mungkin seharusnya tidak memiliki yang pertama.

  • Fokus Desain: Sama sekali tidak mungkin bahkan pengembang yang baik akan menulis kode terbaik yang mereka bisa ketika mereka juga berfokus pada tes. Jika sepertinya satu-satunya cara Anda dapat memiliki desain yang layak, saya sarankan melihat di atas tentang "fokus pada masalah nyata."

  • Gagal Desain Makro: Basis kode pada pekerjaan saya saat ini penuh dengan antarmuka yang tidak pernah digunakan lebih dari satu kali dan pelanggaran besar-besaran pada prinsip KERING dasar yang akhirnya saya baru mengerti ketika saya menyadari orang menulis untuk kerangka kerja pengujian dan pengujian di umum. Pengujian seharusnya tidak mengarah pada arsitektur bodoh. Tidak juga, tidak ada yang lebih skalabel atau layak perusahaan untuk menyalin dan menempel 20 file dan kemudian hanya membuat perubahan signifikan pada keduanya. Idenya adalah untuk memisahkan masalah, bukan membaginya di tengah. Cruft dan pointless abstraksi akan dikenakan biaya lebih dari tidak memiliki jangkauan 95%.

  • Ini sangat populer dan banyak orang benar-benar menyukainya. Jika itu bukan alasan yang cukup untuk setidaknya menebak-nebak dan / atau memeriksa teknologi apa pun sebelum adopsi, pelajari beberapa paranoia.

Erik Reppen
sumber
Para downvoter Bah hanya membaca judul Q dan bukan isinya.
Erik Reppen
1
Saya menurunkan suara dan saya membaca semuanya. banyak kelemahan yang Anda tunjukkan sebenarnya ditangani oleh buku-buku TDD paling dasar. TDD tidak berarti "tulis saja tes studpi WET un-SOLID sebanyak yang Anda bisa dan jangan pernah pikirkan desain". Saya pikir jawaban ini adalah representasi TDD yang tidak adil. jika aplikasi Anda menjadi berantakan karena orang-orang meniru dan menerapkan desain yang mengerikan, maka itu adalah masalah desain. TDD hanyalah alur kerja, dan Anda tidak membahas alur kerja.
Sara