Apakah ada nilai dalam penulisan unit test untuk kode yang sudah berfungsi saat mewarisi aplikasi?

27

Jelas beberapa aplikasi lama tidak dapat atau sangat sulit untuk diuji unit karena cara itu ditulis di tempat pertama.

Tetapi di beberapa tempat, seperti beberapa metode pembantu yang mungkin bisa diuji unit, haruskah saya repot menulis tes unit untuk mereka?

Maksud saya, mereka dapat ditulis seperti anjing, tetapi betapapun rapuhnya logika, ujian waktu telah membuktikan bahwa ia bekerja sebagaimana mestinya. Haruskah saya hanya repot-repot untuk tes unit jika saya mengatakan re-factoring atau haruskah saya menulis tes unit untuk mereka setiap kali saya punya waktu?

Apakah ada nilai dalam melakukan ini?

Mempertimbangkan juga bahwa definisi metode mungkin tidak jelas, dan saya mungkin perlu meneliti apa yang harus dilakukan beberapa metode dalam kondisi tertentu.

RoboShop
sumber
4
Bantulah diri Anda sendiri dan bacalah Bekerja Efektif dengan Legacy Code . Jika seluruh buku dikhususkan untuk menjawab ini dan pertanyaan terkait lainnya.
Rein Henrichs

Jawaban:

15

Saya pikir Anda harus menulis sebanyak mungkin tes untuk aplikasi tersebut. Mereka akan membantu Anda mempelajari basis kode dan mempersiapkan Anda untuk refactoring akhirnya atau pengembangan baru.

Ada beberapa jenis tes yang dapat Anda tulis dalam skenario itu, masing-masing memiliki kelebihan masing-masing. Menulis tes ini akan mengajarkan Anda banyak hal tentang aplikasi yang Anda hadapi.

Pertama-tama, sebelum Anda memulai tes menulis untuk kebenaran, tulis tes yang menangkap perilaku saat ini , apakah itu benar atau salah. Ini adalah taruhan yang cukup aman bahwa Anda akan menemukan bug dalam kasus sudut atau di bagian kode yang tidak diuji secara menyeluruh dengan menjalankan program. Jangan khawatir tentang apa yang harus dilakukan kode, cukup tangkap apa yang dilakukannya. Saat Anda melanjutkan, jangan khawatir tentang membaca kode atau menghabiskan waktu serius mencari tahu apa yang seharusnya dihasilkan. Jalankan tes Anda dan tangkap output itu dengan tegas.

Itu akan memberi Anda dasar pemahaman yang kuat tentang bagaimana kode beroperasi dan di mana titik nyeri utama atau area lemah mungkin. Jika Anda menemukan bug, Anda dapat mendekati orang-orang dengan kekuatan untuk memutuskan apakah mereka layak diperbaiki atau tidak dan membuat keputusan itu.

Selanjutnya, Anda dapat menulis beberapa tes yang lebih besar (dalam ruang lingkup) yang mencakup bagian-bagian kode yang mungkin tidak mudah diuji unit tetapi di mana masih penting untuk menguji alur kerja sebanyak mungkin. Tes alur kerja ini atau tes integrasi , tergantung pada bagaimana Anda ingin melihatnya, akan memberi Anda dasar yang bagus untuk refactoring alur kerja tersebut untuk membuatnya lebih dapat diuji dan melindungi Anda ketika fitur baru perlu ditambahkan yang mungkin mempengaruhi alur kerja yang ada.

Seiring waktu, Anda akan membangun serangkaian tes yang ada untuk membantu Anda atau orang berikutnya yang akhirnya mewarisi aplikasi.

Adam Lear
sumber
13

Saya melihat tes unit sebagai spesifikasi, bukan tes belaka. Dalam kasus khusus yang telah Anda sebutkan, nilai sebenarnya akan datang ketika Anda memiliki unit test di tempat sebelum melakukan perubahan untuk menyesuaikan dengan spesifikasi baru. Jika Anda akan mengubah kode yang diwarisi maka cara terbaik yang saya lihat adalah memiliki tes unit untuk fungsionalitas, ini tidak hanya akan membawa jaring pengaman tetapi juga membantu kami memberikan kejelasan lebih lanjut tentang apa yang dilakukan unit tertentu. Mungkin juga memaksa Anda untuk melakukan riset seperti yang disebutkan oleh Anda yang bagus untuk pemahaman. Jadi saya mengambil adalah untuk mendapatkan unit test modul di tempat sebelum akan mengalami perubahan.

