Jika pengujian unit sangat bagus, mengapa tidak lebih banyak perusahaan yang melakukannya? [Tutup]


103

Perusahaan perangkat lunak nyata pertama tempat saya bekerja adalah tentang pengujian unit (NUnit). Saya tidak tahu bahwa kami benar-benar kaku untuk itu - Saya tidak tahu seperti apa cakupan kode kami dan saya menulis sebagian besar tes unit. Sejak itu saya telah bertemu dengan beberapa perusahaan yang melakukan banyak pengujian, tetapi ini adalah pengujian kursi: bergantung pada seseorang yang ada di sana, memiliki repeatibilitas yang rendah, dan kemungkinan rendah untuk menangkap bug. Sikap lainnya adalah: itu adalah sesuatu yang mereka ingin lakukan "di masa depan"; pada dasarnya ketika uang jatuh dari langit.

Saya rindu pengujian unit - itu hanya membuat hidup lebih mudah. Tapi saya menemukan bahwa ketika saya mencari pekerjaan baru, pengujian unit adalah sesuatu yang perusahaan ingin "lakukan" di masa depan atau sesuatu yang tidak mereka lakukan sama sekali (uhh, sudah ada untuk sementara waktu sekarang!). Saya akan mengatakan bahwa 60-75% dari persyaratan pekerjaan yang saya lihat selama 2 tahun terakhir belum mencantumkan pengujian unit sama sekali. Saya hanya dapat memikirkan satu atau dua yang memiliki pengalaman pengujian unit sebagai persyaratan (untuk posisi pengembang tingkat menengah).

Jadi pertanyaannya adalah, apa yang kurang ? Saya pikir itu membuat orang lebih produktif, tetapi itu hanya setelah menghabiskan banyak waktu untuk benar-benar melakukannya. Apakah tidak ada studi yang bagus tentang penghematan biaya pengujian unit? Apakah ini jenis perusahaan yang saya lihat?

Sunting: meskipun judulnya agak pendukung setan, saya menganggap diri saya pendukung pengujian unit.


Anda bekerja di domain seperti apa? Saya selalu menjumpai pengujian unit, dengan berbagai kelengkapan, di mana pun saya bekerja. Tapi pengalaman saya terletak pada pencitraan medis dan industri, jadi mungkin itulah sebabnya ...
Kena

11
Pengujian kursi: orang duduk di kursi, menjalankan aplikasi, melaporkan bug.
jcollum

3
@Darknight harus mendapat 50rb suara positif untuk kejujurannya. Ayo kepala tua, rasakan waktu hari ini. Simpan omong kosong pengujian unit itu kembali di tahun 90-an di tempatnya. Pemborosan waktu terbesar. Itu hanya sesuatu yang harus diangkat agar Anda dapat terlihat penting, tetapi sama sekali tidak melakukan apa-apa dalam banyak kasus. Kami memiliki sesuatu yang disebut IDE hari ini, kami tidak lagi memprogram dengan konsol atau di notepad. Kami tahu kode kami benar karena kami dapat mengarahkan kursor ke teks dan melihat nilainya. Simpan pengujian unit di masa lalu dengan semua timer lama lainnya.
portfoliobuilder

1
@portfoliobuilder Ya, mengarahkan kursor ke nilai dalam IDE Anda akan sangat membantu meningkatkan kualitas kode. Karena statusnya akan selalu sama, dan kodenya tidak akan pernah berubah. Benar! Dan semoga beruntung.
Franz D.

1
@portfoliobuilder - Anda lupa / s
ocodo

Jawaban:


112

Menurut pengalaman saya, ada beberapa faktor yang terlibat di dalamnya:

  1. Manajemen tidak benar-benar memahami apa sebenarnya pengujian unit itu, atau mengapa pengujian tersebut memiliki nilai intrinsik yang nyata bagi mereka.
  2. Manajemen cenderung lebih peduli dengan pengiriman produk yang cepat, dan (secara tidak benar) melihat pengujian unit sebagai kontraproduktif dengan tujuan tersebut.
  3. Ada kesalahpahaman bahwa pengujian hanya dimiliki oleh pervue dari QA. Pengembang adalah pembuat kode, dan tidak dapat menulis pengujian.
  4. Ada kesalahpahaman umum bahwa manajemen harus mengeluarkan uang untuk melakukan pengujian unit dengan benar, meskipun alat tersedia secara gratis. (Tentu saja, pengembang meningkatkan waktu untuk mempertimbangkan, tetapi itu tidak terlalu menghalangi.)
  5. Jawaban Will akan melengkapi jawaban ini: Sangat sulit untuk menentukan nilai kode tes (edit jcollum)

Secara alami, ada faktor-faktor lain, tetapi itu hanya yang saya hadapi sejauh ini.


Ya, cukup banyak menggambarkan manajemen saya dan kami tidak memiliki pengujian.
Ty.

Dan dukungan untuk itu di beberapa bahasa populer (C / C ++) buruk.
Martin Beckett

@mgb - CxxUit bekerja cukup baik untuk saya ...
Dominic Rodger

2
CxxTest juga sangat bagus. Karena mekanisme refleksi yang buruk dalam C ++, tampaknya ada lebih banyak variasi "solusi" yang disajikan; CxxTest membutuhkan langkah praproses dalam sistem build, sedangkan alat seperti TUT sepenuhnya waktu kompilasi dan didukung bahasa, tetapi sulit digunakan.
Tom

