Perbedaan waktu antara pengembangan dengan tes unit vs tanpa tes

132

Saya adalah pengembang solo dengan lingkungan kerja yang terbatas waktu di mana waktu pengembangan biasanya berkisar 1-4 minggu per proyek, tergantung pada persyaratan, urgensi, atau keduanya. Pada waktu tertentu saya menangani sekitar 3-4 proyek, beberapa memiliki jadwal yang tumpang tindih satu sama lain.

Diharapkan, kualitas kode menderita. Saya juga tidak memiliki pengujian formal; biasanya turun untuk berjalan melalui sistem sampai agak rusak. Akibatnya, sejumlah besar bug lolos ke produksi, yang harus saya perbaiki dan pada gilirannya mengembalikan proyek saya yang lain.

Di sinilah unit testing masuk. Ketika dilakukan dengan benar, itu harus menjaga bug, apalagi yang melarikan diri ke produksi, seminimal mungkin. Di sisi lain, tes menulis dapat mengambil banyak waktu, yang tidak terdengar baik dengan proyek yang dibatasi waktu seperti tambang.

Pertanyaannya adalah, seberapa jauh perbedaan waktu akan menulis kode yang diuji unit daripada kode yang belum diuji, dan bagaimana skala perbedaan waktu itu sebagai lingkup proyek bertambah?

Revenant
sumber
Komentar bukan untuk diskusi panjang; percakapan ini telah dipindahkan ke obrolan .
maple_shaft
8
Anda sedang memecahkan masalah yang salah. Anda terlalu sibuk dan tampaknya tidak memiliki dukungan manajemen proyek. Apakah Anda memperkirakan upaya proyek? Apakah Anda memesan 20% dari waktu Anda untuk perbaikan bug, rapat, dan tugas non-coding lainnya? Berapa banyak kerja lembur Anda?
Tony Ennis
20
Apakah Anda sadar bahwa pada dasarnya Anda mengatakan, "Saya punya waktu untuk melakukannya dua kali, tetapi tidak punya waktu untuk melakukannya sekali dengan cara yang benar."?
RubberDuck
5
@RubberDuck sebenarnya ada titik dalam kurva kompleksitas proyek yang diukur sebagai Waktu untuk Menulis vs Waktu untuk Menguji, di mana "Peras dua kali", membutuhkan waktu lebih sedikit daripada "Tulis dan tes itu". Saya pikir itu mungkin suatu tempat di wilayah oneliner bash.
Lyndon White
Suatu kali pengembang mendapat hadiah dan terima kasih ketika proyek dibatalkan. Saya menunjukkan bahwa kami dapat menjadi lebih produktif jika kami tahu bahwa produk tersebut tidak akan dikirim. Jadi, ini adalah kasus di mana pengembangan tanpa pengujian akan menguntungkan.
JDługosz

Jawaban:

148

Semakin Anda menguji, semakin banyak biayanya untuk menulis tes.

Semakin lama bug hidup, semakin mahal untuk memperbaikinya.

Hukum pengembalian yang semakin berkurang memastikan Anda dapat menguji diri Anda sendiri untuk mencoba memastikan tidak ada bug.

Buddha mengajarkan kebijaksanaan jalan tengah. Tesnya bagus. Ada hal yang terlalu baik. Kuncinya adalah mengetahui kapan Anda tidak seimbang.

Setiap baris kode yang Anda tulis tanpa tes akan memiliki biaya yang jauh lebih besar untuk menambahkan tes lebih lambat daripada jika Anda telah menulis tes sebelum menulis kode.

Setiap baris kode tanpa tes akan secara signifikan lebih sulit untuk di-debug atau ditulis ulang.

Setiap tes yang Anda tulis akan memakan waktu.

Setiap bug akan membutuhkan waktu untuk memperbaikinya.

Orang beriman akan memberitahu Anda untuk tidak menulis satu baris kode tanpa terlebih dahulu menulis tes gagal. Tes memastikan Anda mendapatkan perilaku yang Anda harapkan. Ini memungkinkan Anda untuk mengubah kode dengan cepat tanpa khawatir akan memengaruhi sisa sistem karena tes membuktikan perilaku yang sama.

Anda harus menimbang semua itu terhadap fakta bahwa tes tidak menambah fitur. Kode produksi menambah fitur. Dan fitur adalah apa yang membayar tagihan.

Secara pragmatis, saya menambahkan semua tes yang bisa saya lakukan. Saya mengabaikan komentar demi menonton tes. Saya bahkan tidak memercayai kode untuk melakukan apa yang saya pikirkan. Saya percaya tes. Tapi aku dikenal sering melempar hujan es dan beruntung.

