Kodeloka
  1. Kodeloka
  2. Kelas k6
  3. Materi

Modul 7 · Modul 7 dari 15

Data Uji: SharedArray, CSV, dan Data Unik per VU

Memuat ribuan baris data uji tanpa meledakkan memori, membagi data agar tiap VU unik, dan menghindari cache palsu.

Kenapa Data Uji Menentukan Validitas Hasil

Bila 500 VU Anda semuanya login sebagai [email protected] dan mencari produk yang sama, maka setelah request pertama semuanya akan dilayani dari cache. Anda akan mendapat p95 = 12 ms dan menyimpulkan sistem sangat cepat — padahal Anda baru saja menguji Redis, bukan aplikasi Anda.

⛔ Gejala klasik data uji yang buruk
  • Latency jauh lebih rendah dari produksi → semua kena cache.
  • Banyak error 409 Conflict / deadlock → semua VU menulis ke baris database yang sama.
  • Hasil tes berubah drastis antar-run tanpa perubahan kode → data uji habis atau tercemar.

SharedArray — Satu Salinan untuk Semua VU

Ini struktur data terpenting di k6. Tanpa SharedArray, setiap VU memegang salinan datanya sendiri.

❌ 300 VU × 50 MB = 15 GB RAM
javascript
// Array biasa: DISALIN ke setiap VU
const users = JSON.parse(open('./users.json'));
✅ 50 MB total, apa pun jumlah VU
javascript
import { SharedArray } from 'k6/data';

const users = new SharedArray('users', function () {
  return JSON.parse(open('./users.json'));
});
⚠️ Aturan main SharedArray
  • Harus dideklarasikan di init context (level modul).
  • Isinya read-only. Mengubah elemennya tidak akan terlihat oleh VU lain dan bisa menimbulkan bug halus.
  • Hanya boleh berisi array. Bukan object, bukan Map.
  • Nama (argumen pertama) harus unik dalam satu skrip.

Empat Strategi Membagi Data

strategi-data.jsjavascript
import exec from 'k6/execution';

// 1. ACAK — paling sederhana, tapi bisa ada tabrakan antar-VU
const u1 = users[Math.floor(Math.random() * users.length)];

// 2. UNIK PER VU — tiap VU memakai akun tetap yang berbeda
//    Cocok untuk data yang tidak boleh dipakai bersamaan (misal keranjang belanja)
const u2 = users[(exec.vu.idInTest - 1) % users.length];

// 3. UNIK PER ITERASI — tiap iterasi memakai baris baru, tidak pernah berulang
//    Cocok untuk data sekali pakai (kode voucher, nomor invoice)
const u3 = users[exec.scenario.iterationInTest % users.length];

// 4. BERBASIS WAKTU — untuk membuat data yang selalu baru
const emailBaru = 'uji_' + Date.now() + '_' + exec.vu.idInTest + '@contoh.id';

Membaca CSV

k6 tidak punya parser CSV bawaan yang stabil di semua versi. Cara paling aman dan portabel adalah memakai pustaka papaparse dari jslib:

csv.jsjavascript
import { SharedArray } from 'k6/data';
import papaparse from 'https://jslib.k6.io/papaparse/5.1.1/index.js';

const users = new SharedArray('users', function () {
  // header: true -> baris pertama jadi nama kolom
  return papaparse.parse(open('./data/users.csv'), { header: true }).data;
});

export default function () {
  const u = users[exec.vu.idInTest % users.length];
  http.post(BASE + '/login', JSON.stringify({
    email: u.email, password: u.password,
  }), { headers: { 'Content-Type': 'application/json' } });
}

Pustaka Bantu dari jslib.k6.io

jslib.jsjavascript
import { randomIntBetween, randomItem, randomString, uuidv4 }
  from 'https://jslib.k6.io/k6-utils/1.4.0/index.js';

randomIntBetween(1, 100);          // bilangan acak
randomItem(['a', 'b', 'c']);       // elemen acak dari array
randomString(10);                  // string acak 10 karakter
uuidv4();                          // UUID unik, bagus untuk idempotency key
⚠️ Impor dari URL diunduh saat runtime

Bila mesin CI Anda tidak punya akses internet, impor dari jslib.k6.io akan gagal dan seluruh tes batal. Untuk lingkungan tertutup, unduh berkasnya dan simpan di repositori (vendoring), lalu impor secara lokal.