2
Saya telah menemukan bahwa pengguna di stackoverflow.com cenderung menyalahkan manajemen untuk banyak masalah mereka seperti ini. Ketika saya bertanya kepada teman-teman saya di kehidupan nyata tentang 'masalah manajemen' mereka yang muncul, biasanya saya menemukan bahwa mereka bahkan tidak pernah menyuarakan keprihatinan mereka kepada manajemen, harus kurang memulai kampanye untuk mengubah sudut pandang orang. Alih-alih mengatakan 'manajemen tidak ...' Saya mencoba dan memikirkan cara-cara untuk membantu manajemen melihat sudut pandang saya, dan meyakinkan mereka bahwa posisi saya benar. Saya rasa ini menjadi masalah karena developer tidak pandai menjual unit test.
Brian Stinar

87

1) Sulit
2) Butuh waktu
3) Sangat sulit untuk menentukan nilai kode uji

Poin 3 adalah yang lengket. Tes unit yang baik mengurangi bug. Tetapi begitu juga kode produksi yang baik. Bagaimana Anda menentukan berapa banyak bug yang tidak ada karena pengujian unit Anda? Anda tidak dapat mengukur apa yang tidak ada. Anda dapat menunjuk ke studi, tetapi tidak cocok dengan spreadsheet manajer bisnis Anda.


11
"Pengujian unit yang baik mengurangi bug. Tapi begitu juga kode produksi yang baik." - Tes unit yang baik memungkinkan untuk meningkatkan kode produksi. Meskipun kodenya pada awalnya buruk, tetapi Anda memiliki cakupan pengujian yang baik, Anda dapat dengan percaya diri melakukan refaktorisasi sistem hingga kodenya bagus.
Esko Luontola

1
Esko, selain memiliki cakupan yang baik, Anda juga harus memiliki tes yang baik yang benar-benar menguji sesuatu. Anda dapat memiliki cakupan kode 100% dan sebenarnya hanya menguji sangat sedikit
Jacob Adams

Jawaban yang sangat bagus! Anda telah mengatakan hal yang sama dengan jawaban saya dengan kata-kata yang jauh lebih sedikit.
Wedge

2
Ya, tes unit membutuhkan waktu. Tapi begitu juga "perbaikan bug secara acak". Pengembangan yang didorong oleh pengujian yang tepat memiliki "semua" fitur yang "didokumentasikan" dalam pengujian. Jika pengujian berwarna hijau, produk berfungsi sebagaimana mestinya (kecuali untuk masalah kegunaan, dll.). Pengalaman saya adalah bahwa waktu pengembangan total hampir tidak terpengaruh sama sekali. Anda menghabiskan lebih banyak waktu untuk hal-hal, dan melakukannya dengan benar pada kali pertama daripada setelah waktu yang dihabiskan untuk perbaikan bug.
Arve Systad

1
Tidak. Untuk jumlah waktu yang sama, saya mendapatkan 3-4 kali lebih banyak kode produksi / fitur yang diselesaikan dengan jumlah bug yang sama per fitur. Ini bervariasi dari dev ke dev tetapi biasanya developer yang buruk juga menulis pengujian yang buruk dan masih membuat banyak kesalahan sehingga pengujian unit tidak meningkatkan kualitas kode mereka - hanya memperlambatnya. Pengujian tidak pernah membuktikan tidak adanya bug hanya keberadaan mereka yang terbaik.
KolA

71

Sangat mudah untuk menyalahkan "manajemen". Tetapi apakah manajemen benar - benar memberi tahu Anda untuk secara khusus tidak melakukan pengujian unit?

Manajemen secara umum tidak (dan mungkin seharusnya tidak) memberi tahu Anda cara melakukan pekerjaan Anda, apakah itu modularisasi, tipe data abstrak, pola desain, atau pengujian unit. Ini adalah alat perdagangan yang diterapkan oleh insinyur perangkat lunak yang berhasil dan kompeten, tetapi insinyur yang buruk tidak.

Saya pikir jawaban sebenarnya untuk pertanyaan Anda adalah: pengujian unit sangat sulit, dan siswa ilmu komputer tidak terlatih untuk itu.

Sangat mudah saat Anda menulis kelas string Anda sendiri. Saat Anda menguji produk kehidupan nyata, Anda mengalami tantangan yang tidak ada yang memberi tahu Anda tentang slide powerpoint:

  • Interaksi pengguna. Separuh dari aplikasi Anda adalah logika antarmuka pengguna. Bagaimana Anda mengujinya secara otomatis, yang tidak rusak jika Anda memindahkan tombol?
  • Interaksi dengan API dan kerangka kerja eksternal. Jika Anda menulis driver kernel Windows, bagaimana Anda mengujinya? Apakah Anda menulis rintisan untuk setiap IRP dan fungsi kernel yang Anda gunakan, secara efektif membuat simulasi kernel OS?
  • Komunikasi jaringan adalah hal di abad ke-21. Bagaimana Anda mengoordinasikan pengujian unit yang terdiri dari beberapa komponen terdistribusi?
  • Bagaimana Anda memilih kasus uji yang baik? Saya biasanya melihat orang mencoba pendekatan "lakukan hal-hal acak dalam satu putaran 1000 iterasi dan lihat apakah itu rusak". Ketika Anda melakukan ini, upaya lebih tinggi daripada hasil, bug penting terlewat, dan pengujian unit ditinggalkan.
  • Bagaimana Anda menguji apakah persyaratan kinerja terpenuhi?
  • Pengetahuan tentang pola dalam pengujian sangat langka: rintisan, tanggapan kalengan, pengujian regresi adalah konsep yang tidak diketahui kebanyakan orang. Berapa banyak orang di tempat kerja Anda yang benar-benar membaca buku tentang pengujian unit?