Namun, banyak coders yang sukses tidak melakukan TDD. Itu tidak berarti mereka tidak menguji. Mereka hanya tidak secara obyektif bersikeras bahwa setiap baris kode memiliki tes otomatis yang menentangnya. Bahkan Paman Bob mengakui dia tidak menguji UI-nya. Dia juga menegaskan Anda memindahkan semua logika dari UI.

Sebagai metafora sepakbola (itulah sepak bola Amerika) TDD adalah permainan darat yang bagus. Manual hanya menguji di mana Anda menulis setumpuk kode dan berharap itu berfungsi adalah permainan yang lewat. Anda bisa pandai keduanya. Karier Anda tidak akan mencapai babak playoff kecuali Anda dapat melakukan keduanya. Itu tidak akan membuat superbowl sampai Anda belajar kapan harus memilih masing-masing. Tetapi jika Anda membutuhkan dorongan ke arah tertentu: panggilan pejabat melawan saya lebih sering ketika saya lewat.

Jika Anda ingin mencoba TDD, saya sangat menyarankan Anda berlatih sebelum mencoba melakukannya di tempat kerja. TDD dilakukan setengah jalan, setengah hati, dan setengah assed adalah alasan besar beberapa orang tidak menghormatinya. Ini seperti menuangkan satu gelas air ke gelas lainnya. Jika Anda tidak berkomitmen dan melakukannya dengan cepat dan sepenuhnya, Anda berakhir menggiring air ke seluruh meja.

candied_orange
sumber
68
Ada yang namanya terlalu banyak hal baik Baik Anda maupun Buddha belum menguji kue nenek saya :-)
Pierre Arlaud
3
@NickAlexeev Saya suka grafik itu di sana. Satu hal yang tidak ditunjukkan adalah bahwa unit test (yang biasanya otomatis) sangat bagus dalam menemukan bug ketika kode dimodifikasi. Saya ingin melihat bahwa terbagi menjadi "bug yang ditemukan sebelum rilis" dan "bug ditemukan setelah rilis". Tes unit adalah garis pertahanan terbaik terhadap regresi.
corsiKa
3
Saya pikir ini adalah jawaban yang sangat seimbang: menguji segala sesuatu, bahkan hal-hal sepele, bisa membuang-buang waktu. Memiliki tes yang baik untuk bagian-bagian kompleks yang dapat dengan mudah pecah dapat sangat membantu. Saya baru saja selesai porting proyek kecil tapi non-sepele dari Java ke C ++. Saya pertama-tama memporting tes dan ini memandu saya mengatur seluruh implementasi C ++. Setelah semua tes berwarna hijau, hanya beberapa kelas yang lebih mudah yang perlu porting dan berjalan cukup lancar. Di sisi lain, saya tidak memiliki tes untuk semua kode: ini akan memperpanjang implementasi setidaknya 3, 4 hari dengan sedikit perolehan.
Giorgio
5
Sedikit perbedaan pendapat dengan ini: 'Anda harus mempertimbangkan semua itu terhadap fakta bahwa tes tidak menambah fitur. Kode menambahkan fitur. Dan fitur itulah yang membayar tagihan. ' Saya akan sangat menyarankan bahwa itu bukan fitur yang membayar tagihan - ini adalah fitur yang berfungsi. (atau apakah orang dibayar untuk kiriman yang tidak bekerja?). Sisa jawaban yang saya setujui sepenuhnya.
Tony Suffolk 66
6
@ TonySuffolk66 Anda benar, ini adalah fitur yang berfungsi membayar tagihan (kecuali penjualan flimflam) Namun, orang-orang menciptakan fitur yang berfungsi jauh sebelum TDD. Mereka akan lama setelah itu hilang. Ingat, TDD adalah cara pengujian yang disiplin. Ini bukan satu-satunya cara pengujian yang disiplin.
candied_orange
112

Saya setuju dengan sisa jawaban tetapi untuk menjawab pertanyaan perbedaan waktu secara langsung.

Roy Osherove dalam bukunya The Art of Unit Testing, Edisi Kedua halaman 200 melakukan studi kasus tentang implementasi proyek berukuran sama dengan tim yang sama (keahlian) untuk dua klien yang berbeda di mana satu tim melakukan pengujian sedangkan yang lainnya tidak.

Hasilnya seperti:

Kemajuan dan hasil tim diukur dengan dan tanpa tes

Jadi pada akhir proyek Anda mendapatkan lebih sedikit waktu dan bug lebih sedikit. Ini tentu saja tergantung pada seberapa besar proyek itu.

