Sementara, saya semua untuk pengujian unit, terkadang saya bertanya-tanya apakah bentuk pengujian pengembangan pertama ini benar-benar bermanfaat ...
Tes kecil dan sepele seperti ini bisa menjadi "burung kenari di tambang batu bara" untuk basis kode Anda, memperingatkan bahaya sebelum terlambat. Tes-tes sepele berguna untuk dilakukan karena membantu Anda mendapatkan interaksi yang benar.
Misalnya, pikirkan tentang pengujian sepele yang dilakukan untuk menyelidiki cara menggunakan API yang tidak Anda kenal. Jika pengujian tersebut memiliki relevansi dengan apa yang Anda lakukan dalam kode yang menggunakan API "nyata", ada gunanya untuk tetap mempertahankan pengujian tersebut. Saat API merilis versi baru dan Anda perlu mengupgrade. Sekarang Anda memiliki asumsi tentang bagaimana Anda mengharapkan API berperilaku yang direkam dalam format yang dapat dieksekusi yang dapat Anda gunakan untuk menangkap regresi.
... [Dalam proses yang sebenarnya, Anda memiliki 3-4 lapisan di atas kode Anda (Permintaan Bisnis, Dokumen Persyaratan, Dokumen Arsitektur), di mana aturan bisnis yang sebenarnya didefinisikan (Harga Diskon adalah Harga - Diskon) dapat salah didefinisikan. Jika itu situasinya, tes unit Anda tidak berarti apa-apa bagi Anda.
Jika Anda telah membuat kode selama bertahun-tahun tanpa tes tertulis, mungkin tidak langsung terlihat jelas bagi Anda bahwa ada nilainya. Namun jika Anda memiliki pola pikir bahwa cara terbaik untuk bekerja adalah "rilis lebih awal, sering rilis" atau "gesit" karena Anda menginginkan kemampuan untuk menerapkan dengan cepat / terus-menerus, maka pengujian Anda pasti berarti. Satu-satunya cara untuk melakukannya adalah dengan melegitimasi setiap perubahan yang Anda buat pada kode dengan tes. Tidak peduli seberapa kecil tesnya, setelah Anda memiliki rangkaian pengujian hijau, Anda secara teoritis dapat menerapkannya. Lihat juga "produksi berkelanjutan" dan "beta abadi".
Anda juga tidak harus menjadi "ujian pertama" untuk memiliki pola pikir ini, tetapi itu biasanya cara paling efisien untuk sampai ke sana. Ketika Anda melakukan TDD, Anda mengunci diri Anda ke dalam siklus Refactor Merah Hijau kecil dua sampai tiga menit. Anda tidak dapat berhenti dan pergi dan memiliki kekacauan total di tangan Anda yang akan memakan waktu satu jam untuk debug dan disatukan kembali.
Selain itu, pengujian unit Anda adalah titik kegagalan lainnya ...
Tes yang berhasil adalah tes yang menunjukkan kegagalan dalam sistem. Tes yang gagal akan memperingatkan Anda akan kesalahan dalam logika tes atau dalam logika sistem Anda. Tujuan pengujian Anda adalah untuk memecahkan kode Anda atau membuktikan satu skenario berfungsi.
Jika Anda menulis tes setelah kode, Anda berisiko menulis tes yang "buruk" karena untuk melihat bahwa tes Anda benar-benar berfungsi, Anda perlu melihatnya rusak dan berfungsi. Saat Anda menulis pengujian setelah kode, ini berarti Anda harus "membuka perangkap" dan memasukkan bug ke dalam kode untuk melihat pengujian gagal. Sebagian besar pengembang tidak hanya merasa tidak nyaman dengan hal ini, tetapi juga akan membantah bahwa ini hanya membuang-buang waktu.
Apa yang kita dapatkan di sini?
Pasti ada manfaatnya melakukan sesuatu dengan cara ini. Michael Feathers mendefinisikan "kode warisan" sebagai "kode yang belum diuji." Saat Anda mengambil pendekatan ini, Anda melegitimasi setiap perubahan yang Anda buat pada basis kode Anda. Ini lebih ketat daripada tidak menggunakan pengujian, tetapi ketika harus mempertahankan basis kode yang besar, itu membayar sendiri.
Berbicara tentang Feathers, ada dua sumber bagus yang harus Anda periksa sehubungan dengan ini:
Keduanya menjelaskan cara menerapkan jenis praktik dan disiplin ini ke dalam proyek yang bukan "Greenfield". Mereka menyediakan teknik untuk menulis tes seputar komponen yang berpasangan erat, ketergantungan kabel, dan hal-hal yang tidak perlu Anda kendalikan. Ini semua tentang menemukan "jahitan" dan menguji sekelilingnya.
[Jika harga diskon salah, tim penguji masih akan menemukan masalah, bagaimana pengujian unit menyimpan pekerjaan?
Kebiasaan seperti ini seperti investasi. Pengembalian tidak langsung; mereka membangun seiring waktu. Alternatif untuk tidak menguji pada dasarnya mengambil hutang karena tidak dapat menangkap regresi, memperkenalkan kode tanpa takut akan kesalahan integrasi, atau mendorong keputusan desain. Keindahannya adalah Anda melegitimasi setiap perubahan yang dimasukkan ke dalam basis kode Anda.
Apa yang kulewatkan di sini? Tolong ajari saya untuk mencintai TDD, karena saya kesulitan menerimanya sejauh ini. Saya ingin juga, karena saya ingin tetap progresif, tetapi itu tidak masuk akal bagi saya.
Saya melihatnya sebagai tanggung jawab profesional. Itu ideal untuk diperjuangkan. Tetapi sangat sulit untuk diikuti dan membosankan. Jika Anda peduli, dan merasa Anda tidak seharusnya menghasilkan kode yang tidak diuji, Anda akan dapat menemukan kekuatan kemauan untuk mempelajari kebiasaan pengujian yang baik. Satu hal yang banyak saya lakukan sekarang (seperti yang dilakukan orang lain) adalah mengatur waktu sendiri satu jam untuk menulis kode tanpa tes sama sekali, kemudian memiliki disiplin untuk membuangnya. Ini mungkin tampak sia-sia, tetapi sebenarnya tidak. Ini tidak seperti latihan yang merugikan materi fisik perusahaan. Ini membantu saya untuk memahami masalah dan cara menulis kode sedemikian rupa sehingga memiliki kualitas yang lebih tinggi dan dapat diuji.
Saran saya pada akhirnya adalah jika Anda benar-benar tidak memiliki keinginan untuk menjadi ahli dalam hal itu, maka jangan lakukan itu sama sekali. Tes buruk yang tidak dipertahankan, tidak berkinerja baik, dll. Bisa lebih buruk daripada tidak memiliki tes apa pun. Sulit untuk belajar sendiri, dan Anda mungkin tidak akan menyukainya, tetapi hampir tidak mungkin untuk mempelajarinya jika Anda tidak memiliki keinginan untuk melakukannya, atau tidak dapat melihat nilai yang cukup di dalamnya. menjamin investasi waktu.
Beberapa orang terus menyebutkan bahwa pengujian membantu menegakkan spesifikasi. Menurut pengalaman saya, spesifikasi juga salah, lebih sering daripada tidak ...
Keyboard pengembang adalah tempat pertemuan karet dengan jalan. Jika speknya salah dan Anda tidak mengibarkan bendera di atasnya, kemungkinan besar Anda akan disalahkan karenanya. Atau setidaknya kode Anda akan. Disiplin dan ketelitian yang terlibat dalam pengujian sulit untuk ditaati. Itu sama sekali tidak mudah. Itu membutuhkan latihan, banyak pembelajaran dan banyak kesalahan. Tapi akhirnya itu membuahkan hasil. Pada proyek yang bergerak cepat dan cepat berubah, itulah satu-satunya cara Anda dapat tidur di malam hari, tidak peduli jika itu memperlambat Anda.
Hal lain yang perlu dipikirkan di sini adalah bahwa teknik yang pada dasarnya sama dengan pengujian telah terbukti berhasil di masa lalu: "ruang bersih" dan "desain berdasarkan kontrak" keduanya cenderung menghasilkan jenis konstruksi kode "meta" yang sama yang tes dilakukan, dan menerapkannya pada titik yang berbeda. Tak satu pun dari teknik ini adalah peluru perak, dan ketelitian pada akhirnya akan merugikan Anda dalam cakupan fitur yang dapat Anda berikan dalam hal waktu ke pasar. Tapi bukan itu masalahnya. Ini tentang mampu mempertahankan apa yang Anda berikan. Dan itu sangat penting untuk sebagian besar proyek.