Ketika Semua Fungsi Lulus, tetapi Stok Tetap Salah
Insiden STOK-SINK-01
TokoLancar adalah aplikasi kasir dan stok yang digunakan sebuah toko kelontong. Pada suatu pagi, stok awal produk BERAS-5KG tercatat 60 karung. Pukul 09.10, Kasir A menjual 3 karung ketika koneksi jaringan terputus. Aplikasi menyimpan transaksi itu untuk dikirim setelah jaringan pulih. Pukul 09.12, Kasir B menjual 4 karung melalui perangkat lain yang tetap terhubung.
Saat jaringan Kasir A pulih, transaksi tertunda dikirim. Karena respons pertama dari layanan stok terlambat, aplikasi Kasir A mengirim ulang permintaan yang sama. Layanan stok memproses kedua kiriman sebagai dua transaksi berbeda. Penjualan yang benar berjumlah 7 karung, sehingga stok fisik tersisa 53 karung. Namun, aplikasi mengurangi 3 karung dua kali dan menampilkan stok 50 karung.
Kesalahan baru terlihat ketika petugas menutup toko. Laporan penjualan menunjukkan 7 karung terjual, sedangkan catatan stok seolah-olah menunjukkan 10 karung keluar. Selisih 3 karung memicu pemeriksaan rak, struk, dan riwayat transaksi. Toko tidak kehilangan barang, tetapi petugas menghabiskan waktu untuk mencari kehilangan yang sebenarnya tidak terjadi.
Mengapa pengujian fungsi tunggal tidak cukup
Fungsi pengurangan stok telah diuji secara terpisah. Jika diberi stok 60 dan jumlah penjualan 3, fungsi menghasilkan 57. Jika diberi stok 57 dan penjualan 4, fungsi menghasilkan 53. Kedua hasil itu benar. Masalahnya bukan terletak pada operasi pengurangan, melainkan pada hubungan antara pengiriman ulang transaksi dan layanan stok.
Insiden ini memperlihatkan bahwa keberhasilan bagian-bagian kecil tidak otomatis menjamin keberhasilan kerja bersama. Setiap bagian dapat menjalankan tugasnya sesuai masukan yang diterima, tetapi masukan itu sendiri mungkin dikirim dua kali, berubah bentuk, datang dengan urutan tidak terduga, atau tidak memperoleh penanganan yang aman.
Pengujian juga tidak berhenti ketika hubungan dua komponen sudah benar. Produk dapat gagal saat seluruh alur dijalankan dalam lingkungan yang menyerupai penggunaan sebenarnya. Konfigurasi perangkat, hak akses, pemulihan koneksi, basis data, dan proses latar belakang dapat menimbulkan perilaku yang tidak terlihat dalam pengujian komponen.
Di atas itu, sistem yang secara teknis berjalan masih dapat ditolak oleh pemilik usaha. Misalnya, aplikasi mungkin menghitung stok secara benar tetapi tidak menyediakan jejak koreksi yang dibutuhkan petugas. Pertanyaan pada tahap ini bukan hanya apakah perangkat lunak bekerja, melainkan apakah hasilnya layak dipakai untuk menjalankan kegiatan usaha.
Empat lapis perlindungan
Empat jenjang pengujian membentuk jaring bertingkat. Pengujian unit memeriksa bagian kode yang kecil. Pengujian integrasi memeriksa kerja sama antarkomponen. Pengujian sistem memeriksa perilaku produk sebagai suatu sistem. Pengujian penerimaan menilai kesesuaian hasil dengan kebutuhan dan kriteria pihak yang akan menerima atau memakai produk.
Keempatnya bukan empat kegiatan yang saling menggantikan. Sebuah cacat dapat lolos dari satu lapis dan tertangkap pada lapis berikutnya, tetapi penemuan yang lebih lambat biasanya melibatkan jalur diagnosis yang lebih luas. Ini merupakan kecenderungan, bukan hukum mutlak. Cacat konfigurasi tertentu justru hanya bermakna pada lingkungan sistem, sedangkan ketidaksesuaian kebutuhan baru dapat terlihat ketika pihak bisnis menilai hasilnya.
Untuk STOK-SINK-01, pengujian unit terhadap operasi pengurangan memang berguna, tetapi tidak membuktikan keamanan pengiriman ulang. Pemeriksaan yang paling langsung seharusnya dilakukan ketika Kasir dan layanan stok dihubungkan: kirim transaksi yang sama dua kali dengan identitas yang sama, lalu pastikan stok hanya berkurang sekali. Pengujian sistem dengan skenario koneksi terputus dan pulih menjadi lapis tambahan. Pengujian penerimaan kemudian memastikan bahwa perilaku pemulihan dan jejak transaksinya memenuhi kebutuhan operasional toko.
Sepanjang modul ini, kita akan memakai insiden tersebut untuk belajar memilih jenjang berdasarkan tempat risiko muncul. Sasaran akhirnya bukan memberi setiap cacat sebuah label, melainkan merumuskan pengujian yang menjalankan bagian yang relevan dan menghasilkan bukti yang dapat dinilai.