Aki K
sumber
32
Ukuran sampel terlalu kecil untuk menganggap ini sebagai ilmiah tetapi saya pikir itu mewakili apa yang dialami banyak orang. Saya menemukan bahwa ketika saya melakukan TDD, sebagian besar waktu ekstra dihabiskan untuk memperbaiki bug yang menyebabkan unit test saya gagal, bukan menulis tes itu sendiri. Itu tidak benar-benar menambah waktu ekstra, hanya bergeser ketika Anda menemukan dan memperbaiki masalah itu. Waktu ekstra nyata dalam memperbaiki masalah yang tidak akan Anda temukan, setidaknya tidak di putaran pertama.
JimmyJames
7
@JimmyJames Ini adalah studi kasus, yang digunakan secara luas dalam bisnis, dan banyak dalam sains ketika tidak (belum) memungkinkan untuk menjalankan percobaan yang dapat direproduksi dalam skala besar. Ada jurnal psikologi penuh dengan mereka. "Tidak ilmiah" bukan kata yang tepat.
Djechlin
25
Mengapa saya berpikir jika hasil dari studi kasus itu menunjukkan sebaliknya, itu tidak akan berhasil masuk ke dalam buku ;-)?
Doc Brown
11
@DocBrown Saya bertanya-tanya berapa banyak studi kasus yang dibuat dan dibuang sebelum mereka menemukan satu dengan jawaban yang benar :-)
gbjbaanb
6
@JimmyJames yang hampir pasti memenuhi syarat sebagai sains. Lebih jauh lagi, ilmuwan lain dapat membaca studi kasus ini "n = 1", memutuskan layak belajar lebih banyak, kemudian menjalankan studi statistik skala besar, atau bahkan eksperimen terkontrol secara longitudinal, dan mengkonfirmasi atau menolaknya. Itulah cara kerja sains. Begitulah seharusnya bekerja. Anda dapat membaca lebih lanjut tentang bagaimana sains bekerja di sini en.wikipedia.org/wiki/Scientific_method
djechlin
30

Hanya ada satu studi yang saya ketahui yang mempelajari ini dalam "pengaturan dunia nyata": Menyadari peningkatan kualitas melalui pengembangan yang digerakkan oleh tes: hasil dan pengalaman dari empat tim industri . Mahal untuk melakukan ini dengan cara yang masuk akal, karena pada dasarnya berarti Anda perlu mengembangkan perangkat lunak yang sama dua kali (atau idealnya bahkan lebih sering) dengan tim yang sama, dan kemudian membuang semua kecuali satu.

Hasil penelitian adalah peningkatan waktu pengembangan antara 15% -35% (yang jauh dari angka 2x yang sering dikutip oleh kritik TDD) dan penurunan kepadatan cacat pra-rilis dari 40% -90% (! ). Perhatikan bahwa semua tim tidak memiliki pengalaman sebelumnya dengan TDD, sehingga orang dapat berasumsi bahwa peningkatan waktu setidaknya dapat sebagian dikaitkan dengan pembelajaran, dan dengan demikian akan turun lebih jauh dari waktu ke waktu, tetapi ini tidak dinilai oleh penelitian.

Perhatikan bahwa penelitian ini adalah tentang TDD, dan pertanyaan Anda adalah tentang pengujian unit, yang merupakan hal yang sangat berbeda, tetapi ini adalah yang terdekat yang bisa saya temukan.

Jörg W Mittag
sumber
1
Akan lebih menarik untuk memaksakan batasan tambahan: tidak ada keadaan bisa berubah, mengikuti SOLID, pengetikan statis, tidak bergantung null, fungsional atas imperatif, kontrak kode, analisis statis, refactoring otomatis, tidak ada wadah IOC (tapi DI) dll. Saya bertaruh nilai itu unit test akan menurun (tetapi tidak hilang).
Den
24

Selesai, pengembangan dengan unit test bisa lebih cepat bahkan tanpa mempertimbangkan manfaat bug tambahan yang ditangkap.

Faktanya adalah, saya bukan pembuat kode yang cukup baik untuk hanya memiliki kode saya bekerja segera setelah dikompilasi. Ketika saya menulis / memodifikasi kode, saya harus menjalankan kode untuk memastikan itu melakukan apa yang saya pikirkan. Pada satu proyek, ini cenderung berakhir seperti:

  1. Ubah kode
  2. Kompilasi aplikasi
  3. Jalankan aplikasi
  4. Masuk ke aplikasi
  5. Buka jendela
  6. Pilih item dari jendela itu untuk membuka jendela lain
  7. Atur beberapa kontrol di jendela itu dan klik tombol

