Blog
Catatan teknis seputar web development, DevOps, dan integrasi AI.
500 artikel
- 06.03testing
Path Relatif Uji yang Tinggal Galur
Reorganisasi pohon test yang tampak mekanis mematahkan uji migrasi: path relatif terikat kedalaman direktori test, bukan akar modul.
TL;DR: 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.
#go#testing#database - 05.52testing
Uji Luar Paket: Tiga Seam yang Dipaksa Eksplisit
Memindahkan test keluar paket bukan sekadar relokasi berkas. Tiga modul Go memaksa tiga bentuk seam: pembaca status, sleep yang disuntik, orakel cermin.
TL;DR: Pindahin test keluar paket ternyata bukan cuma pindah folder, kompilasi langsung rusak karena identifier internal gak keliatan dari luar. Solusinya: ekspor StoredTTL biar test TTL gak perlu nunggu, RetryConnect dengan fungsi tidur yang bisa dipalsuin, sama AllModules sebagai pembanding anti tautologi. Pelajarannya: ini audit kontrak, produksi tetap aman.
#go#testing#refactoring - 05.10testing
Satu Baris package clause yang Tetap Lolos Build, Vet, dan Test
Klausa paket yang salah pada file uji Go tetap lolos go build, go vet, dan go test setelah relokasi. Mekanisme pengenal impor dan cara menjaganya.
TL;DR: File uji yang pindah direktori masih pakai klausa package servicetype, bukan servicetype_test, tapi lolos go build, vet, dan test. Soalnya setelah pindah, larangan import cycle hilang, jadi impor senama jadi legal dan toolchain nggak protes. Moralnya: habis mindahin uji Go, cek baris pertama tiap file secara manual.
#go#golang#testing - 04.25testing
Menguji Rate Limiter Go Tanpa Menunggu Waktu Nyata
Memutar waktu di test Go lewat field Now yang bisa ditukar: rate limiter teruji tanpa sleep, plus kapan pindah ke testing/synctest.
TL;DR: Nunggu waktu nyata di test tuh lambat plus flaky, jadi jangan. Triknya gampang: tuker jamnya pake field func() time.Time, terus test tinggal majuin jam manual, tanpa time.Sleep. Kalau kode yang dites tidur sendiri atau punya goroutine, pake testing/synctest yang udah stabil di Go 1.25.
#go#testing#rate-limit - 03.44backend
Kapan Simbol Go Layak Diekspor
Migrasi test ke paket eksternal memaksa keputusan ekspor: tiga pintu antara tulis-ulang jalur publik, ekspor nyata, dan export_test.go.
TL;DR: Gak nyangka, mindahin test ke paket luar ternyata bisa jadi audit API gratis. Pas migrasi, fungsi internal yang minta diekspor justru nunjukin logika yang selama ini kependeman padahal berguna, kayak deteksi duplikat sama sanitasi XSS. Ada tiga jalan: tulis ulang test lewat jalur publik, ekspor beneran kalau emang bernilai, atau akalin pake export_test.go.
#go#api-design#testing - 03.22backend
Pindah Tempat Test, Coverage Malah Naik
Migrasi test ke pohon terpusat dengan paket _test Go memaksa rewrite lewat API publik, menghapus helper mati, dan coverage naik tanpa menyentuh kode produksi.
TL;DR: Gara-gara pindahin file test ke folder sentral, coverage malah naik, bukan stagnan. Kuncinya ganti deklarasi jadi package entityadmin_test, jadi test cuma bisa akses API publik dan kompilator yang jadi polisinya. Kalau internal memang wajib diuji, ada katup darurat export_test.go, jadi jangan harap sekadar git mv.
#go#testing#black-box-testing - 02.36testing
Coverage 0 Persen Padahal Semua Test Hijau
Menyusun ulang test ke pohon terpusat membuat coverage package terbaca 0 persen; satu flag -coverpkg pada mode coverage mengembalikan angkanya.
TL;DR: Test pindah ke folder terpusat bikin coverage Go jadi 0.0% padahal semua test lulus. Soalnya secara default tiap test cuma ngukur package-nya sendiri, bukan package lain yang dipanggil. Solusinya gampang, tinggal tambah flag -coverpkg=./internal/...
#go#coverage#testing - 01.00backend
Filter Status yang Tidak Dikenal Harus Ditolak, Bukan Diabaikan
Filter status yang nilainya tak dikenal sempat mengembalikan semua baris hidup dengan 200. Kini endpoint itu menolaknya dengan 400 VALIDATION.
TL;DR: Jadi ternyata API-nya nge-drop filter status kalau nilainya nggak dikenal, alias ngasih semua data dengan 200 OK, dan tesnya malah ngunci perilaku salah itu. Penulis ganti ke switch fail-closed: string kosong boleh (tab semua), nilai whitelist lolos, sisanya error ErrValidation jadi 400. Pelajarannya: tes hijau belum tentu kontraknya bener, sesekali baca ulang assertion yang aneh.
#golang#api#rest-api - 00.06backend
Koma yang Memotong Deskripsi: Parsing YAML di Balik Lint OpenAPI
Delapan dari sepuluh error lint OpenAPI bukan soal kontrak: koma tak berkurung di dalam flow mapping memotong deskripsi jadi entri null.
TL;DR: Error linting OpenAPI itu ternyata bukan contract drift, cuma koma di deskripsi YAML yang gak dikasih tanda kutip. Parser motong nilai di koma pertama, jadi deskripsi kepotong tanpa warning. Solusinya gampang, quote semua deskripsi, terus regenerate tipe buat mastiin hasilnya identik byte-per-byte.
#openapi#yaml#api