Satu hal yang dapat kita salahkan manajemen adalah bahwa spesifikasi persyaratan jarang memuat persyaratan apa pun tentang tingkat kualitas pengiriman.

Lain kali atasan Anda meminta Anda untuk melakukan perkiraan waktu, sertakan waktu untuk menulis tes unit dan lihat apa yang terjadi.


2
Ide bagus. Tapi jangan menyebutkan waktu untuk membuat pengujian unit sebagai waktu yang terpisah dari waktu untuk membuat kode "produk"!
Jeff Kotula

3
Membaca jawaban ini membuat saya menyadari bahwa, Meskipun saya terbiasa dengan konsep dan dasar-dasar pengujian unit, saya benar-benar tidak tahu bagaimana melakukannya secara efektif sama sekali. Bisakah Anda merekomendasikan buku yang bagus tentang subjek ini?
Breton

1
Pada satu driver kernel yang saya kerjakan, saya merefaktor ulang sekelompok kode menjadi perpustakaan yang saya tautkan ke harness uji mode pengguna. Kode khusus ini agnostik lingkungan, jadi cukup mudah. Saya belum mencobanya, tetapi IRP, seperti filesystem dan database, harus dapat diolok-olok.
George V. Reilly

1
Dengan Bochs atau QEMU, Anda dapat menulis simulasi perangkat Anda untuk digunakan oleh driver kernel Anda.
Zan Lynx

2
@ Floding, jawaban yang menarik. Saya pikir saya harus membaca buku tentang pengujian unit.
Dan Rosenstark

28

Kebanyakan tes tidak menguji apapun.
Anda menulis fungsi fileopen () dan unittest yang gagal jika file tidak ada dan berhasil jika file memang ada. Bagus! Sekarang apakah Anda memeriksa apakah itu berfungsi dengan nama file dalam bahasa Cina BIG5? pada saham NFS? di vista dengan file pada kunci USB dan UAC AKTIF?

Masalahnya adalah pengujian unit ditulis oleh programmer yang sama yang menulis fungsinya, dengan kumpulan asumsi yang sama dan dengan tingkat keahlian yang sama. Agar benar-benar berfungsi, pengujian harus ditulis oleh orang lain, hanya untuk spesifikasi yang dipublikasikan tanpa mereka melihat kodenya. - Di kebanyakan perusahaan, hanya mendapatkan spesifikasi tertulis akan menjadi terobosan!

Tes unit memeriksa kesalahan dalam kode fungsi individu. Mereka dapat bekerja untuk lapisan akses data, pustaka matematika, dll. Di mana input / output terkenal dan struktur internalnya kompleks tetapi untuk banyak kasus, mereka hanya membuang-buang waktu.
Mereka gagal ketika kesalahan terjadi karena interaksi antara bagian kode yang berbeda atau dengan OS dan pengguna. Masalah seperti pengaturan DPI tinggi / rendah yang mengacaukan kotak dialog atau pengaturan bahasa asing yang menukar '.' dan ',' biasanya tidak ditemukan.


15
Saya pikir jawaban ini sedikit meleset dari sasaran. Pengujian unit dan pengujian fungsional bukanlah, dan tidak boleh, merupakan hal yang sama.
Wedge

5
Sebuah elemen yang Anda lewatkan adalah bahwa pengujian unit bukan hanya satu hal yang harus diselesaikan. Jika saya mengetahui nanti bahwa saya perlu memperbaiki bug dengan fileopen () pada NFS share, maka saya dapat menambahkan tes ke rangkaian pengujian saya untuk ini. Kemudian, ketika saya melakukan lebih banyak pengembangan di masa mendatang, saya memiliki pengujian regresi.
Paul Osborne

2
Banyak kesalahan datang dari interaksi di luar kode yang tidak terpikirkan oleh pemrogram dan tidak dapat ditemukan hanya dengan memeriksa kode. Masalah umum yang umum terjadi adalah mesin dengan pengaturan DPI yang sangat tinggi / rendah - Anda dapat menguji fungsi dialog unit sesuka Anda tetapi tidak akan menemukannya.
Martin Beckett

5
itu bukan fungsi pengujian unit, dan interaksi antara bagian kode yang berbeda sangat dapat diuji unit dan memang, jika bagian tersebut ditulis oleh tim terpisah, pengujian unit kode Anda terhadap antarmuka bersama dan mengejek komponen tim lain adalah Latihan yang baik.
Steven Evers

1
TDD menangani masalah pengujian yang dicurangi "pemrogram yang menulis kode juga kemudian menulis pengujian" dengan meminta Anda menulis pengujian sebelum Anda menulis kode.
Ophidian


15

Saya telah menemukan banyak pengembang yang tidak tertarik dengan pengujian unit. Itu selalu tampak seperti banyak pekerjaan dengan sedikit hasil ketika Anda mulai. Tidak ada yang mau mendaftar untuk pekerjaan tambahan sehingga mereka menolak. Begitu orang mulai, mereka biasanya dengan antusias mematuhinya, tetapi memulainya bisa jadi sulit.


12

Selain masalah adopsi pengujian unit, pengujian unit tidak selalu bermanfaat, meskipun secara umum saya pikir begitu, jika diterapkan dengan benar. Tidak ada yang istimewa tentang pengujian unit yang menyelamatkan mereka dari kerentanan terhadap konstruksi yang buruk.