Dan tentu saja, setelah semua itu, biasanya perlu beberapa perjalanan bolak-balik untuk benar-benar melakukannya.

Sekarang, bagaimana jika saya menggunakan tes unit? Maka prosesnya lebih seperti:

  1. Tulis ujian
  2. Jalankan tes, pastikan gagal dengan cara yang diharapkan
  3. Tulis kode
  4. Jalankan tes lagi, lihat apakah itu lulus

Ini lebih mudah dan lebih cepat daripada menguji aplikasi secara manual. Saya masih harus menjalankan aplikasi secara manual (jadi saya tidak terlihat konyol ketika saya menyerahkan pekerjaan yang sebenarnya tidak berfungsi sama sekali), tetapi sebagian besar saya sudah menyelesaikan kekusutan, dan saya hanya memverifikasi pada titik itu. Sebenarnya saya biasanya membuat loop ini lebih ketat dengan menggunakan program yang secara otomatis mengulang tes saya ketika saya simpan.

Namun, ini tergantung pada bekerja di basis kode ramah-tes. Banyak proyek, bahkan yang memiliki banyak tes, membuat tes menulis sulit. Tetapi jika Anda berhasil, Anda dapat memiliki basis kode yang lebih mudah untuk diuji melalui tes otomatis daripada dengan pengujian manual. Sebagai bonus, Anda dapat menyimpan tes otomatis di sekitar, dan terus menjalankannya untuk mencegah regresi.

Winston Ewert
sumber
1
Dan menggunakan sesuatu seperti nCrunch dapat memotong langkah 2 dan 4, membuat umpan balik menjadi lebih kencang.
Euforia
"Saya masih harus menjalankan aplikasi secara manual" adalah pengamatan penting, IMHO. Tidak ada peluru perak.
Den
20

Meskipun sudah ada banyak jawaban, mereka agak berulang dan saya ingin mengambil cara yang berbeda. Tes unit berharga, jika dan hanya jika , mereka meningkatkan nilai bisnis . Pengujian demi pengujian (uji sepele atau tautologis), atau untuk mencapai beberapa metrik sewenang-wenang (seperti cakupan kode), adalah pemrograman kultus kargo.

Tes mahal, tidak hanya dalam waktu yang dibutuhkan untuk menulisnya, tetapi juga pemeliharaan. Mereka harus tetap sinkron dengan kode yang mereka uji atau mereka tidak berharga. Belum lagi biaya waktu menjalankannya pada setiap perubahan. Itu bukan pemecah kesepakatan (atau alasan untuk tidak melakukan yang benar-benar diperlukan), tetapi perlu diperhitungkan dalam analisis biaya-manfaat.

Jadi pertanyaan yang diajukan ketika memutuskan apakah atau tidak (atau jenis apa) untuk menguji suatu fungsi / metode, tanyakan pada diri sendiri 'apa nilai pengguna akhir yang saya buat / lindungi dengan tes ini?'. Jika Anda tidak dapat menjawab pertanyaan itu, di atas kepala Anda , maka ujian itu kemungkinan tidak sebanding dengan biaya penulisan / pemeliharaan. (atau Anda tidak memahami domain masalah, yang merupakan masalah waaaay lebih besar daripada kurangnya tes).

http://rbcs-us.com/documents/Why-Most-Unit-Testing-is-Waste.pdf

Jared Smith
sumber
1
Saya tidak super akrab dengan BDD tetapi akan menebak bahwa itu beroperasi pada granularity yang sedikit lebih kasar daripada tingkat metode / fungsi dan mungkin memiliki koneksi yang kurang renggang ke nilai pengguna.
Jared Smith
1
Terkait
Robbie Dee
9
"Pengujian demi pengujian (uji sepele atau tautologis), atau untuk mencapai beberapa metrik sewenang-wenang (seperti cakupan kode), adalah pemrograman kultus kargo." Begitu benar dan dikatakan dengan baik. Tes sedemikian rupa sehingga Anda merasa seperti seorang badass keren - pikirkan tentang diri Anda sebagai ... mata-mata, atlet elit ... JANGAN tes seperti "departemen pemerintah". Kamu tahu?
Fattie
2
@SteveJessop tidak setuju, cakupan kode (dalam arti menjadi metrik) secara inheren sewenang-wenang: jumlah jalur melalui program non-sepele pada tingkat instruksi mesin (yaitu yang menghitung) akan lebih besar daripada jumlah atom pada Bumi atau bahkan alam semesta yang terlihat. Ini tidak bisa diuji. Jadi setiap klaim dari 'cakupan kode' akan beberapa heuristik yang dipilih sewenang-wenang ambang batas. Pemrogram pandai bermain metrik seperti itu dengan mengorbankan hal-hal yang sebenarnya penting.
Jared Smith
2
Saya juga akan mengatakan bahwa tes memberikan nilai bisnis sekitar (walaupun tidak tepat) setiap kali mereka gagal, dan resolusinya adalah untuk meningkatkan kode yang diuji. Jadi jika Anda menggunakan TDD itu cukup banyak terjadi secara otomatis setidaknya satu per tes. Tes tautologis menurut definisi tidak dapat gagal dan tidak berguna. Untuk tes "sepele" - setelah bekerja dengan Java TCK di awal karir saya, saya tidak lagi terkejut dengan betapa sepele dari tes itu mungkin gagal ketika menerapkan kembali API dari awal ;-) Tetapi nilai bisnis adalah hampir selalu diprediksi secara heuristik, begitu juga "sewenang-wenang" juga.
Steve Jessop
9

