Saat pengujian form gagal, reaksi pertama hampir selalu memeriksa kode validasi: mencurigai regex yang salah tulis, aturan yang sudah kedaluwarsa, atau perubahan yang belum ikut terdeploy. Namun pada cukup banyak kasus kodenya justru sudah benar. Yang bertentangan adalah datanya sendiri: kota tidak berada di wilayah administratif yang tercantum, panjang kode pos tidak sesuai aturan negara itu, atau awalan nomor ponsel jatuh di rentang yang belum dialokasikan. Fungsi validasi hanya menolak data seperti itu dengan setia, dan tidak ada satu baris pun di sisi kode yang perlu diperbaiki.
Halaman ini membahas kolom-kolom yang saling mengikat pada data uji identitas: dari mana ketidakkonsistenan muncul, bagaimana mengenalinya sebelum masuk ke pipeline, dan bagaimana memperbaikinya di sumbernya alih-alih menambal satu baris setiap kali ada kegagalan. Seluruh data yang dibahas bersifat sintetis. Dibuat oleh program, meniru format dokumen resmi, dan pada negara yang algoritma pemeriksaannya sudah diterapkan, digit pemeriksanya benar-benar lolos verifikasi. Data itu tidak menunjuk orang, alamat, atau rekening mana pun. Tujuannya menguji perangkat lunak, bukan memalsukan identitas atau melewati verifikasi.
Mengapa validasi form gagal padahal kodenya sudah benar?
Bentuknya cukup khas. API mengembalikan pesan bahwa provinsi, kota, dan kecamatan tidak cocok, lalu waktu habis dipakai untuk menyetel logika wilayah bertingkat tanpa hasil. Padahal masalahnya ada di data: kolom kota berisi satu kota, sementara kolom provinsi berisi provinsi yang sama sekali berbeda. Logika wilayah apa pun yang ditulis dengan benar akan menolak pasangan itu, karena pasangan itu memang tidak sah.
Gejala kedua adalah kasus uji yang lolos di laptop pengembang tetapi gagal di CI. Di lokal, fixtur dirawat manual; di CI, data dibuat ulang oleh skrip generator. Keduanya hanya berbeda satu kolom, dan kolom itulah yang menentukan hasil akhirnya. Ketika waktu dihabiskan untuk membandingkan versi kode, penyebab yang sebenarnya sudah ada di berkas data sejak awal.
Gejala ketiga lebih senyap lagi: validasi lolos, tetapi angka pada laporan agregat per wilayah tidak cocok. Artinya data itu belum sampai saling bertentangan, hanya tidak konsisten. Misalnya kode pos milik sebuah kota, sementara kolom wilayah administratif diisi provinsi tetangga. Setiap kolom sah jika diperiksa sendiri, tetapi kombinasinya tidak pernah ada di dunia nyata, sehingga laporan per wilayah menghitungnya ke tempat yang salah.
Gejala yang menunjuk ke arah data, bukan ke kode
Ada beberapa tanda yang layak dikenali lebih dulu sebelum menyentuh kode. Semuanya murah diperiksa dan menghemat waktu debugging yang panjang.
- Pesan galat menyebut dua bidang sekaligus, misalnya wilayah dan kota, atau tanggal lahir dan nomor identitas.
- Satu kasus uji lolos di satu mesin dan gagal di mesin lain tanpa perubahan kode di antaranya.
- Jumlah baris hasil validasi berubah setiap kali data dibuat ulang, padahal aturannya tidak berubah.
- Perbaikan satu kolom memunculkan kegagalan baru di kolom lain di baris yang sama.
Bila beberapa tanda itu muncul bersamaan, urutan yang paling hemat waktu adalah memastikan dulu semua lingkungan memakai berkas data yang sama, baru mencurigai kode. Masalah seperti ini biasanya hilang dengan sendirinya setelah data yang dipakai disamakan.
Dari mana ketidakkonsistenan berasal
Akar pertama adalah pembuatan per kolom. Ketika memakai pustaka pembuat data generik, kota diambil dari satu kumpulan nilai, wilayah administratif dari kumpulan lain, dan kode pos dirakit dari karakter acak di kumpulan ketiga. Skrip generatornya tidak salah; ia hanya tidak tahu bahwa di domain Anda kolom-kolom itu saling mengikat.
Akar kedua adalah penyuntingan manual. Untuk menyusun skenario batas, seseorang mengubah kota di fixtur menjadi daerah terpencil, tetapi lupa menyesuaikan kode pos dan kode area. Perubahan seperti ini sulit terlihat dalam tinjauan kode, karena diff-nya tampak wajar dan perubahannya memang masuk akal kalau dibaca satu per satu.
Akar ketiga adalah penggabungan data. Menggabungkan dua sumber berdasarkan nomor baris, atau mengacak lalu mengurutkan ulang berdasarkan satu kolom, memutus keterkaitan antar-kolom. Kasus ini paling sulit dilacak karena setiap kolom, jika diperiksa terpisah, tetap terlihat sah.
Empat pasangan kolom yang paling sering bertentangan
Tidak semua kombinasi perlu diperiksa. Empat pasangan berikut menutup sebagian besar kegagalan yang muncul sebagai pesan galat yang membingungkan.
| Pasangan kolom | Bentuk konflik yang umum | Cara memeriksanya |
|---|---|---|
| Wilayah administratif dengan kota | Kota tidak berada di wilayah yang tercantum, atau namanya milik negara lain | Bandingkan dengan daftar kota milik wilayah itu |
| Kode pos dengan kota | Jumlah digit benar, tetapi kode itu milik wilayah lain | Telusuri wilayah dari kode pos lalu bandingkan |
| Nomor ponsel dengan rentang nomor | Awalan tidak berada di rentang yang dialokasikan | Cocokkan awalan dengan rentang yang sah |
| Nomor identitas dengan tanggal lahir | Tanggal di dalam nomor berbeda dari kolom tanggal lahir | Hitung ulang digit pemeriksa dan tanggal terkode |
Pasangan pertama adalah wilayah administratif dan kota. Provinsi, negara bagian, prefektur, serta kota dan kabupaten berada dalam hubungan induk-anak. Konfliknya muncul dalam dua bentuk: kota tidak berada di wilayah yang tercantum, atau nama kotanya memang tidak ada di negara itu.
Pasangan kedua adalah kode pos dan kota. Aturan kode pos berbeda jauh antarnegara: ada yang panjangnya tetap dan seluruhnya angka, ada yang memuat huruf, dan ada yang panjangnya berupa rentang. Kode pos acak dengan jumlah digit yang benar terlihat mulus, tetapi wilayah nyata yang diwakilinya bisa melintasi beberapa wilayah administratif sekaligus. Begitu ada fitur yang menelusuri wilayah dari kode pos, data seperti ini pasti terungkap.
Pasangan ketiga adalah nomor ponsel dan rentang nomor. Beberapa digit pertama nomor ponsel umumnya menandai operator atau rentang yang dialokasikan. Nomor acak mudah jatuh di rentang yang belum dialokasikan, atau panjangnya benar tetapi awalannya tidak sah. Data seperti ini lolos di sistem yang hanya memeriksa panjang, tetapi ditolak di sistem yang ikut memeriksa kepemilikan nomor.
Pasangan keempat adalah nomor identitas dengan tanggal lahir dan jenis kelamin. Nomor identitas di banyak negara mengodekan tanggal lahir, dan sebagian juga mengodekan jenis kelamin. Jika nama, tanggal lahir, dan nomor identitas dibuat terpisah, muncul kombinasi seperti tanggal di dalam nomor identitas jatuh pada bulan Maret sementara kolom tanggal lahir berisi bulan Agustus. Negara dengan pemeriksaan ketat langsung menolaknya; negara dengan pemeriksaan longgar memasukkannya ke basis data, dan ketidakcocokannya baru terlihat saat rekonsiliasi.
Bagaimana cara memeriksa konsistensi antar-kolom?
Pendeteksiannya tidak memerlukan pengetahuan bisnis. Sebagian besar masalah bisa disaring murni pada tingkat format, dengan menjalankan pemeriksaan lintas kolom baris per baris pada sekumpulan data.
- Apakah kota benar-benar berada di wilayah administratif tingkat pertama yang tercantum.
- Apakah jumlah digit dan himpunan karakter kode pos sesuai aturan negara tersebut.
- Apakah jumlah digit nomor ponsel setelah kode negara dilepas sah, dan apakah awalannya berada dalam rentang yang telah dialokasikan.
- Apakah digit pemeriksa nomor identitas lolos, dan apakah tanggal yang terkode di dalamnya cocok dengan kolom tanggal lahir.
- Apakah nilai yang dihitung, seperti usia, bisa diturunkan ulang dari tanggal lahir di baris yang sama.
Pintu masuk yang paling hemat waktu adalah menjalankan sekumpulan data yang sama melewati alat validator dari arah sebaliknya. Aturan yang dipakai saat membuat data adalah aturan yang sama yang harus diverifikasi, dengan algoritma yang sama di kedua sisi, sehingga hasilnya bisa dibandingkan secara langsung.
Bagaimana cara memperbaiki akar masalahnya?
Penanganan sementara adalah mengubah satu baris setiap kali ada kegagalan, tetapi cara itu berarti masalah yang sama terulang setiap kali data baru dibuat. Perbaikan yang menyentuh akarnya adalah membuat kolom-kolom yang saling mengikat berasal dari satu sumber data. Satu record membawa wilayah administratif, kota, dan kode pos sekaligus, bukan tiga kolom yang dibuat terpisah.
Pendekatan itu yang dipakai oleh alat pembuat alamat: ubah kota pada satu record, dan wilayah administratif beserta kode posnya ikut berubah. Cara berpikir yang sama berlaku untuk identitas, karena generator data identitas menyusun nama, tanggal lahir, alamat, dan nomor dokumen dari satu negara yang sama, sehingga pasangan antar-kolom tidak bisa terpisah.
Jika sumber datanya tidak bisa diubah, langkah mundurnya adalah menambahkan pemeriksaan mandiri setelah data dibuat: buang baris yang tidak konsisten dan catat jumlahnya. Cara ini tidak memperbaiki sumbernya, tetapi setidaknya menjaga agar baris yang bertentangan tidak mengalir ke kasus uji dan menghabiskan waktu tim di tahap berikutnya.
Perlu diingat bahwa memperbaiki konsistensi tidak sama dengan memakai data orang sungguhan. Data sintetis tetap pilihan yang tepat untuk pengujian, asalkan format dan aturan digit pemeriksanya benar.
Daftar periksa singkat
Sebelum sekumpulan data uji dipakai, ada beberapa hal yang layak dipastikan lebih dulu.
- Setiap kolom yang saling mengikat berasal dari satu sumber, bukan dari tiga kumpulan nilai yang berbeda.
- Setiap perubahan manual pada satu kolom sudah diikuti penyesuaian pada kolom yang terkait.
- Tidak ada penggabungan atau pengurutan ulang yang memutus keterkaitan antar-kolom.
- Baris yang tidak lolos pemeriksaan lintas kolom dicatat dan dibuang, bukan dibiarkan masuk.
- Aturan validasi yang dipakai untuk membuat data sama dengan aturan yang dipakai untuk memeriksanya.
- Berkas data yang dipakai lokal dan di CI berasal dari sumber yang sama.
Bila daftar ini dijalankan setiap kali data uji diperbarui, sebagian besar kegagalan form yang tampak misterius akan hilang sebelum sampai ke CI.
Apakah validasi yang lolos berarti data sudah konsisten?
Tidak. Banyak form hanya memeriksa format: jumlah digit benar dan himpunan karakter benar, sudah dianggap lolos. Hubungan antar-kolom biasanya di luar cakupan pemeriksaan semacam itu, terutama hal seperti kota ini masuk wilayah administratif mana, yang memerlukan data referensi. Untuk memastikan konsistensi, pemeriksaan lintas kolom harus dijadwalkan sebagai langkah tersendiri, bukan diharapkan muncul sendiri dari validasi form.
Bisakah data nyata menghindari masalah ini?
Data produksi yang nyata konsisten dengan sendirinya karena ia produk dunia nyata. Namun ia membawa dua masalah baru: penyamaran data dan hak akses. Distribusi sampelnya juga tidak merata, sehingga beberapa kombinasi batas bisa saja tidak terwakili sama sekali. Pendekatan yang lebih praktis adalah memakai data nyata sebagai sampel untuk menemukan kasus batas, lalu menuliskan kasus-kasus itu ke dalam aturan data sintetis yang bisa dibuat ulang kapan saja.
Nomor identitas negara mana yang layak diuji lebih dulu?
Mulailah dari negara yang nomor identitasnya memuat digit pemeriksa, misalnya Brasil, Spanyol, Turki, Meksiko, dan Chile. Nomor seperti itu mengodekan informasi pemeriksaan, sehingga begitu kolomnya dirakit asal-asalan, digit pemeriksanya hampir pasti tidak cocok dan masalahnya langsung terlihat alih-alih mengendap sampai produksi. Negara yang hanya punya syarat format tanpa algoritma pemeriksaan publik perlu dinilai dari jumlah digit, pengelompokan, dan himpunan karakternya. Daftar negara beserta data yang tersedia bisa dilihat di direktori negara, dan contoh pemeriksaan yang lebih rinci ada di catatan yang harus selaras.
Langkah berikutnya
Ambil satu berkas data uji yang sekarang dipakai, lalu jalankan dua langkah kecil. Pertama, periksa apakah setiap kolom yang saling mengikat berasal dari satu record atau dari beberapa kumpulan nilai yang berbeda. Kedua, jalankan pemeriksaan lintas kolom di atas dan catat berapa baris yang gugur. Bila jumlahnya lebih dari satu atau dua, perbaikan di sumber data biasanya lebih murah daripada menambal setiap kegagalan satu per satu.
Setelah itu, susun ulang datanya dengan generator data identitas dan simpan hasilnya sebagai berkas acuan. Agar baris yang sudah bersih tidak bertabrakan dengan data lain saat pengujian berjalan, cara menyimpan dan memakai ulang berkas seperti itu diuraikan pada fixtur data identitas.