Pengujian unit memiliki biaya (pembuatan, pemeliharaan, dan pengoperasian) dan hanya bermanfaat jika memberikan manfaat yang lebih besar daripada biaya tersebut. Pembuatan tes adalah keterampilan seperti yang lain, ini membutuhkan pengalaman dan pengetahuan khusus untuk sukses. Tanpa pengalaman yang memadai, sangat mudah bahkan bagi pengembang berpengalaman untuk membuat pengujian unit berkualitas rendah, bernilai rendah, dan / atau berbiaya tinggi yang tidak berguna. Terutama mengingat betapa sulitnya menilai nilai tes unit.

Selain itu, pengujian unit hanyalah salah satu cara untuk meningkatkan kualitas kode, tetapi ini bukan satu-satunya cara. Dalam beberapa keadaan dan dengan beberapa tim, ini mungkin bukan cara yang paling efektif untuk meningkatkan kualitas perangkat lunak.

Perlu diingat bahwa melakukan banyak upaya dalam pengujian unit bukanlah jaminan perangkat lunak berkualitas. Dan, juga, dimungkinkan untuk menghasilkan perangkat lunak dengan kualitas tertinggi tanpa pengujian unit apa pun.


Apa yang Anda katakan benar dalam bahasa yang diketik secara statis. Dalam bahasa yang diketik secara dinamis, mereka sangat penting. Maksud saya, kode Anda hampir dijamin menjadi omong kosong tanpa tes. Saya menemukan ini menjadi bagian besar dari mengapa beberapa orang tampaknya sangat menghargai tes unit.
Bill K

11

Nah, perusahaan saya belum menggunakan TDD atau Unit Testing. Sejujurnya, kami tidak yakin bagaimana melakukannya. Kami jelas dapat melakukannya untuk fungsi bodoh seperti CapitalizeString (), dll, tetapi kami tidak tahu bagaimana melakukannya untuk sistem yang sangat kompleks dengan objek yang rumit. Selain itu, sebagian besar orang yang diwawancarai tidak memiliki pengalaman, atau pengalaman terbatas. Tampaknya Pengujian Unit besar dari kerumunan SO, tetapi tidak terlalu besar di ruang kerja yang tersedia.

TDD adalah topik terpisah. Kami secara moral menentang TDD. Kami bukan pembuat kode koboi, tetapi kami percaya bahwa hal itu menghambat kreativitas dan fleksibilitas dalam sebuah proyek. Selain itu, memiliki pembuat kode yang menulis fungsi pengujian unit tidak masuk akal. Ketika saya melakukan sesuatu, saya membuat kode ke semua kasus tepi yang dapat saya pikirkan. Yang saya butuhkan adalah otak lain untuk mencari hal-hal yang mungkin saya lewatkan. Kami tidak punya itu. Timnya kecil dan mandiri.

Singkatnya, kami tidak percaya pada TDD, tapi kami ingin Uji Unit. Kami hanya tidak memiliki pengalaman untuk melakukannya, dan kami tidak dapat menemukannya dengan mudah.


1
Dulu ketika tempat saya bekerja memiliki cukup pembuat kode untuk itu, kami melakukan pemrograman berpasangan. Saya merasa sangat efektif bagi seseorang untuk menulis tes seperti yang lainnya diberi kode. Ini juga menimbulkan pertanyaan yang sangat cerdas tentang kode tersebut.
Zan Lynx

4
Inti dari TDD, yang sepertinya Anda lewatkan, adalah Anda menulis semua kasus edge ke dalam pengujian unit Anda. Untuk setiap kasus, Anda menulis pernyataan dalam pengujian unit Anda. Kemudian, jika kode Anda yang sebenarnya gagal dalam sebuah pernyataan, Anda tahu bahwa kode Anda memiliki bug di dalamnya, dan Anda telah mengimplementasikan logika Anda dengan tidak benar. Karena unit kecil, dan pernyataan Anda menguji kode tertentu dalam unit, seharusnya mudah untuk menentukan di mana kesalahan logika Anda. Hal yang penting adalah Anda menulis pernyataan Anda terlebih dahulu. Kemudian buat kode Anda lulus. Dapatkah Anda menunjukkan di mana proses ini menghambat apa pun kecuali pertumbuhan bug?
Christopher Parker

3
Untuk mencoba dan menguji unit tanpa menulis tes terlebih dahulu akan sangat sulit. Ini karena kode Anda akan sulit untuk masuk ke dalam test harness secara retrospektif. Inilah salah satu manfaat utama pengujian pertama: desain dapat diuji sejak awal karena pengujian mendorong desain.
Alan Christensen

3
Bagaimana mungkin Anda "tidak yakin bagaimana" melakukan uji unit tetapi percaya bahwa TDD menghambat kreativitas dan fleksibilitas?
jcorcoran

1
@Steve 6 tahun kemudian, alangkah baiknya mengetahui apakah Anda pernah memperkenalkan pengujian unit (atau bahkan TDD) dan apakah Anda terus menggunakannya.
Luke Puplett

11

Ada banyak perusahaan di luar sana yang benar-benar tidak melakukan apa pun sesuai dengan praktik terbaik. Tidak ada ulasan kode, tidak ada pengujian unit, tidak ada rencana pengujian, tidak ada apa-apa, hanya dengan tempat duduk celana mereka.