Itu tergantung pada orangnya, serta kompleksitas dan bentuk kode yang Anda kerjakan.

Bagi saya, pada sebagian besar proyek, menulis unit test berarti saya menyelesaikan pekerjaan sekitar 25% lebih cepat. Ya, bahkan termasuk waktu untuk menulis tes.

Karena faktanya adalah bahwa perangkat lunak tidak dilakukan ketika Anda menulis kode. Ini dilakukan ketika Anda mengirimkannya ke pelanggan dan mereka senang dengan itu. Sejauh ini, tes unit adalah cara paling efisien yang saya tahu untuk menangkap sebagian besar bug, mengisolasi sebagian besar bug untuk debugging, dan untuk mendapatkan kepercayaan bahwa kode itu baik. Anda harus melakukan hal-hal lagian , sehingga melakukannya dengan baik.

Telastyn
sumber
7
Saya pikir itu perlu dicatat, ini adalah keterampilan yang didapat. Saya melihat begitu banyak orang mendengar klaim bahwa TDD benar-benar bahkan bukan time-sink dimuka yang membayar sendiri dalam jangka panjang, itu hanya lebih cepat, titik. kemudian mereka mencobanya selama sehari dan itu menyakitkan karena mereka memiliki 0 pengalaman, telah membaca 0 buku, tidak ada latihan, mereka hanya berharap itu berfungsi secara ajaib. tidak ada rahasia untuk TDD yang membuat Anda menjadi pengembang yang lebih baik, Anda masih perlu berlatih, masih perlu berpikir, masih perlu membuat keputusan yang berpendidikan baik.
sara
1
@ Kai - +1. Saya menghabiskan berminggu-minggu membaca tentang TDD sebelum saya mencobanya. Saya membaca semua yang saya bisa temukan. Saya membaca buku. Saya membaca semua blog tangkas yang terkenal sebagai contoh. Saya membaca xUnit Test Patterns dari depan ke belakang. Selama beberapa minggu pertama, masih butuh dua kali lebih lama.
Jules
2
Saya setuju. TDD sulit. Pola pikirnya sulit. Siapa pun yang mengatakan "Cukup tulis dulu tes" dan mengklaim bahwa gratis tidak tahu bagaimana melakukannya. Itu membutuhkan latihan.
duffymo
@ Kai: untuk alasan serupa, banyak orang tidak bisa mengetik. Mereka mencobanya sekali dan setelah satu jam penuh masih tidak mengetik lebih cepat dari sebelumnya ;-)
Steve Jessop
@ SeveJessop Saya kira itu perbandingan yang cukup rapi. Atau menjadi benar-benar tidak layak dan keluar untuk joging 10 menit, kelelahan dan bertanya-tanya mengapa Anda tidak dapat berlari 10 mil dalam satu jam. itu benar-benar menggambarkan bagaimana Anda perlu bekerja sebelum Anda mendapatkan manfaatnya.
sara
4

Pertanyaannya adalah, seberapa jauh perbedaan waktu akan menulis kode yang diuji unit daripada kode yang belum diuji, dan bagaimana skala perbedaan waktu itu sebagai lingkup proyek bertambah?

Masalahnya semakin buruk dengan bertambahnya usia proyek: karena setiap kali Anda menambahkan fungsionalitas baru dan / atau setiap kali Anda refactor implementasi yang ada, Anda harus menguji ulang apa yang sebelumnya diuji untuk memastikan bahwa itu masih berfungsi. Jadi, untuk proyek jangka panjang (multi-tahun), Anda mungkin perlu tidak hanya menguji fungsionalitas tetapi menguji kembali 100 kali dan lebih banyak lagi. Untuk alasan ini Anda mungkin mendapat manfaat dari memiliki tes otomatis . Namun, IMO cukup baik (atau bahkan, lebih baik) jika ini adalah tes sistem otomatis, daripada tes unit otomatis.

