testing
Catatan teknis seputar web development, DevOps, dan integrasi AI.
54 artikel
- 13.06backend
Mesin Status Moderasi Ulasan: Validasi Transisi State Melalui Pengujian Integrasi
Uji integrasi membuktikan mesin status moderasi: seed agregat salah 9.9/999, Remove mengisi audit, Restore membersihkannya, agregat dihitung ulang dua arah.
TL;DR: Jadi sistem review ini punya mesin status: hapus review langsung ganti status jadi dihapus plus isi kolom audit, bukan cuma nunggu proses belakang. Batasannya ketat banget, alasan hapus cuma enam pilihan, rating harus 1-5, komentar maksimal 2000 karakter. Semua transisi diuji pakai table-driven test, makanya perilakunya dijamin konsisten, bukan sekadar asumsi.
#go#testing#mysql - 12.12testing
Assertion LIKE yang Licik: Saat Nomor 1 Kena Nomor 19
Pola LIKE atas JSON ter-serialisasi membuat assertion integration test melenceng: nomor 1 tertukar nomor 19 karena collision substring.
TL;DR: Test assertion pakai LIKE '%"no":1%' buat nyari JSON, eh taunya nyangkut ke objek nomor 19 gara-gara 16 dan 19 sama-sama diawali "no":1. Jadi flake-nya murni soal substring dan urutan data, bukan race condition. Solusinya bandingin nilai hasil parsing atau pakai JSON_SEARCH, jangan LIKE buat predikat identitas.
#testing#mysql#flaky-tests - 11.59testing
Test Karakterisasi: Mencatat Perilaku, Bukan Menghakimi
Test karakterisasi mengunci perilaku kode apa adanya saat keputusan pemilik produk belum jatuh, lengkap dengan marker pending.
TL;DR: Test karakterisasi tujuannya bukan mastiin kode bener, tapi ngunci perilaku yang sekarang terjadi. Jadi assertion gagal artinya ada yang berubah, bukan rusak. Pas keputusan owner masih pending, test ini jadi pagar biar nggak ada yang ubah perilaku diam-diam.
#testing#characterization-testing#refactoring - 11.24backend
Kontrak Repositori di Garisan SQL
Uji integrasi mengunci kontrak repositori di batas SQL: pemetaan error 1062, visibilitas soft delete, clamp paginasi, dan pelajaran parameter marker MySQL.
TL;DR: Awalnya nulis fungsi seed data, karena binding SQL expression buat deleted_at, kuerinya gagal diam-diam tanpa error. Ternyata placeholder prepared statement cuma nampung nilai data, bukan ekspresi SQL, jadi solusinya pecah jadi dua cabang query dan panggil fungsi waktu langsung. Sekarang kontrak repo dikunci pake uji integrasi MySQL beneran, termasuk mapping error 1062 ke ErrSlugTaken pake errors.Is.
#go#testing#mysql - 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 - 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