Ambil ini sebagai kesempatan untuk membuat mereka menggunakan platform Integrasi Berkelanjutan dan mengembangkan pengujian unit! Cara mudah untuk mengesankan kekuatan yang ada dan meningkatkan kualitas dan stabilitas kode Anda pada saat yang bersamaan

Sunting: Untuk alasannya, saya pikir mereka sekadar tidak mengetahui alat saat ini di luar sana yang membuat pengujian CI dan unit luar biasa mudah.


Saya biasanya dalam posisi di mana saya tidak memiliki pengaruh apa pun atas keputusan kebijakan seperti ini; Saya senator junior yang dikalahkan oleh ketua komite.
jcollum

Perlu beberapa menit untuk memulai Hudson dan menulis tes unit. Jika unit test sudah ada di daftar "TODO" Anda, maka Anda hanya melakukan pekerjaan Anda. Komite sering kali terkesan dengan bagan dan gambar yang mewah, jadi tunjukkan kepada mereka beberapa grafik tren cantik dari Hudson;)
Allen Rice

Ya! Mari kita dengarkan kebenarannya. Terlepas dari semua waktu yang kami habiskan para pengembang untuk membahas tentang praktik terbaik, praktik terbaik tidak selalu digunakan di dunia nyata. Sungguh sayang.
NeedHack

Dokter tidak bertanya apakah mereka harus mencuci tangan, bukan?
ocodo

6

Dari apa yang saya lihat, banyak perusahaan memiliki basis kode yang sangat besar dan sangat digabungkan yang secara praktis tidak dapat diuji unit. Mereka juga tidak memiliki persyaratan pengujian yang layak, jadi pengujian unit akan menguji persyaratan de facto "as built".


Ini membutuhkan lebih banyak suara positif. Kode yang dirancang dengan prinsip "apa desain" / "Lakukan saja !!" menghasilkan bola lumpur besar tidak akan memiliki pemisahan / modularitas (yaitu unit ) oleh karena itu tahan terhadap pengujian unit . Salah satu keuntungan pengujian pertama adalah bahwa modularitas menjadi otomatis. Salah satu konsekuensi yang menghancurkan dari tidak adanya pengujian adalah kemungkinan besar pengujian kode tidak dapat dilakukan di masa mendatang.
ocodo

6

Saya tidak berpikir kemalasan adalah akar penyebab pengujian unit yang buruk. Untuk perusahaan saya, batasan waktu dan sikap "selesaikan saja" adalah penghalang terbesar untuk melakukan pengujian unit. Selain itu, tempat-tempat di mana sistem kami gagal cenderung lebih pada tingkat integrasi (layanan, akses database, kueri kompleks yang membutuhkan data khusus untuk pengujian), bukan "tingkat unit". Hal-hal ini hanya lebih sulit untuk diuji, dan jika Anda hampir tidak memiliki cukup waktu untuk menyelesaikan fitur tersebut, Anda mungkin tidak akan punya waktu untuk menyelesaikan tes yang berguna pada saat yang bersamaan.


Ini biasa. Saya pikir argumennya adalah jika Anda pikir Anda akan pernah mengubahnya di masa depan maka Anda harus memiliki tes yang memastikan itu berfungsi setelah berubah.
jcollum

6

Pengujian unit seharusnya menjadi bagian alami dari alur kerja pengembangan kode, seperti halnya compilernya.

Namun, hal ini memerlukan pendidikan manajemen tentang manfaat pengujian unit. Pengembang junior memiliki peluang yang relatif rendah untuk memiliki pengaruh seperti itu. Jadi, apakah perusahaan adalah pendukung pengujian unit tergantung pada apakah mereka memiliki pengembang senior atau arsitek yang mendukung pengujian unit.

Saya yakin ini adalah jawaban atas pertanyaan Anda "apa yang hilang dan mengapa tidak lebih banyak perusahaan yang melakukan pengujian unit" . :-)


1
1 untuk "harus menjadi bagian alami dari alur kerja pengembangan kode". Setiap pengembang profesional harus melakukan pengujian unit di sana sendiri terlepas dari proses resminya. Satu-satunya argumen yang sah tentang masalah ini adalah definisi unit .
Dunk

1
@Dunk Jika Anda tidak mendefinisikan "unit" maka Anda hanya mengatakan bahwa "pengembang profesional harus melakukan pengujian mereka sendiri".
ChrisW

1
@ChrisW - Ya, pengembang profesional harus melakukan pengujian mereka sendiri. Tidak ada alasan bagi pengembang untuk menyerahkan kode yang belum mereka uji cukup untuk merasa yakin bahwa kode itu berfungsi dengan benar. Sayangnya, ini tampaknya terlalu banyak untuk ditanyakan kepada banyak pengembang.
Dunk

1
Ketika saya mengatakan definisi unit adalah argumen yang sah, saya berbicara tentang perincian unit. Apakah ini kelas? Apakah ini kumpulan kelas? Apakah itu sebuah komponen? Saya pikir pengujian unit tingkat kelas (dengan beberapa pengecualian) harganya lebih mahal daripada manfaatnya dan mengarah ke banyak tes yang tidak berarti ...
Dunk

yang telah ditunjukkan orang lain di utas ini. Sedangkan, jika seseorang mendefinisikan kumpulan kelas yang bekerja bersama sebagai satu unit maka Anda masih dapat melakukan pengujian otomatis dan pengujian Anda umumnya lebih bermakna karena mereka dapat lebih fokus pada fungsionalitas yang dibutuhkan tingkat lebih tinggi.
Dunk

