Skip to content

Path Relatif Uji yang Tinggal Galur

Adityo Guni Waluyo

Reorganisasi pohon test yang tampak mekanis mematahkan uji migrasi: path relatif terikat kedalaman direktori test, bukan akar modul.

Ringkasan

Gara-gara pindah folder, uji migrasi malah error karena path relatif di test kehilangan tingkat kedalaman. Solusinya, kedalaman naik di SetupTestDB dan path di migrations_test.go disesuaikan sama struktur baru. Intinya, path relatif di test itu rapuh, jadi cek lagi tiap kali pindah berkas uji.

Saat menjalankan perintah go test setelah reorganisasi struktur direktori proyek, seluruh uji migrasi database tiba-tiba gagal. Pesan fatalnya monoton: failed to create migrate instance (tried ../../ and ../../../). Tidak ada perubahan pada logika migrasi itu sendiri, hanya pemindahan lokasi berkas uji ke dalam pohon direktori yang baru.

Asumsi yang Menyesatkan dan Akar Masalahnya

Komit pemindahan sebelumnya secara eksplisit menyatakan bahwa path relatif menuju folder migrations tetap benar di lokasi baru dengan kedalaman yang sama. Pernyataan ini secara teknis benar untuk berkas migrations_test.go yang dipindahkan secara setara. Namun, klaim tersebut ternyata menyesatkan ketika diterapkan pada modul uji integrasi bersama. Kegagalan ini tidak muncul tepat pada saat pemindahan, melainkan satu komit setelahnya, ketika modul uji yang lebih dalam mulai dieksekusi.

Penggerak migrasi yang digunakan dalam proyek ini, yaitu golang-migrate/migrate [6], mendokumentasikan dukungan untuk dua bentuk sumber berkas: file:///absolute/path dan file://relative/path [5]. Proyek ini menggunakan bentuk relatif. Masalah mendasar terletak pada bagaimana lingkungan Go menangani direktori kerja saat pengujian berlangsung.

Dalam mode direktori lokal, go test mengompilasi sumber paket dan uji yang ditemukan di direktori saat ini, lalu menjalankan biner uji yang dihasilkan [7]. Konsekuensi langsungnya adalah direktori kerja proses uji terikat pada lokasi berkas uji itu berada, bukan pada akar modul proyek.

Ketika pohon direktori tests/integration dipindahkan satu tingkat lebih dalam dibandingkan lokasi internal yang lama, tangga kedalaman pada helper SetupTestDB di paket testutil tidak lagi valid. Helper ini sebelumnya dikodekan keras untuk naik 2 lalu 3 tingkat, pola yang dirancang khusus untuk topologi direktori lama. Dari lokasi baru di kedalaman empat, pola naik tersebut kehabisan anak tangga sebelum mencapai target.

Kasusnya konkret: path file://../../migrations yang di-hardcode di migrations_test.go kini resolve ke api/tests, satu tingkat kurang dari folder migrasi. Path relatif itu tinggal galur karena terikat pada kedalaman direktori yang sudah usang. Mekanisme inilah yang membuat pemindahan yang terlihat aman malah mematahkan uji migrasi satu komit kemudian.

Penyesuaian Tangga Kedalaman

Yang bikin kejadian ini menjengkelkan sekaligus mengajarkan: uji unit lain lolos semua. Hanya uji yang menyentuh folder migrasi yang jatuh, karena hanya mereka yang menggantungkan perilakunya pada path relatif. Perbaikannya memerlukan penyesuaian ulang resolusi path dari lokasi baru, bukan sekadar menyalin konfigurasi lama Tangga kedalaman pada fungsi SetupTestDB di dalam modul bersama dipusatkan ulang menjadi naik 3 lalu 4 tingkat. Perubahan ini disertai komentar kode yang secara eksplisit menyebutkan kedalaman baru tersebut untuk mencegah regresi di masa depan.

Secara paralel, migrations_test.go yang berdiri sendiri diperbarui untuk meng-hardcode path 3 tingkat ke atas, yaitu file://../../../migrations, agar selaras dengan struktur pohon direktori yang baru. Pesan fatalnya pun diperbarui mencantumkan pasangan kedalaman baru, supaya kegagalan berikutnya membaca dirinya sendiri. Setelah penyesuaian ini diterapkan, siklus migrasi turun dan naik dijalankan ulang terhadap basis data uji. Keluaran terminal menunjukkan bahwa skema basis data berhasil di-teardown dan di-build ulang tanpa eror directory not found, mengonfirmasi bahwa resolusi path kini telah akurat dan stabil.

Ada dua pelajaran yang bisa langsung dipakai. Pertama, anggap setiap path relatif di dalam test sebagai konstanta yang terikat kedalaman: memindahkan berkas test sama dengan mengubah nilai konstanta itu, mau tidak mau. Kedua, tangga kedalaman ala SetupTestDB memang pragmatis untuk repo kecil, tapi ia menyembunyikan asumsi topologi di kode yang jarang dibaca. Komentar yang menyebut kedalaman yang dicoba, plus pesan fatal yang mendaftar semuanya, adalah harga murah untuk kegagalan yang mendiagnosis dirinya sendiri.

Path sumber daya relatif dalam pengujian terikat erat pada kedalaman direktori tempat berkas uji berada. Ketika pohon direktori uji direorganisasi, turunkan kembali setiap path relatif dari lokasi baru. Sebagai praktik pertahanan, tambahkan asersi awal yang memverifikasi keberadaan path yang diselesaikan. Jika path tidak ditemukan, keluarkan pesan fatal yang mencantumkan kedalaman yang telah dicoba, sehingga kegagalan tersebut langsung menjelaskan penyebabnya sendiri tanpa memerlukan proses tebakan ulang.

Sources

Artikel terkait