Masalah kedua adalah bahwa bug bisa lebih sulit ditemukan dan diperbaiki jika mereka tidak ditangkap lebih awal. Sebagai contoh jika ada bug dalam sistem dan saya tahu itu berfungsi dengan baik sebelum Anda membuat perubahan terbaru, maka saya akan memusatkan perhatian saya pada perubahan terbaru Anda untuk melihat bagaimana bug itu diperkenalkan. Tetapi jika saya tidak tahu bahwa sistem itu berfungsi sebelum Anda membuat perubahan terbaru Anda (karena sistem tidak diuji dengan benar sebelum perubahan terbaru Anda), maka bug bisa ada di mana saja.

Hal di atas berlaku terutama untuk kode yang dalam, dan lebih sedikit untuk kode yang dangkal misalnya menambahkan halaman web baru di mana halaman baru tidak akan mempengaruhi halaman yang ada.

Akibatnya, sejumlah besar bug lolos ke produksi, yang harus saya perbaiki dan pada gilirannya mengembalikan proyek saya yang lain.

Menurut pengalaman saya, itu tidak bisa diterima, jadi Anda mengajukan pertanyaan yang salah. Daripada bertanya apakah tes akan membuat pengembangan lebih cepat, Anda harus bertanya apa yang membuat pengembangan lebih bebas bug.

Pertanyaan yang lebih baik mungkin:

  • Apakah unit-testing adalah jenis pengujian yang tepat, yang perlu Anda hindari "sejumlah besar bug" yang telah Anda hasilkan?
  • Apakah ada mekanisme kontrol / peningkatan kualitas lain (selain dari unit-testing) untuk direkomendasikan juga atau sebagai gantinya?

Belajar adalah proses dua tahap: belajar melakukannya dengan cukup baik, kemudian belajar melakukannya dengan lebih cepat.

ChrisW
sumber
3

Beberapa aspek untuk dipertimbangkan, tidak disebutkan dalam jawaban lainnya.

  • Manfaat Tambahan / Biaya Tambahan tergantung pada pengalaman dengan menulis unittests
    • dengan proyek unit-test pertama saya, biaya tambahan tiga kali lipat karena saya harus belajar banyak dan saya membuat banyak kesalahan.
    • setelah 10 tahun pengalaman dengan tdd saya perlu waktu coding 25% lebih banyak untuk menulis tes di muka.
  • dengan lebih banyak tdd-modul masih diperlukan uji manual-gui dan pengujian integrasi
  • tdd hanya berfungsi ketika dilakukan dari awal.
    • menerapkan tdd ke proyek yang sudah ada dan dikembangkan adalah mahal / sulit. Tetapi Anda dapat menerapkan tes regresi sebagai gantinya.
  • tes otomatis (yang belum dikirim dan jenis tes lainnya) memerlukan pemeliharaan konstanta agar tetap berfungsi.
    • setelah membuat tes melalui copy & paste dapat membuat testcode-maintanace menjadi mahal.
    • dengan pengalaman yang berkembang, testcode menjadi lebih modular dan lebih mudah dirawat.
  • dengan pengalaman yang berkembang, Anda akan mendapatkan perasaan ketika layak untuk membuat tes otomatis dan ketika tidak.
    • contohnya tidak ada manfaat besar untuk pengambil / setter / pembungkus sederhana unittest
    • saya tidak menulis tes otomatis melalui gui
    • Saya berhati-hati agar pelaku bisnis dapat diuji

Ringkasan

Ketika memulai dengan tdd sulit untuk mencapai keadaan "lebih banyak manfaat daripada biaya" selama Anda berada di bawah "lingkungan kerja terbatas waktu" terutama jika ada "manajer pintar" yang memberi tahu Anda untuk "menyingkirkan yang mahal, tidak berguna menguji barang "

Catatan: dengan "unit testing" maksud saya "menguji modul dalam isolasi".

Catatan: dengan "pengujian regresi" yang saya maksud

  • tulis beberapa kode yang menghasilkan beberapa teks keluaran.
  • tulis beberapa kode "pengujian regresi" yang memverifikasi bahwa hasil generasi masih sama.
  • tes regresi memberi tahu Anda setiap kali hasilnya berubah (yang mungkin ok atau indikator untuk bug baru)
  • gagasan "pengujian regresi" mirip dengan uji persetujuan
    • ... mengambil snapshot dari hasilnya, dan mengkonfirmasikan bahwa hasilnya belum berubah.