5

Ini mungkin kombinasi dari beberapa hal yang sudah Anda sebutkan. Sulit untuk mengukur penghematan biaya TDD. Jika Anda ingin melakukan outsourcing TI, Anda dapat menunjukkan berapa banyak yang Anda bayarkan per tahun untuk staf yang Anda miliki vs. biaya untuk mengontrakkannya; itu sangat konkret. Bagaimana Anda mengatakan, "Oh, pengujian ini menemukan bug yang membutuhkan waktu 4 jam untuk men-debug dan memperbaikinya ..."?


Bagaimana Anda bisa menebak berapa lama bug yang dibutuhkan untuk men-debug dan memperbaikinya. Umumnya debugging lebih acak daripada yang menurut pengalaman saya - saya kebetulan punya ide di mana masalahnya atau saya tidak.
Dominic Rodger

1
Ya, itulah mengapa saya mengatakan sangat sulit untuk mengukur manfaat pengujian.
Ovi Tisler

5

Alasan beberapa tempat tidak menggunakannya adalah karena dibutuhkan banyak pekerjaan untuk memulai dan melanjutkan. Fakta bahwa menulis unit test membutuhkan waktu sebanyak menulis fungsionalitas yang sebenarnya tampaknya bagi beberapa manajer seperti Anda memotong setengah produktivitas pengembang Anda.

Selain itu, Anda membangun tim (atau seseorang) perlu menempatkan infrastruktur dan memeliharanya.

Dan seperti yang dikatakan Alan , banyak tempat tidak menggunakan praktik terbaik - mereka hanya ingin melihat sesuatu yang nyata.


5

Saya pikir programmer harus mulai melakukannya. Beberapa pengujian sederhana untuk memulai mudah dibenarkan sebagai bagian dari pengembangan.

Sesuatu seperti pengujian unit hampir selalu diperlukan untuk mendapatkan proses debugging yang cepat. Cukup jelaskan seberapa cepat meluncurkan pengujian daripada mengatur input yang benar, menyetel breakpoint debugger, meluncurkan aplikasi, dll.

Dokumentasikan pengujian dalam kode Anda. Beri komentar yang menjelaskan di mana tes itu dan bagaimana menjalankannya. Pemrogram masa depan akan melihatnya dan mudah-mudahan pengujian akan menyebar!


4

Pengujian unit adalah salah satu istilah kotak hitam yang telah didengar kebanyakan orang, tetapi tidak tahu apa sebenarnya yang dimaksud dengan pengujian unit, di mana untuk memulai, bagaimana menulisnya, bagaimana cara menjalankan pengujian, apa sebenarnya yang harus mereka uji, dll. dll.

Dalam banyak kasus, lebih mudah bagi pengembang yang tidak yakin untuk mengabaikannya sebagai hal yang tidak perlu atau hanya diperlukan oleh "pengembang tingkat perusahaan".


4

Saya adalah penggemar berat pengujian unit dan saya juga merupakan mitra di sebuah perusahaan yang melakukan proyek pengembangan kontrak untuk berbagai jenis klien. Dalam sebulan kami akan menyentuh 3-4 proyek berbeda dengan ukuran berbeda.

Jika sebuah proyek tampaknya akan menjadi proyek yang gagal, saya tidak akan banyak berinvestasi dalam pengujian unit karena pengujian unit tersebut tidak membuahkan hasil untuk bisnis saya. Pada jenis proyek tersebut, saya akan menguji unit hal-hal yang saya tidak yakin / tidak terbiasa atau yang dapat sering berubah (seperti parser untuk sumber data yang tidak saya kendalikan.)

Sedangkan jika saya membangun sesuatu yang saya tahu akan berumur panjang, merupakan pekerjaan yang lebih besar, yang akan saya kerjakan melalui beberapa iterasi, atau akan berdampak besar pada klien saya jika terjadi kesalahan , Saya akan berinvestasi dalam lebih banyak pengujian unit. Sekali lagi, prioritas pengujian berkisar pada kode yang tidak pasti / asing / berubah.

Saya pikir pengujian unit harus berkisar pada kompleksitas tugas, serta apakah mereka akan membuahkan hasil. Tidak ada gunanya menulis kode tambahan yang tidak akan digunakan.


3

Menurut pengalaman saya, ini sangat tergantung pada perangkat lunak yang Anda tulis. Saya merasa sangat sulit untuk menulis pengujian unit untuk UI. Saya hanya menggunakan unit test untuk bagian-bagian dari sistem yang memiliki in / out tertentu.


Saya setuju. Jika Anda menggunakan model / view / controller, masuk akal untuk menguji unit model dan controller. UI hampir selalu paling baik diuji oleh manusia.
Zan Lynx

Pengujian komponen adalah UI yang setara dengan pengujian unit. Ada juga unit-test dari "logika bisnis" yang digunakan oleh UI. Logika bisnis dalam pengertian ini biasanya adalah logika presentasi. Di mana pengujian UI dan pengujian unit tidak kompatibel berada di area rendering dan menguji output yang dirender. misalnya bagaimana saya akan menguji unit generator kode QR ini atau diagram lingkaran ini? Jawabannya adalah, pasti, Anda tidak akan menguji itu. Pengujian snapshot dapat memberi Anda nilai pengujian regresi dalam kasus tersebut.
ocodo

3

Saya rindu pengujian unit - itu hanya membuat hidup lebih mudah.

Itu tidak alasan yang cukup bagi perusahaan untuk mengadopsi pengujian unit.