Vinod R
sumber
Tulis tes dalam bahasa tingkat tertinggi yang akan berfungsi. Ketika diminta memperkirakan waktu untuk melakukan perubahan, sertakan waktu yang dibutuhkan untuk menulis tes yang hilang. Anda mungkin membutuhkan waktu lebih lama untuk melakukan perubahan, tetapi Anda akan menempatkan bug lebih sedikit di lapangan.
kevin cline
8
 > Is there any value in writing unit tests for code that 
 > already works when inheriting applications?

TIDAK . Dari pengalaman saya ada hubungan biaya / manfaat yang buruk untuk penulisan unit test setelah kode produksi ditulis karena sangat tidak mungkin / sulit untuk menemukan cara untuk menguji kode dalam isolasi tanpa refactoring berat. Salah satu manfaat dari pengembangan yang digerakkan oleh tes adalah Anda mendapatkan kode yang digabungkan secara longgar. Jika Anda menulis tes setelah itu kemungkinan besar bahwa kode tersebut dipasangkan dengan erat.

YA Anda bisa menulis tes Integrasi untuk aplikasi untuk fungsi-fungsi di mana Anda berencana untuk melakukan perubahan. Dengan cara ini Anda dapat melakukan uji regresi untuk melihat apakah perubahan Anda merusak sesuatu.

YA dari sudut pandang kualitas dan pengembang, sangat berharga untuk memiliki Tes.

TIDAK dari sudut pandang bisnis karena sangat sulit untuk menjual pelanggan bahwa Anda memerlukan waktu / uang untuk tidak mendapatkan nilai bisnis nyata tetapi janji samar bahwa perubahan bisnis tidak akan memperburuk keadaan.

k3b
sumber
+1 untuk tes integrasi daripada tes unit untuk kasus ini. Nasihat yang sangat pragmatis
gbjbaanb
5

Jika mungkin ada lebih banyak alasan untuk menulis tes untuk kode yang ada yang "sudah berfungsi". Jika tidak ada tes maka kemungkinan kode sudah matang dengan bau dan bisa menggunakan refactoring luas untuk ditingkatkan; suite tes akan membantu Anda untuk refactor. Bahkan mungkin mengungkapkan bahwa kode asli tidak berfungsi dengan baik; Saya ingat sekali saya menulis tes untuk metode menghasilkan laporan penjualan dan saya menemukan itu tidak menghitung hal-hal dengan benar sehingga penjualan beberapa ribu dolar lebih banyak daripada yang sebenarnya, dan tidak ada yang tahu dalam lima tahun bahwa kode dalam produksi (Untungnya itu bukan tujuan keuangan sebenarnya, hanya perkiraan laporan penjualan).

Tentu saja, saran ini hanya berlaku jika Anda benar - benar dapat menulis tes. Dalam pengalaman saya, basis kode tanpa tes hampir tidak mungkin untuk retrofit tes karena Anda harus menulis ulang setengah dari modul kode menjadi cukup abstrak untuk mendukung pengujian terlebih dahulu, dan Anda tidak akan dapat melakukan itu.

Wayne Molina
sumber
Mengapa downvote karena menyatakan kebenaran?
Wayne Molina
4

Benar-benar ya , karena pengujian unit tidak harus memverifikasi kebenaran tetapi mencirikan perilaku aktual sistem. Terutama dengan proyek warisan, banyak persyaratan secara implisit dikodekan dalam perilaku aktual.

Karakterisasi ini berfungsi sebagai garis dasar fungsionalitas. Bahkan jika perilaku salah dari sudut pandang bisnis, Anda mencegah perilaku merendahkan lebih jauh. Mendapatkan daya tarik dalam proyek lawas bisa jadi sulit, dan ini memberi Anda garis dasar sehingga Anda dapat bergerak maju tanpa memperburuk keadaan.

Jadi, tulis semua tes unit yang Anda bisa. Untuk kode yang tidak dapat diuji, perbaiki kode Anda untuk memisahkan dependensi dengan memasukkan "jahitan" ke dalam kode - lokasi di mana Anda dapat memisahkan kode yang ingin Anda uji dari kode yang tidak ingin Anda uji.

Gagasan unit test sebagai tes karakterisasi dan jahitan adalah poin utama dalam Bekerja Efektif dengan Legacy Code oleh Michael Feathers, sebuah buku yang sangat saya rekomendasikan.

Matthew Rodatus
sumber
2