k3b
sumber
Perlu proofreading (pengujian
literatur yang setara
3

Programmer, seperti orang yang menangani sebagian besar tugas, meremehkan berapa lama sebenarnya untuk menyelesaikannya. Dengan mengingat hal itu, menghabiskan 10 menit untuk menulis tes dapat dilihat sebagai waktu seseorang dapat menghabiskan menulis banyak kode ketika pada kenyataannya, Anda akan menghabiskan waktu itu datang dengan nama fungsi dan parameter yang sama yang Anda lakukan selama tes . Ini adalah skenario TDD.

Tidak menulis tes, sangat mirip memiliki kartu kredit; kita cenderung menghabiskan lebih banyak atau menulis lebih banyak kode. Lebih banyak kode memiliki lebih banyak bug.

Alih-alih memutuskan untuk memiliki cakupan kode total atau tidak sama sekali, saya sarankan berfokus pada bagian kritis dan rumit aplikasi Anda dan melakukan tes di sana. Dalam aplikasi perbankan, itu mungkin perhitungan bunga. Alat diagnostik mesin mungkin memiliki protokol kalibrasi yang kompleks. Jika Anda telah mengerjakan suatu proyek, Anda mungkin tahu apa itu dan di mana bug itu berada.

Mulai dengan lambat. Bangun kelancaran sebelum Anda menilai. Kamu selalu bisa berhenti.

JeffO
sumber
3

Ada sejarah panjang dewan Programmer yang mempromosikan TDD dan metodologi pengujian lainnya, saya tidak akan mengingat argumen mereka dan setuju dengan mereka, tetapi di sini ada beberapa hal tambahan yang perlu dipertimbangkan yang seharusnya sedikit bernuansa:

  • Pengujian tidak sama nyaman dan efisien tergantung konteks. Saya mengembangkan perangkat lunak web, beri tahu saya jika Anda memiliki program untuk menguji seluruh UI ... saat ini saya sedang memprogram macro excel, haruskah saya benar-benar mengembangkan modul uji dalam VBA?
  • Menulis dan memelihara perangkat lunak uji adalah pekerjaan nyata yang diperhitungkan dalam jangka pendek (terbayar dalam jangka panjang). Menulis tes yang relevan juga merupakan keahlian untuk didapatkan
  • Bekerja sebagai tim dan bekerja sendiri, belum memiliki persyaratan tes yang sama karena dalam tim Anda perlu memvalidasi, memahami dan mengkomunikasikan kode yang tidak Anda tulis.

Saya akan mengatakan pengujian itu baik, tetapi pastikan Anda menguji lebih awal dan menguji di mana keuntungannya.

Arthur Havlicek
sumber
1
"Haruskah aku benar-benar mengembangkan modul tes untuk VBA?" Sialan kamu harus. rubberduckvba.com/Features#unitTesting
RubberDuck
Ada beberapa alasan saya tidak akan menggunakan ini karena tidak sesuai dengan kebutuhan saya (saya paling tidak pada beberapa hari tugas, lingkungan terkunci, penerus tidak akan mengganggu pihak ke-3). Komentar yang bagus, bahasa bukan alasan sendiri :)
Arthur Havlicek
Semua poin adil @ArthurHavlicek.
RubberDuck
2
Tes menulis masih sepele di VBA. Memiliki semua fitur mewah yang dimiliki oleh beberapa kerangka kerja yang paling tidak kompatibel? Itu lebih sulit, tetapi menjalankan program mainTest()yang memanggil semua modul pengujian Anda tidak terlalu sulit.
enderland
1

Manfaat TDD yang sering diabaikan adalah bahwa tes bertindak sebagai perlindungan untuk memastikan Anda tidak memperkenalkan bug baru ketika Anda membuat perubahan.

Pendekatan TDD tidak diragukan lagi lebih banyak memakan waktu pada awalnya tetapi titik takeaway adalah Anda akan menulis lebih sedikit kode yang berarti lebih sedikit hal yang salah. Semua lonceng dan peluit yang sering Anda sertakan tidak akan berhasil masuk ke basis kode.

Ada adegan di film Swordfish di mana jika ingatanku, seorang hacker harus bekerja dengan pistol di kepalanya dan menjadi erm ... jika tidak terganggu. Intinya adalah itu jauh lebih mudah untuk bekerja ketika headspace Anda ada dalam kode dan Anda punya waktu di sisi Anda daripada berbulan-bulan dengan pelanggan berteriak pada Anda dan prioritas lainnya diperas.

