Saya telah ditugaskan untuk meningkatkan cakupan kode proyek Java yang ada.
Saya perhatikan bahwa alat cakupan kode ( EclEmma ) telah menyoroti beberapa metode yang tidak pernah dipanggil dari mana pun.
Reaksi awal saya bukan menulis unit test untuk metode ini, tetapi untuk menyoroti mereka ke manajer lini saya / tim dan bertanya mengapa fungsi-fungsi ini ada untuk memulai.
Apa yang akan menjadi pendekatan terbaik? Tulis unit test untuk mereka, atau tanyakan mengapa mereka ada di sana?
java
unit-testing
test-coverage
Lucas T
sumber
sumber
Jawaban:
Alasan:
jarangterjadi ketika seseorang mencari kode itu dapat diambil kembali.Peringatan dari komentar: Jawaban semula mengasumsikan bahwa Anda telah memverifikasi dengan seksama bahwa kode, sudah pasti, mati. IDE bisa keliru, dan ada beberapa cara kode yang terlihat mati sebenarnya bisa disebut. Bawa ahli kecuali Anda benar-benar yakin.
sumber
Semua jawaban lain didasarkan pada asumsi bahwa metode yang dimaksud benar-benar tidak digunakan. Namun, pertanyaannya tidak menentukan apakah proyek ini mandiri atau semacam perpustakaan.
Jika proyek tersebut adalah perpustakaan, metode yang tampaknya tidak digunakan dapat digunakan di luar proyek dan menghapusnya akan merusak proyek-proyek lainnya. Jika perpustakaan itu sendiri dijual kepada pelanggan atau disediakan untuk umum, mungkin bahkan tidak mungkin untuk melacak penggunaan metode ini.
Dalam hal ini, ada empat kemungkinan:
sumber
filter_name_exists
,ReloadSettings
atauaddToSchema
(dipilih secara acak dari 3 proyek open source sewenang-wenang) harus memberikan beberapa petunjuk tentang apa yang seharusnya dilakukan oleh metode tersebut. Komentar javadoc mungkin lebih bermanfaat. Bukan spesifikasi yang tepat, saya tahu, tetapi bisa cukup untuk membuat beberapa tes yang dapat mencegah regresi setidaknya.Pertama periksa apakah alat jangkauan kode Anda sudah benar.
Saya memiliki situasi di mana mereka belum mengambil metode yang dipanggil melalui referensi ke antarmuka, atau jika kelas dimuat secara dinamis di suatu tempat.
sumber
Karena Java dikompilasi secara statis, itu seharusnya cukup aman untuk menghapus metode. Menghapus kode mati selalu baik. Ada beberapa kemungkinan bahwa ada beberapa sistem refleksi gila yang menjalankannya dalam runtime, jadi tanyakan terlebih dahulu dengan pengembang lain, tetapi jika tidak hapuslah.
sumber
invokedynamic
instruksinya, jadi, Anda tahu ...Menghapus kode adalah hal yang baik.
Ketika Anda tidak dapat menghapus kode, Anda tentu dapat menandainya sebagai @Deprecated , mendokumentasikan rilis utama yang Anda targetkan untuk menghapus metode ini. Kemudian Anda dapat menghapusnya "nanti". Sementara itu, akan jelas bahwa tidak ada kode baru yang ditambahkan tergantung padanya.
Saya tidak akan merekomendasikan berinvestasi dalam metode yang sudah usang - jadi tidak ada pengujian unit baru untuk mencapai target cakupan.
Perbedaan antara keduanya terutama apakah metode tersebut merupakan bagian dari antarmuka yang diterbitkan . Menghapus bagian antarmuka yang diterbitkan secara sewenang-wenang dapat menjadi kejutan yang tidak menyenangkan bagi konsumen yang bergantung pada antarmuka.
Saya tidak dapat berbicara dengan EclEmma, tetapi dari pengalaman saya, salah satu hal yang perlu Anda perhatikan adalah refleksi. Jika, misalnya, Anda menggunakan file konfigurasi teks untuk memilih kelas / metode mana yang akan diakses, perbedaan yang digunakan / tidak digunakan mungkin tidak jelas (saya telah dibakar oleh itu beberapa kali).
Jika proyek Anda adalah daun dalam grafik dependensi, maka kasus penghentian melemah. Jika proyek Anda adalah pustaka, maka kasus penghinaan lebih kuat.
Jika perusahaan Anda menggunakan mono-repo , maka menghapus lebih rendah risikonya daripada dalam kasus multi-repo.
Seperti dicatat oleh l0b0 , jika metode sudah tersedia dalam kontrol sumber, memulihkannya setelah penghapusan adalah latihan langsung ke depan. Jika Anda benar-benar khawatir perlu melakukan itu, pikirkan bagaimana mengatur komit Anda sehingga Anda dapat memulihkan perubahan yang dihapus jika Anda membutuhkannya.
Jika ketidakpastiannya cukup tinggi, Anda dapat mempertimbangkan untuk mengomentari kodenya , daripada menghapusnya. Ini adalah pekerjaan tambahan di jalur bahagia (di mana kode yang dihapus tidak pernah dipulihkan), tetapi itu membuatnya lebih mudah untuk dipulihkan. Dugaan saya adalah bahwa Anda harus memilih penghapusan langsung sampai Anda telah dibakar beberapa kali, yang akan memberi Anda wawasan tentang cara mengevaluasi "ketidakpastian" dalam konteks ini.
Waktu yang diinvestasikan untuk menangkap pengetahuan tidak selalu sia-sia. Saya diketahui melakukan penghapusan dalam dua langkah - pertama, dengan menambahkan dan melakukan komentar yang menjelaskan apa yang telah kami pelajari tentang kode, dan kemudian menghapus kode (dan komentar).
Anda juga bisa menggunakan sesuatu yang analog dengan catatan keputusan arsitektural sebagai cara untuk menangkap pengetahuan dengan kode sumber.
sumber
Alat cakupan kode tidak maha tahu, maha melihat. Hanya karena alat Anda mengklaim bahwa metode ini tidak dipanggil, itu tidak berarti itu tidak dipanggil. Ada refleksi, dan tergantung pada bahasanya mungkin ada cara lain untuk memanggil metode. Di C atau C ++ mungkin ada makro yang membangun fungsi atau nama metode, dan alat mungkin tidak melihat panggilan. Jadi langkah pertama adalah: Lakukan pencarian teks untuk nama metode, dan nama terkait. Tanyakan rekan yang berpengalaman. Anda mungkin menemukan itu benar-benar digunakan.
Jika Anda tidak yakin, letakkan assert () di awal setiap metode "yang tidak digunakan". Mungkin dipanggil. Atau pernyataan logging.
Mungkin kodenya sebenarnya berharga. Ini mungkin kode baru yang sudah dikerjakan seorang rekan selama dua minggu, dan dia akan menghidupkannya besok. Itu tidak dipanggil hari ini karena panggilan itu akan ditambahkan besok.
Mungkin kodenya sebenarnya berharga bagian 2: Kodenya mungkin melakukan beberapa tes runtime yang sangat mahal yang dapat menemukan kesalahan. Kode hanya dihidupkan jika ada yang salah. Anda mungkin menghapus alat debugging yang berharga.
Menariknya, saran terburuk yang mungkin "Hapus. Berkomitmen. Lupakan." adalah nilai tertinggi. (Ulasan kode? Anda tidak melakukan tinjauan kode? Apa yang Anda lakukan pemrograman jika Anda tidak melakukan tinjauan kode?)
sumber
Bergantung pada lingkungan tempat perangkat lunak dijalankan, Anda bisa masuk jika metode ini pernah dipanggil. Jika tidak dipanggil dalam jangka waktu yang sesuai, maka metode ini dapat dihapus dengan aman.
Ini adalah pendekatan yang lebih hati-hati daripada hanya menghapus metode, dan mungkin berguna jika Anda menjalankan dalam lingkungan yang sangat sensitif terhadap kesalahan.
Kami masuk ke
#unreachable-code
saluran slack khusus dengan pengidentifikasi unik untuk setiap kandidat untuk dihapus, dan itu terbukti sangat efektif.sumber