Saya sendiri telah memikirkan hal ini karena ada cukup banyak tulisan yang tidak berdokumen yang ditulis dengan buruk, tetapi bekerja dengan kode warisan dalam sistem kami.

Anda membuat poin yang bagus:

Haruskah saya hanya repot-repot untuk tes unit jika saya mengatakan re-factoring atau haruskah saya menulis tes unit untuk mereka setiap kali saya punya waktu?

Jika persyaratannya berubah, saya pikir akan sangat berharga untuk menulis tes unit. Jika tidak, saya tidak akan repot terutama karena Anda tidak akan dapat menulis tes yang tepat, karena Anda tidak tahu semua persyaratan.

setiap kali saya punya waktu?

Anda punya waktu ketika mendapat prioritas, kan ?, jadi itu tidak akan pernah terjadi. :)

Michael
sumber
1

Apakah Anda mencoba memanfaatkan aspek basis kode yang sebelumnya tidak pernah digunakan dalam aplikasi produksi? Tulis tes unit untuk skenario-skenario itu terlebih dahulu. Anda harus dapat memprioritaskan pekerjaan Anda di sini, dan saya pikir The Art of Unit Testing memiliki beberapa saran dalam hal itu (khususnya cara mendekati pengujian basis kode warisan).

Justin Simon
sumber
1

Jangan berasumsi bahwa semuanya berfungsi hanya karena aplikasi sedang berjalan dan berjalan ... biasanya, "ujian waktu" hanya menunjukkan bahwa a) Anda belum menemukan cacat yang tersisa atau b) orang-orang yang telah menemukan mereka belum melaporkannya. (Atau mungkin keduanya.) Dan bahkan kode yang mungkin berfungsi sekarang mungkin tidak berfungsi saat berikutnya Anda harus melakukan perubahan.

Tes unit memberi Anda ukuran kepastian bahwa fungsi tertentu tetap utuh, sementara juga memberi Anda cara untuk menunjukkan ini untuk jumlah kasus yang wajar. Itu secara signifikan lebih berharga daripada "melihat-lihat dan menguji ini", bahkan untuk perbaikan bug tunggal. (Mengaduk-aduk lebih mirip dengan integrasi atau pengujian sistem, jadi dalam hal itu, pengujian aplikasi secara manual dapat mencakup lebih dari pengujian unit saja, tapi itu masih menghabiskan waktu dengan cara yang tidak efisien. Bahkan beberapa metode mengotomatisasi tes tersebut adalah lebih baik daripada melakukannya secara manual.)

Anda pasti harus menulis tes ketika Anda mengubah kode, apakah itu memperbaiki atau refactoring. Anda mungkin sebaiknya mengerjakan tes sebaik mungkin, jika tanpa alasan lain selain menghemat waktu lain kali Anda harus memperbaiki cacat (dan akan ada waktu berikutnya) ... meskipun dalam kasus ini, Anda akan harus menyeimbangkan waktu itu dengan harapan orang-orang yang berpura-pura bahwa perangkat lunak selalu bebas cacat dan dengan demikian waktu yang dihabiskan untuk pemeliharaan di masa depan "terbuang". (Namun, itu tidak berarti Anda harus mengabaikan jadwal saat ini.) Pada titik tertentu, jika Anda melakukan ini, Anda akan memiliki cakupan yang cukup sehingga Anda dapat mulai menunjukkan nilai pengujian pada aplikasi lawas, dan itu mungkin membantu Anda menghabiskan saat itu di aplikasi masa depan, yang pada akhirnya harus meluangkan waktu untuk dihabiskan untuk pengembangan produktif.

Dave DuPlantis
sumber
0

Dari hati tanah saya , saya akan mengatakan ya dan tidak hanya itu, tetapi hack itu, refactor dan terus pengujian, tetapi pastikan Anda tidak ketinggalan dalam proyek penting lainnya. Sebagai programmer yang bekerja, Jika pekerjaan Anda berisiko atau jika manajer menyuruh Anda mengambil kepemilikan, maka ya. Jika tim atau perusahaan mungkin menderita, bernegosiasi dengan manajer Anda untuk memberi tahu dia bahwa perlu melakukan pengujian untuk menjaga perusahaan dari bencana. Jika dia bilang jangan khawatir, maka Anda sudah keluar dari kesulitan (belum tentu, menyalahkan delegasi adalah keterampilan manajemen, jadi pastikan Anda keluar dari kesulitan ... sungguh!)

Semoga berhasil!

Armando
sumber