Pengembang memahami bahwa memperbaiki bug nanti lebih mahal, tetapi balikkan saja. Jika Anda dapat dibayar $ 500 sehari untuk kode cara Anda kode sekarang atau $ 1000 jika Anda menulis dengan cara TDD, Anda akan menggigit tangan orang yang membuat Anda tawaran ke-2. Semakin cepat Anda berhenti melihat pengujian sebagai tugas dan melihatnya sebagai penghemat uang, semakin baik Anda.

Robbie Dee
sumber
Hal itu dalam kalimat pertama Anda disebut pengujian Regresi
kucing
0

Saya dapat menghubungkannya dengan expierience Anda - basis kode kami hampir tidak memiliki tes dan sebagian besar tidak dapat diuji. Butuh waktu lama untuk mengembangkan sesuatu dan memperbaiki bug produksi butuh waktu berharga dari fitur baru.

Untuk penulisan ulang parsial, saya berjanji untuk menulis tes untuk semua fungsionalitas inti. Pada awalnya, butuh waktu lebih lama dan produktivitas saya sangat terasa, tetapi setelah itu produktivitas saya lebih baik daripada sebelumnya.

Bagian dari peningkatan itu adalah saya memiliki lebih sedikit bug produksi yang pada gilirannya menyebabkan lebih sedikit gangguan -> Saya memiliki fokus yang lebih baik pada waktu tertentu.

Selain itu, kemampuan untuk menguji dan men-debug kode dalam isolasi benar-benar terbayar - serangkaian tes jauh lebih unggul daripada sistem yang tidak dapat di-debug kecuali dengan pengaturan manual, misalnya meluncurkan aplikasi Anda dan menavigasi ke layar dan melakukan sesuatu ... mungkin beberapa lusin kali

Tetapi perhatikan bahwa ada penurunan produktivitas di awal, jadi mulailah mempelajari pengujian pada beberapa proyek di mana tekanan waktu belum gila. Selain itu, cobalah untuk memulainya pada proyek greenfield, unit menguji kode lama sangat sulit, dan ini membantu ketika Anda tahu bagaimana bentuk suite pengujian yang baik.

Sauer Kristen
sumber
0

Sekadar melengkapi jawaban sebelumnya: ingatlah bahwa pengujian bukanlah tujuan itu sendiri. Tujuan membuat tes adalah agar aplikasi Anda berperilaku seperti yang diharapkan melalui evolusi, dalam konteks yang tidak terduga, dll.

Oleh karena itu, tes menulis tidak berarti membuktikan semua perilaku dari semua titik akhir suatu entitas. Ini adalah kesalahan umum. Banyak pengembang berpikir mereka perlu menguji semua fungsi / objek / metode / properti / dll. Ini mengarah pada beban kerja yang tinggi dan banyak kode serta tes yang tidak relevan. Pendekatan ini umum dalam proyek-proyek besar, di mana sebagian besar pengembang tidak menyadari perilaku holistik, tetapi hanya dapat melihat domain interaksi mereka.

Pendekatan yang tepat ketika berhadapan dengan sumber daya yang jarang dan pengujian cukup jelas dan masuk akal, tetapi tidak umum diformalkan: investasi pengujian sumber daya pengembangan pertama pada fungsi tingkat tinggi, dan secara bertahap turun ke kekhususan . Ini berarti bahwa pada titik tertentu, sebagai pengembang yang kesepian, Anda tidak hanya akan fokus pada pengujian unit, tetapi pada fungsional / integrasi / dll. menguji dan tergantung pada sumber daya waktu Anda, secara bertahap ke dalam fungsi kesatuan utama, seperti yang Anda rencanakan dan pertimbangkan. Pengujian tingkat tinggi akan memberikan informasi yang diperlukan untuk mengatasi pengujian tingkat rendah / kesatuan dan untuk merencanakan strategi pengembangan pengujian Anda sesuai dengan sumber daya yang Anda miliki.

Misalnya, Anda ingin menguji rantai pemrosesan terlebih dahulu sebagai kotak hitam. Jika Anda menemukan bahwa beberapa anggota rantai gagal karena perilaku tidak dianggap sebagai kondisi ekstrem, Anda menulis tes yang menjamin fungsionalitas tidak hanya pada anggota ini tetapi juga pada yang lain. Lalu Anda memberikan. Untuk siklus berikutnya, Anda mendeteksi bahwa terkadang jaringan gagal. Jadi, Anda menulis tes yang membahas masalah seperti itu pada modul yang mungkin rentan. Dan seterusnya.

RodolfoAP
sumber