Ada sejumlah pertanyaan di situs ini yang memberikan banyak informasi tentang manfaat yang dapat diperoleh dari pengujian otomatis. Tetapi saya tidak melihat apa pun yang mewakili sisi lain dari koin: apa kerugiannya? Segala sesuatu dalam hidup adalah pengorbanan dan tidak ada peluru perak, jadi pasti harus ada beberapa alasan yang sah untuk tidak melakukan pengujian otomatis. Apakah mereka?
Inilah beberapa yang saya buat:
- Membutuhkan lebih banyak waktu pengembang awal untuk fitur yang diberikan
- Membutuhkan tingkat keterampilan yang lebih tinggi dari anggota tim
- Tingkatkan kebutuhan alat (uji pelari, kerangka kerja, dll.)
- Analisis kompleks diperlukan ketika tes gagal ditemukan - apakah tes ini usang karena perubahan saya atau apakah itu memberitahu saya bahwa saya membuat kesalahan?
Sunting
Saya harus mengatakan bahwa saya adalah pendukung besar pengujian otomatis, dan saya tidak ingin diyakinkan untuk melakukannya. Saya mencari untuk memahami apa kerugiannya sehingga ketika saya pergi ke perusahaan saya untuk membuat kasus untuk itu saya tidak terlihat seperti sedang melempar peluru perak imajiner berikutnya.
Juga, saya jelas tidak mencari seseorang untuk membantah contoh saya di atas. Saya menganggap benar bahwa pasti ada beberapa kerugian (semuanya memiliki trade-off) dan saya ingin memahami apa itu.
sumber
Jawaban:
Anda cukup banyak memaku yang paling penting. Saya memiliki beberapa tambahan kecil, ditambah kelemahan dari tes yang sebenarnya berhasil - ketika Anda tidak benar-benar menginginkannya (lihat di bawah).
Waktu pengembangan: Dengan pengembangan yang digerakkan oleh tes, ini sudah diperhitungkan untuk pengujian unit, tetapi Anda masih memerlukan pengujian integrasi dan sistem, yang mungkin memerlukan kode otomatisasi juga. Kode yang ditulis satu kali biasanya diuji pada beberapa tahap selanjutnya.
Level keterampilan: tentu saja, alat harus didukung. Tapi itu bukan hanya tim Anda sendiri. Dalam proyek yang lebih besar, Anda mungkin memiliki tim pengujian terpisah yang menulis tes untuk memeriksa antarmuka antara produk tim Anda dan yang lain. Begitu banyak orang harus memiliki lebih banyak pengetahuan.
Kebutuhan alat: Anda tepat di sana. Tidak banyak yang ditambahkan ke ini.
Tes gagal: Ini adalah bugger nyata (bagi saya bagaimanapun). Ada banyak alasan berbeda, masing-masing dapat dianggap sebagai kerugian. Dan kerugian terbesarnya adalah waktu yang diperlukan untuk memutuskan mana dari alasan-alasan ini yang benar-benar berlaku untuk tes gagal Anda.
Tes yang tidak gagal: Ini juga merupakan kerugian dan bisa sangat buruk. Itu kebanyakan terjadi, ketika Anda mengubah banyak hal dan mendekati apa yang dijawab Adam. Jika Anda mengubah sesuatu dalam kode produk Anda, tetapi tes tidak menjelaskannya sama sekali, maka itu memberi Anda "rasa aman yang salah".
Aspek penting dari tes yang tidak gagal adalah bahwa perubahan persyaratan dapat menyebabkan perilaku sebelumnya menjadi tidak valid. Jika Anda memiliki keterlacakan yang layak, perubahan persyaratan harus dapat dicocokkan dengan kode pengujian Anda dan Anda tahu Anda tidak lagi bisa mempercayai pengujian itu. Tentu saja, mempertahankan keterlacakan ini adalah satu lagi kelemahan. Dan jika tidak, Anda berakhir dengan tes yang tidak gagal, tetapi sebenarnya memverifikasi bahwa produk Anda berfungsi dengan salah . Di suatu tempat di jalan ini akan memukul Anda .. biasanya kapan / di mana Anda tidak mengharapkannya.
Biaya penempatan tambahan: Anda tidak hanya menjalankan tes unit sebagai pengembang di komputer Anda sendiri. Dengan tes otomatis, Anda ingin menjalankannya berdasarkan komit dari orang lain di suatu tempat pusat untuk mencari tahu ketika seseorang merusak pekerjaan Anda. Ini bagus, tetapi juga perlu diatur dan dipelihara.
sumber
Baru saja mulai mencoba tes otomatis di tim kami, kerugian terbesar yang saya lihat adalah sangat sulit untuk menerapkan kode legacy yang tidak dirancang dengan pengujian otomatis. Tidak diragukan lagi akan meningkatkan kode kita dalam jangka panjang, tetapi tingkat refactoring yang diperlukan untuk pengujian otomatis sambil mempertahankan kewarasan kita adalah penghalang yang sangat tinggi untuk masuk dalam jangka pendek, artinya kita harus sangat selektif dalam memperkenalkan otomatis unit testing untuk memenuhi komitmen jangka pendek kami. Dengan kata lain, jauh lebih sulit untuk melunasi kartu kredit ketika Anda sudah tenggelam dalam utang teknis.
sumber
Mungkin kelemahan paling penting adalah ... tes adalah kode produksi . Setiap tes yang Anda tulis menambahkan kode ke basis kode Anda yang perlu dipertahankan dan didukung. Gagal melakukannya menyebabkan Anda tidak percaya akan hasil tes, jadi Anda tidak punya pilihan lain. Jangan salah paham - Saya pendukung besar pengujian otomatis. Tapi semuanya memiliki biaya, dan ini yang besar.
sumber
Saya tidak akan mengatakan ini sepenuhnya kerugian yang berlaku, tetapi beberapa yang paling saya hit adalah:
Cakupan uji yang tidak merata dapat menyebabkan rasa aman yang salah. Jika Anda melakukan refactor dan menggunakan tes untuk membuktikan validitasnya, apa yang telah membuktikan tes Anda dapat membuktikan ini?
Waktu yang diperlukan untuk membuat tes terkadang menjadi masalah bagi kami. Pengujian otomatis kami tidak hanya mencakup uji unit, tetapi juga menggunakan uji kasus. Ini cenderung lebih luas dan membutuhkan konteks.
Tentu saja, perspektif saya berasal dari aplikasi yang lebih tua dari tes unitnya.
sumber
Saya akan mengatakan masalah utama dengan mereka adalah mereka dapat memberikan rasa aman yang salah . Hanya karena Anda memiliki unit test, itu tidak berarti mereka benar-benar melakukan sesuatu dan itu termasuk menguji persyaratan dengan benar.
Selain itu tes otomatis juga dapat mencakup bug sendiri , sehingga menimbulkan pertanyaan apakah unit test perlu menguji diri mereka sendiri sehingga tidak perlu mencapai apa pun.
sumber
Meskipun pengujian otomatisasi memiliki banyak keuntungan, ia memiliki kelemahannya sendiri juga. Beberapa kelemahannya adalah:
Beberapa kelemahan di atas sering mengurangi manfaat yang diperoleh dari skrip otomatis. Meskipun pengujian otomatisasi memiliki kelebihan dan kekurangan, pengujian ini diadaptasi secara luas di seluruh dunia.
sumber
Saya baru-baru ini mengajukan pertanyaan tentang tes dalam pengembangan game - ini BTW bagaimana saya tahu tentang ini. Jawaban di sana menunjukkan beberapa kelemahan spesifik yang aneh:
Poin ke-4 membuat saya ingat beberapa pengalaman saya. Saya bekerja pada perusahaan Scrum yang dikelola sangat ramping, berorientasi XP, di mana unit test sangat dianjurkan. Namun, dalam perjalanannya ke gaya yang lebih ramping, kurang birokratis, perusahaan hanya mengabaikan pembangunan tim QA - kami tidak memiliki penguji. Seringkali pelanggan menemukan bug sepele menggunakan beberapa sistem, bahkan dengan cakupan uji> 95%. Jadi saya akan menambahkan poin lain:
Juga, saya memikirkan hari-hari itu tentang dokumentasi dan merenungkan sebuah hipotesis yang mungkin valid (sampai batas yang lebih rendah) untuk menguji dua. Saya hanya merasa bahwa kode berkembang sangat cepat sehingga cukup sulit untuk membuat dokumentasi yang mengikuti kecepatan seperti itu, jadi lebih berharga menghabiskan waktu membuat kode dapat dibaca daripada menulis dokumentasi yang berat dan mudah usang. (Tentu saja, ini tidak berlaku untuk API, tetapi hanya untuk implementasi internal.) Tes menderita sedikit dari masalah yang sama: mungkin terlalu lambat untuk menulis bila dibandingkan dengan kode yang diuji. OTOH, ini adalah masalah yang lebih kecil karena tes memperingatkan mereka sudah usang, sementara dokumentasi Anda akan tetap diam selama Anda tidak membaca ulang dengan sangat, sangat hati-hati .
Akhirnya, kadang-kadang saya menemukan masalah: pengujian otomatis mungkin bergantung pada alat, dan alat itu mungkin ditulis dengan buruk. Saya memulai sebuah proyek menggunakan XUL beberapa waktu lalu dan, bung, ini menyakitkan untuk menulis unit test untuk platform semacam itu. Saya memulai aplikasi lain menggunakan Objective-C, Cocoa dan Xcode 3 dan model pengujian pada dasarnya adalah sekelompok solusi.
Saya memiliki pengalaman lain tentang kelemahan pengujian otomatis, tetapi kebanyakan dari mereka terdaftar dalam jawaban lain. Meskipun demikian, saya seorang pendukung keras pengujian otomatis. Ini menghemat banyak pekerjaan dan sakit kepala dan saya selalu merekomendasikannya secara default. Saya menilai kerugian tersebut hanyalah detail belaka jika dibandingkan dengan manfaat pengujian otomatis. (Adalah penting untuk selalu menyatakan iman Anda setelah Anda mengomentari ajaran sesat untuk menghindari auto da fé.)
sumber
Dua yang tidak disebutkan adalah:
Saya telah menjadi bagian dari upaya QA otomatis di mana butuh setengah hari untuk menjalankan tes, karena tes lambat. Jika Anda tidak berhati-hati dalam menulis tes, rangkaian tes Anda bisa berubah juga. Ini tidak terdengar seperti masalah besar sampai Anda sekarang mengelola waktu itu, "Oh, saya baru saja melakukan perbaikan, tetapi akan memakan waktu 4 jam untuk membuktikan kebenarannya".
Beberapa metode pengujian (seperti mengotomatiskan UI) tampaknya rusak setiap kali Anda berbalik. Terutama menyakitkan jika skrip Anda, katakanlah, menunda proses pengujian karena menunggu tombol muncul - tetapi tombol telah diganti namanya.
Ini adalah kedua hal yang dapat Anda selesaikan, dengan praktik pengujian yang baik: temukan cara untuk menjaga suite pengujian Anda tetap cepat (bahkan jika Anda harus melakukan trik seperti mendistribusikan pengujian di mesin / CPU). Demikian juga, beberapa kehati-hatian dapat diambil untuk menghindari metode ujian menulis yang lemah.
sumber
Saya ingin menambahkan satu lagi, rasa aman palsu.
Di luar set masalah yang didefinisikan dengan sangat kecil, tidak mungkin membuat tes komprehensif. Mungkin ada dan seringkali masih ada bug dalam perangkat lunak kami yang tidak diuji secara otomatis oleh pengujian otomatis. Ketika tes otomatis lulus, kita terlalu sering menganggap tidak ada bug dalam kode.
sumber
Sulit untuk meyakinkan manajemen / kapitalis ventura
lihat Pengujian Unit Berbasis Pasar untuk detailnya.
sumber
Salah satu kelemahan utama dapat diatasi dengan menggunakan tes belajar mandiri. Dalam situasi ini, hasil yang diharapkan semua disimpan sebagai data dan dapat diperbarui dengan ulasan minimal oleh pengguna test suite dalam mode belajar mandiri (tunjukkan perbedaan antara hasil yang diharapkan lama dan hasil aktual yang baru - pembaruan diharapkan jika tekan y). Mode pembelajaran testuite ini perlu digunakan dengan hati-hati sehingga perilaku buggy tidak dipelajari sebagai hal yang dapat diterima.
sumber