Tim saya di tempat kerja pindah ke Scrum dan tim lain mulai melakukan pengembangan berbasis tes menggunakan tes unit dan tes penerimaan pengguna. Saya suka UAT, tetapi saya tidak dijual pada unit testing untuk pengembangan yang digerakkan oleh tes atau pengembangan yang digerakkan oleh tes pada umumnya.
Sepertinya menulis tes adalah pekerjaan ekstra, memberi orang kruk ketika mereka menulis kode asli, dan mungkin tidak terlalu efektif.
Saya mengerti bagaimana tes unit bekerja dan bagaimana menulisnya, tetapi adakah yang bisa mengatakan bahwa itu adalah ide yang bagus dan sepadan dengan usaha dan waktu?
Juga, adakah yang membuat TDD sangat baik untuk Scrum?
unit-testing
scrum
tdd
Owen Johnson
sumber
sumber
Jawaban:
Jawaban Singkat: Benar-benar positif.
Jawaban Panjang: Tes unit adalah salah satu praktik paling penting yang saya coba dan pengaruhi di tempat kerja saya (bank besar, perdagangan fx). Ya mereka adalah pekerjaan ekstra, tetapi itu adalah pekerjaan yang membayar berulang kali. Tes unit otomatis tidak hanya membantu Anda benar-benar mengeksekusi kode yang Anda tulis dan tentu saja memverifikasi harapan Anda, tetapi mereka juga bertindak sebagai semacam anjing penjaga untuk perubahan di masa depan yang mungkin Anda atau orang lain lakukan. Kerusakan tes akan terjadi ketika seseorang mengubah kode dengan cara yang tidak diinginkan. Saya pikir nilai relatif dari unit test menurun berkorelasi dengan tingkat perubahan yang diharapkan dan pertumbuhan basis kode, tetapi verifikasi awal dari apa yang dilakukan kode membuatnya berharga bahkan ketika perubahan yang diharapkan rendah. Nilai tes unit juga tergantung pada biaya cacat. Jika biaya (di mana biaya kehilangan waktu / uang / reputasi / upaya di masa depan) dari cacat adalah nol, maka nilai relatif dari suatu tes juga nol; namun ini hampir tidak pernah terjadi di lingkungan komersial.
Kami umumnya tidak mempekerjakan orang lagi yang tidak secara rutin membuat unit test sebagai bagian dari pekerjaan mereka - itu hanya sesuatu yang kami harapkan, seperti muncul setiap hari. Saya belum melihat analisis manfaat biaya murni dari memiliki unit test (seseorang merasa bebas untuk menunjuk saya ke satu), namun saya dapat mengatakan dari pengalaman bahwa dalam lingkungan komersial, dapat membuktikan kode bekerja dalam sistem penting yang besar bermanfaat . Ini juga membuat saya tidur lebih nyenyak di malam hari karena mengetahui bahwa kode yang saya tulis terbukti bekerja (pada tingkat tertentu), dan jika itu berubah seseorang akan diberitahu tentang efek samping yang tidak terduga oleh bangunan yang rusak.
Pengembangan yang didorong oleh tes, dalam pikiran saya bukanlah pendekatan pengujian. Ini sebenarnya pendekatan desain / praktik dengan output menjadi sistem kerja dan serangkaian tes unit. Saya kurang religius tentang praktik ini karena ini adalah keterampilan yang cukup sulit untuk dikembangkan dan sempurna. Secara pribadi jika saya membangun sebuah sistem dan saya tidak memiliki ide yang jelas tentang cara kerjanya, saya akan menggunakan TDD untuk membantu saya menemukan jalan saya dalam kegelapan. Namun jika saya menerapkan pola / solusi yang ada, saya biasanya tidak mau.
Dengan tidak adanya bukti matematis kepada Anda bahwa masuk akal untuk menulis unit test, saya mendorong Anda untuk mencobanya dalam waktu yang lama dan mengalami sendiri manfaatnya.
sumber
Kesalahan yang ditemukan sebelumnya lebih murah untuk diperbaiki daripada kesalahan yang ditemukan kemudian. TDD membantu Anda memverifikasi kebenaran sistem Anda. Anda berinvestasi sedikit lebih awal, tetapi mendapatkannya kembali nanti. Grafiknya agak dilebih-lebihkan, tetapi menunjukkan ide dengan baik.
Sumber Gambar
sumber
Ya itu . Paman Bob (Robert C Martin) memberi tahu dalam sebuah presentasi;
Dan karena Anda tidak akan menghapus tes, selama tes lulus, Anda yakin bahwa fungsionalitas berfungsi - masalah regresi diselesaikan.
Ada banyak hal yang tertulis di sana,
Segera, Ketika Anda adalah seorang master,
Unit testing
Anda akan dekatTDD
. SCRUM tidak ada hubungannya dengan ini, tetapi seperti yang mereka katakan, hal-hal besar bercampur dengan baik, teknik-teknik pengembangan perangkat lunak ini bertambah menjadi tumpukan yang sangat baik , jika Anda belum mencobanya belum mencobanya.Seperti yang saya katakan di atas, mereka membuat kombinasi yang baik ; Jika Anda menambahkan beberapa pengujian otomasi ke dalamnya, maka itu lebih istimewa .
sumber
Pengujian unit memiliki nilai sebagai penopang. Ini mendukung upaya pengembangan Anda, memungkinkan Anda untuk mengubah implementasi Anda tanpa takut bahwa aplikasi Anda akan berhenti berfungsi sebagaimana diperlukan. Tes unit juga lebih dari sekadar penopang, karena memberikan Anda alat yang dapat digunakan untuk memvalidasi bahwa implementasi Anda sesuai dengan persyaratan.
Semua pengujian, apakah tes unit, tes penerimaan, tes integrasi, dan sebagainya, hanya seefektif orang yang menggunakannya. Jika Anda mendekati pekerjaan Anda dengan sembrono, tes Anda akan ceroboh, dan implementasi Anda akan mengalami masalah. Jadi mengapa repot-repot? Anda repot-repot menguji karena Anda perlu membuktikan kepada diri sendiri dan pelanggan bahwa perangkat lunak Anda berfungsi, dan tidak memiliki masalah yang dapat mencegah perangkat lunak tersebut digunakan. Ya, pengujian jelas merupakan pekerjaan ekstra, tetapi bagaimana Anda melakukan pengujian akan menentukan berapa banyak upaya yang Anda perlukan untuk memperbaiki bug setelah rilis, dan berapa banyak upaya yang diperlukan kode Anda untuk diubah dan dirawat.
TDD, dan benar-benar metode apa pun yang mengharuskan Anda untuk menulis tes sebelum kode Anda mengambil pendekatan yang Anda lakukan di awal upaya sebagai uang muka pada hutang teknis di masa depan. Ketika Anda mengerjakan proyek ini, apa pun yang terlewatkan, atau tidak diimplementasikan dengan baik akan menimbulkan lebih banyak utang teknis dalam bentuk meningkatnya kesulitan pemeliharaan, yang secara langsung memengaruhi biaya masa depan dan persyaratan sumber daya. Pengujian di muka memastikan bahwa Anda tidak hanya telah berupaya untuk mengatasi utang teknis di masa depan, tetapi juga memastikan bahwa Anda menyandikan persyaratan Anda sedemikian rupa sehingga dapat diverifikasi hanya dengan menjalankan kode Anda. Tes pertama juga memberi Anda kesempatan untuk memvalidasi pemahaman Anda tentang domain masalah sebelum Anda berkomitmen untuk memecahkan masalah dalam kode, dan itu memvalidasi upaya implementasi Anda.
Ini benar-benar berujung pada upaya memaksimalkan nilai bisnis kode Anda. Kode yang sebagian besar belum diuji dan sulit dipelihara umumnya murah dan cepat dibuat, dan sangat mahal untuk dipelihara selama masa pakai produk setelah dirilis. Kode yang telah diuji secara menyeluruh pada tingkat unit umumnya lebih mahal untuk dibuat, tetapi biaya relatif sedikit untuk dipertahankan selama masa pakai produk setelah dirilis.
TDD tidak secara khusus baik untuk metodologi tertentu. Ini hanyalah alat. Suatu praktik yang dapat Anda integrasikan ke dalam proses pengembangan Anda untuk membantu Anda mencapai hasil spesifik Anda. Jadi untuk menjawab pertanyaan Anda, TDD gratis untuk metode Anda, apakah itu SCRUM, atau pendekatan lainnya.
sumber
Orang-orang berpikir itu adalah usaha ekstra karena ini adalah kegiatan di muka. Apa yang Anda kehilangan waktu sekarang Anda dapatkan kembali nanti.
Alasan saya untuk pengujian unit juga meliputi:
Memberi Anda target: Anda tidak dapat menulis tes jika Anda tidak tahu apa yang harus dilakukan perangkat lunak. Ini membantu menghilangkan masalah dalam spesifikasi lebih awal daripada nanti.
Memberi Anda rasa kemajuan.
Memperingatkan Anda jika suatu perubahan kode mengubah output dari area kode lainnya. Itu membuat refactoring lebih mudah.
Memberikan lapisan dokumentasi tambahan (terutama jika Anda mengomentari tes dengan benar).
Mendorong semua jenis praktik yang baik. Karena tes harus berjalan cepat, tes ini mendorong Anda untuk menulis kode yang dipisahkan dan mendukung ejekan. Ini semua membantu refactoring.
Ada yang lain juga dibahas dalam posting lain di utas ini. Itu sangat berharga.
sumber
Jelas ya (lihat jawaban lain)
Menurut pendapat saya pengembangan yang digerakkan oleh tes paling efektif jika Anda menulis unit test sebelum kode aktual. dengan cara ini kode yang memenuhi tes menjadi jelas dipisahkan dengan minimum referensi eksternal yang mudah diuji.
Jika kode sudah ada tanpa tes unit di sana biasanya banyak pekerjaan tambahan untuk menulis tes unit setelah itu karena kode itu tidak ditulis untuk pengujian mudah.
Jika Anda melakukan TDD kode secara otomatis mudah diuji.
sumber
Biarkan saya mendekati ini dari sisi lain. Apa yang terjadi ketika Anda mengembangkan aplikasi non-sepele tanpa tes unit? Jika Anda memiliki departemen QA yang baik, salah satu hal pertama yang akan terjadi adalah Anda akan menemukan bahwa Anda memiliki banyak masalah yang dilaporkan. Mengapa karena Anda tidak menguji apa yang Anda lakukan dan menganggapnya akan berhasil dan karena Anda tidak terlalu memperhatikan persyaratan dan aplikasi Anda tidak memenuhinya. Oops kembali ke papan gambar untuk menulis ulang dan memperbaiki. Sekarang Anda telah melakukan perbaikan dan menemukan serangkaian masalah baru karena Anda tidak memiliki cara untuk memverifikasi bahwa perbaikan Anda tidak mempengaruhi hal lain sebelum Anda mendorong ke QA. Tenggat waktu Ups sekarang telah datang dan pergi dan manajemen menjadi kesal.
Situasinya lebih buruk jika Anda tidak memiliki departemen QA yang baik karena pengguna akan menemukan bug dan tidak hanya akan membuat bos Anda tidak senang, itu dapat membuat lingkungan produksi berlutut dan 100-an atau bahkan ribuan orang akan berada di macet saat Anda memperbaiki bug yang pengujian unit akan dicegah. Ini BUKAN pilihan karir yang baik.
Sekarang anggaplah pendekatan koboi ini berlangsung selama bertahun-tahun? Sekarang setiap perubahan, bahkan yang sepele, tampaknya memunculkan masalah baru yang tidak terduga. Tidak hanya itu, tetapi banyak hal yang ingin Anda lakukan untuk membuat aplikasi berfungsi lebih baik, Anda tidak dapat melakukannya karena terlalu berisiko atau terlalu mahal atau keduanya. Jadi Anda menempatkan tambalan pada tambalan membuat sistem semakin berbelit-belit dan buggier dan lebih sulit untuk digunakan.
Pengguna mulai mempertanyakan perkiraan waktu Anda karena mereka terus menjadi lebih besar dan lebih besar dan sulit untuk menjelaskan kepada mereka bahwa sistem telah menjadi kekacauan yang rumit, sulit untuk menemukan di mana bahkan melakukan perubahan dan lebih sulit lagi untuk memastikan mereka tidak t memecahkan sesuatu yang lain.
Saya bekerja di tempat seperti ini di mana setelah sepuluh tahun pengembangan, hampir tidak ada yang ingin kami lakukan untuk memperbaiki masalah nyata yang bisa dilakukan karena kami tidak bisa memastikan mana dari ratusan aplikasi klien yang dapat dipecah. Pengembang awal adalah sangat banyak "unit test, kita tidak perlu ada unit tes bau" jenis pengembang. Setiap orang yang mengikuti mereka menderita karena rabun dekat.
Tanpa tes unit, perangkat lunak lebih bug dan membutuhkan waktu lebih lama untuk awalnya dikembangkan dan dipelihara. Kenapa kamu tidak ingin melakukan unit test? Waktu yang Anda habiskan untuk menulis tes akan jauh lebih sedikit daripada waktu yang Anda habiskan untuk memperbaiki masalah yang seharusnya Anda temukan sebelumnya (semakin cepat bug ditemukan semakin sedikit waktu yang diperlukan untuk memperbaiki) dan masalah yang akan Anda hindari sama sekali dengan menulis tes pertama yang memberikan pemahaman yang lebih baik tentang persyaratan sebelum Anda memulai pengkodean.
sumber
Semua kode yang Anda tulis perlu diuji di beberapa titik. Anda tidak ingin menulis semuanya sekaligus dan kemudian tekan tombol kompilasi dan silangkan jari Anda. Anda menulis dan menyusun blok kecil dan mengirim input yang dibuat dengan hati-hati di kode Anda untuk memverifikasi bahwa itu melakukan apa yang Anda pikirkan. Kemudian, Anda biasanya menghapus peralatan pengujian ad-hoc Anda dan beralih ke komponen berikutnya.
Dengan pengujian unit, ini menyederhanakan proses ini dan memberi Anda alasan untuk mempertahankan tes Anda. Dengan begitu jika Anda membuat perubahan apa pun yang merusak hal-hal yang telah Anda uji di masa lalu, Anda dapat menangkap regresi itu secara eksplisit alih-alih membiarkannya memengaruhi bagian lain dari kode Anda. Ada nilai nyata dalam hal itu.
Adapun pendekatan red-green-refactor ke TDD, saya menemukan itu agak membosankan. Tetapi untuk masing-masing miliknya.
sumber
Sebagian besar waktu saya menemukan pengembang tangguh terhadap gagasan menulis tes. Bukan karena mereka akan berdebat bahwa tes tidak memiliki nilai, melainkan bahwa itu hanyalah sarana untuk mencari tahu bagaimana menyelesaikan masalah tertentu. Biasanya masalah ini berubah berdasarkan konteksnya. Setelah itu dilakukan maka tes tidak ada gunanya dan mungkin juga dihapus. Berikut adalah contoh konteks yang telah diberikan oleh rekan saya di masa lalu tentang cara memutuskan kapan harus menulis tes dan Anda akan menemukan satu-satunya jawaban yang mungkin menurut mereka tidak pernah:
Sebenarnya ada satu jenis pengujian yang saya temukan secara umum diterima dan yang saya percaya pada akhirnya tidak berguna. Yaitu pengujian berbasis GUI seperti dengan menggunakan selenium, webdriver, watir atau arquillian. Ini adalah bagaimana kita mendapatkan siklus build 7 jam daripada siklus build 5 menit pada proyek TDD saya.
Para dev yang sama ini biasanya mengeluh kepada orang lain betapa buruknya kode itu dan betapa tidak kompetennya dev sebelumnya. Mereka juga merasa sangat penting bagi Anda untuk membuat desain yang tepat menggunakan papan tulis, kantor MS, atau wiki dan berhati-hati untuk memastikan desain ini tetap mutakhir.
Yang terakhir itulah yang benar-benar membuat saya sadar bahwa devs seperti itu adalah penipu. Kita semua tahu dokumen desain apa pun yang bukan unit test akan menjadi usang dan tidak akan diperbarui karena biaya pemeliharaan semata-mata untuk melakukannya. Bahkan saya sudah mencoba dan mencoba untuk menghasilkan sarana yang baik untuk mengekspresikan ide-ide desain dalam format MS office yang berguna dan dapat dibaca baik sebelum dan sesudah fakta penulisan kode. Saya gagal dalam semua kasus dan meskipun ada orang yang berhasil menghasilkan dokumen MS office yang terlihat cantik, saya tidak pernah benar-benar menemukan yang berguna juga.
Jadi, Anda punya pilihan. Anda dapat melakukan desain dan dokumentasi dengan mempraktikkan TDD yang merupakan satu-satunya metode yang diketahui dan terbukti untuk menghasilkan dokumentasi tersebut berdasarkan 10 tahun pengalaman pengembangan saya. Atau Anda bisa terjun ke dunia politik.
sumber