Alasan yang memadai mungkin "lebih murah" (dan / atau, "lebih baik"): yang tidak mudah dibuktikan tentang pengujian unit.

Satu-satunya alasan bagus mungkin "menulis unit test adalah penggunaan terbaik waktu pengembang", yang sangat sulit untuk membuktikan IMO: dan mungkin benar di beberapa tempat, untuk beberapa perangkat lunak, dengan beberapa pengembang, dan tidak benar di tempat lain.

Ada banyak pengembang yang tidak memikirkan dunia pengujian unit: termasuk beberapa yang berpikir bahwa bentuk pengujian lain (misalnya integrasi otomatis / pengujian fungsional) mungkin lebih murah dan lebih berharga, misalnya Apakah saya satu-satunya pengembang yang tidak? tidak suka tes unit?


3

Tentu saja, dalam dunia yang ideal, Anda tidak dapat membantah adanya unit test.

Namun, apakah Anda menulis pengujian unit bergantung pada beberapa hal:

  • Bagaimana perangkat lunak akan digunakan. Jika Anda menulis perangkat lunak hanya untuk diri Anda sendiri, apakah Anda akan menulis pengujian unit? Mungkin tidak. Jika Anda menulis perangkat lunak yang dikemas sebelumnya untuk dijual secara komersial, mungkin ya.

  • Berapa banyak orang yang memelihara kode .... jika itu hanya Anda, maka Anda mungkin mengetahuinya dengan cukup baik untuk cukup percaya diri setelah membuat perubahan bahwa menjalankan kode dengan cepat sudah cukup untuk memastikan tidak ada yang rusak. Jika orang lain yang awalnya tidak menulis kode sekarang harus memeliharanya, maka unit test akan membantu memberi mereka keyakinan bahwa ketika mereka memperbarui kode untuk memperbaiki yang besar (yang jelas tidak tertangkap dalam pengujian unit!) Mereka tidak merusak apa pun .

  • kompleksitas kode: hanya kode uji yang perlu diuji. Metode penetapan variabel satu baris tidak memerlukan pengujian. Sebuah metode 50 baris dengan beberapa jalur eksekusi mungkin bisa melakukannya.

  • Pertimbangan komersial komersial praktis: Faktanya adalah menulis tes unit membutuhkan waktu lebih lama daripada tidak melakukannya. Jika Anda menulis perangkat lunak prototipe, yang memiliki masa depan komersial yang tidak pasti, maka ada hasil yang harus diperoleh antara memiliki kode dengan cepat, sekarang, yang berfungsi cukup baik versus memiliki kode unit yang diuji dalam 2 minggu yang berfungsi lebih baik. Kadang-kadang membayar untuk mengetahui dengan cepat (selera konsumen) jika perangkat lunak akan memiliki rak pendek seperti dan pindah ke proyek berikutnya.

dan seperti yang ditunjukkan orang lain, ujian hanya akan sebaik orang yang menulisnya.


3

Alasan utamanya adalah banyak pengembang dan manajer pengembangan tidak memiliki petunjuk bahwa pengujian unit ada, atau bagaimana menggunakannya.

Alasan kedua adalah pengujian unit hanya dapat digunakan (dengan cara yang masuk akal) dengan kode yang telah memenuhi beberapa standar kualitas. Kemungkinannya, beberapa basis kode yang ada tidak termasuk dalam kategori itu.

Alasan ketiga adalah kemalasan dan / atau kemurahan hati.


3

Karena pengujian unit hanya berguna jika Anda menulis kode yang dapat diuji. Dan menulis kode yang dapat diuji itu sulit. Dan orang-orang malas dan / atau pelit.

EDIT: bernuansa "malas" sebagai "malas dan / atau murah"; Kadang-kadang, orang benar-benar memiliki keterampilan dan kapasitas dan kemauan untuk menulis tes, tetapi mereka memiliki hal lain untuk dilakukan yang secara lebih langsung memengaruhi hasil akhir.


Saya akan mendukung ini, kecuali saya tidak berpikir orang 'malas'. Pikirkan 'pemrograman', yaitu 'bahasa pemrograman populer Anda dan alat terkait, dokumen, pelatihan, alur kerja, hal-hal' tidak pernah dirancang sedemikian rupa sehingga memudahkan penulisan kode yang dapat diuji. Jadi untuk menulis kode yang dapat diuji, Anda selalu harus bekerja ekstra. Karena tidak ada imbalan 'karena sudah berfungsi' pada saat itu (sehingga menulis tes terlebih dahulu, kode nanti, TDD, praktis masuk akal). Pikirkan ini lebih merupakan bias kognitif yang menipu tidak hanya pemrogram saat ini, tetapi sudah menipu penulis alat 'pemrograman' yang sekarang dibangun oleh pembuat kode.
n611x007

1
Ya, tentu saja, terkadang orang-orang murahan / bangkrut / memiliki hal-hal yang lebih baik untuk dilakukan (atau seperti yang kami ucapkan dengan sopan "harus ada pengorbanan".) Diedit untuk mencerminkan hal itu. (Saya akan menambahkan dengan bercanda bahwa, selain itu, sebagian besar kode tidak berguna, jadi mengujinya juga tidak berguna; tapi itu hanya kurang tidur berbicara;))
phtrivier

2

