Komunitas pengembang perangkat lunak sedang terlibat dalam perdebatan sengit mengenai strategi pengujian untuk kode legacy, khususnya berfokus pada keseimbangan antara pengujian tingkat implementasi dan pengujian fungsional. Diskusi ini muncul dari artikel terbaru tentang penanganan kode legacy, di mana para pengembang berbagi pengalaman dan pendekatan yang berbeda tentang metodologi pengujian.
Jebakan Pengujian Implementasi
Kekhawatiran signifikan yang diangkat oleh para pengembang adalah bahwa fokus berlebihan pada detail implementasi dalam pengujian justru dapat membuat basis kode lebih sulit untuk dikelola. Beberapa pengembang melaporkan bahwa pengujian yang terikat erat dengan detail implementasi menciptakan hambatan tambahan ketika mencoba memodifikasi atau meningkatkan kode yang ada. Hal ini terutama bermasalah ketika pengujian dikelola oleh tim yang berbeda atau ketika bekerja dengan lingkungan CI/CD yang kaku.
Alternatif Pengujian Integrasi
Konsensus yang muncul menyarankan pendekatan yang lebih seimbang untuk menguji kode legacy:
-
Pengujian Tingkat Tinggi Terlebih Dahulu : Alih-alih langsung mencoba menulis unit test untuk fungsi yang tidak dapat diuji, mulailah dengan pengujian integrasi atau E2E untuk membangun jaring pengaman dasar. Pendekatan ini membantu mengkodekan perilaku sistem pada tingkat fungsional sebelum mendalami perubahan tingkat yang lebih rendah.
-
Pengujian Berbasis Use-Case : Daripada menguji detail implementasi individual, fokus pada pengujian use case secara lengkap. Contohnya:
// Pendekatan yang disukai (tingkat use-case):
addToBasket(basketId=1234, productId=9)
basketView = viewBasket(1234)
assert 9 in basketView
// Alih-alih detail implementasi:
addToBasket(basketId=1234, productId=9)
basket = fakeDb.getBasket(1234)
assert 9 in basket
Perdebatan Refactor vs Rewrite
Ketika menangani fungsi legacy yang tidak dapat diuji, komunitas terbagi menjadi dua pendekatan:
- Refactoring Hati-hati : Melakukan perubahan minimal untuk membuat kode dapat diuji, yang dianggap kurang berisiko oleh banyak pengembang
- Penulisan Ulang Lengkap : Membuat fungsi baru dari awal dengan pengujian, yang membawa risiko lebih tinggi dalam memunculkan bug baru
Konsensus cenderung ke arah refactoring yang hati-hati, terutama untuk fungsi yang telah mengalami perbaikan bug sebelumnya, karena seringkali mengandung penanganan kasus khusus yang penting yang mungkin terlewatkan dalam penulisan ulang.
Kompromi Praktis
Pendekatan yang banyak didukung yang muncul dari diskusi adalah strategi pengujian bertahap:
- Mengekstrak blok kode yang dapat diuji di sekitar area yang membutuhkan perubahan
- Menulis pengujian untuk fungsi yang diekstrak tersebut
- Membuat modifikasi yang diperlukan
- Membiarkan sisa basis kode tidak tersentuh
Metode ini memberikan keseimbangan praktis antara mempertahankan kualitas kode dan mengelola kecepatan pengembangan, terutama ketika menangani sistem legacy yang besar.
Melangkah Maju
Diskusi ini menekankan bahwa meskipun pengujian sangat penting, pendekatan yang diambil harus pragmatis dan sesuai dengan konteks spesifik. Kuncinya adalah menemukan keseimbangan yang tepat antara cakupan pengujian dan kemampuan pemeliharaan, sambil memastikan bahwa pengujian berfungsi sebagai alat yang membantu dan bukan penghambat pengembangan.