Menurut saya, sebagian dari masalahnya adalah pengembang mengharapkan para pebisnis memiliki kumpulan nilai yang sama dan benar-benar peduli dengan jawaban "haruskah kita menguji unit atau tidak?". Kami tidak mendapatkan persetujuan sebelumnya dari bisnis untuk menggunakan bahasa tingkat tinggi daripada bahasa assembly - ini biasanya cara yang masuk akal untuk menyelesaikan pekerjaan.

Intinya adalah, kita adalah satu-satunya yang memenuhi syarat untuk melakukan panggilan (bukan berarti kita semua memiliki pengetahuan yang sama tentang topik tersebut). Lebih jauh lagi, bahkan jika tim Anda tidak, sebagai masalah kebijakan, melakukan pengujian unit (atau sebutkan-metode-Anda-of-the-day) umumnya tidak berarti Anda tidak dapat melakukannya.

Sebenarnya, kami tidak dapat benar-benar membuktikan ROI pada sebagian besar hal yang kami lakukan dengan perincian yang terlalu bagus. Mengapa pengujian unit diadakan untuk standar pembuktian yang tidak masuk akal / tidak khas ini di luar kemampuan saya ...


Namun, Anda memang membutuhkan manajemen yang terlibat, karena Anda harus melibatkan rekan pengembang Anda dan cara terbaik untuk mewujudkannya adalah menjadikannya persyaratan dari atas ke bawah.
Yohanes

2

Orang malas dan hanya mengadopsi perubahan ketika dipaksa.


2

2 sen saya:

  • Dibutuhkan pendidikan dan disiplin, tetapi lulusan baru sudah memiliki pengetahuan yang tepat.
  • Overhead tes dapat dikurangi dengan alat yang lebih baik dan ini juga terjadi (refactoring dll.)

Jadi, ini hanya soal waktu.

Ada debat Martin-Coplien di mana Bob Martin menegaskan bahwa:

"saat ini, tidak bertanggung jawab bagi pengembang untuk mengirimkan baris kode yang belum dieksekusi dalam pengujian unit."

[ http://www.infoq.com/interviews/coplien-martin-tdd]


2
Saya tidak percaya pada keberadaan sistem dunia nyata yang kompleks di mana setiap baris kode dicakup oleh pengujian unit.
quant_dev

2

Jika Anda ingin menjual semua orang dalam pengujian, lakukan hal berikut:

  1. Tulis banyak tes.
  2. Beri tahu pengembang lain yang mengubah kode dan gagal dalam ujian Anda.
  3. Mereka akan memperbaiki kode mereka.
  4. Sekarang Anda dapat merilis tanpa bug khusus tersebut.

Bahkan seorang manajer pun dapat memahami ini.


Pengujian unit tidak akan menyebabkan rilis Anda bebas bug. Ini dapat mengurangi jumlah bug, tetapi sangat sulit untuk mengukur jumlah bug yang / tidak / mencapai produksi karena pengujian.
Tom

Saya tidak tahu bahwa manajemen akan senang dengan seseorang yang menulis banyak tes ketika mereka dapat membuat kode fungsi baru. Jika mereka tidak setuju dengan TDD, Anda kemungkinan besar akan mendapat masalah karena menulis tes untuk menutupi kode yang tidak Anda tulis.
jcollum

@jcollum Seperti biasa, itu tergantung pada rasio biaya / keuntungan.
quant_dev

2

Perusahaan tidak melakukan pengujian unit, karena alasan yang sama bahwa banyak situs web ditulis dengan buruk - ketidaktahuan, dan orang-orang berpegang teguh pada kebiasaan lama. Di perusahaan saya, sejak kami memulai pengujian unit (dengan Nunit, dan Typemock ), kami mencapai cakupan kode yang lebih tinggi dan merilis perangkat lunak dalam waktu yang lebih singkat ke pasar.


2

Seperti kebanyakan ide bagus, adopsi lebih berkaitan dengan ketergantungan jalur organisasi daripada dengan kualitas ide.

Di sebagian besar perusahaan yang telah mengirimkan produk, divisi QA yang substansial telah dibuat dengan kepala QA tingkat senior. Pengujian adalah wilayah kekuasaan tim QA.

Tim QA tidak mungkin menulis kode pengujian unit karena perusahaan biasanya tidak mempekerjakan tim QA dengan pembuat kode tugas beratnya.

Tim pemrograman enggan untuk menulis kode pengujian karena dapat menimbulkan konflik dengan tim QA.

Saya telah melihat lebih banyak minat dan adopsi Pengujian Unit dalam kelompok di mana QA belum dipisahkan menjadi fungsi pekerjaan yang terpisah


1

Sederhana saja, memerlukan biaya untuk menulis dan memperbarui pengujian unit. Sebagian besar perusahaan perangkat lunak sebelumnya tidak memiliki pengujian unit dan membutuhkan biaya terlalu banyak untuk menulis. Jadi mereka tidak melakukannya dan itu menambah waktu untuk proses pengembangan sehingga mereka juga tidak menambahkannya ke fitur baru.


Anda harus membaca tautan tentang ROI.
jcollum

1

Kebanyakan perusahaan tidak berguna. Bukan salah satu tempat Anda (atau saya) bekerja, jelas.


Ini tidak memberikan jawaban atas pertanyaan tersebut. Untuk mengkritik atau meminta klarifikasi dari seorang penulis, tinggalkan komentar di bawah postingannya.
AlexVogel

T: "Mengapa tidak lebih banyak perusahaan yang melakukan [pengujian unit]?" J: "Karena kebanyakan perusahaan tidak berguna." Kedengarannya seperti jawaban bagi saya ...
Roger Lipscombe
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.