Empat Sumber Konfigurasi & Urutan Prioritasnya
k6 membaca konfigurasi dari beberapa tempat. Bila nilainya bertabrakan, yang lebih ke bawah menang:
- Nilai bawaan k6
- Berkas konfigurasi (
--config config.json) - Objek
export const optionsdi dalam skrip - Variabel lingkungan (
K6_VUS=10) - Flag CLI (
--vus 10) — prioritas tertinggi
Anda menulis options yang benar untuk kondisi produksi, lalu di pipeline CI tinggal menimpanya dengan --vus 1 --iterations 1 untuk smoke test cepat — tanpa mengubah satu baris kode pun. Kode tes Anda tetap satu sumber kebenaran.
Mengatur Beban: Dua Cara Dasar
// Cara 1 — beban tetap
export const options = {
vus: 50,
duration: '5m',
};
// Cara 2 — beban bertahap (stages), jauh lebih realistis
export const options = {
stages: [
{ duration: '2m', target: 100 }, // naik perlahan 0 -> 100 VU
{ duration: '5m', target: 100 }, // tahan di 100 VU (fase pengukuran)
{ duration: '2m', target: 200 }, // naik lagi ke 200 VU
{ duration: '5m', target: 200 }, // tahan
{ duration: '2m', target: 0 }, // turun perlahan (graceful ramp-down)
],
};
// Cara 3 — jumlah iterasi tetap (bukan durasi)
export const options = {
vus: 10,
iterations: 1000, // total 1000 iterasi dibagi ke 10 VU
};Langsung melompat dari 0 ke 500 VU (vus: 500) menciptakan thundering herd: connection pool kosong, cache dingin, autoscaler belum bereaksi. Anda akan melihat lonjakan error di detik-detik awal yang bukan gambaran perilaku sistem sebenarnya.
Kecuali memang sedang melakukan spike test — di situ lonjakan mendadak justru tujuannya.
Opsi Produksi yang Wajib Diketahui
export const options = {
// ── Beban ──
stages: [ /* … */ ],
// ── Kriteria lulus ──
thresholds: { http_req_duration: ['p(95)<500'] },
// ── Performa generator ──
discardResponseBodies: true, // hemat memori drastis bila body tak dibaca
noConnectionReuse: false, // true = tutup koneksi tiap request (lebih berat)
noVUConnectionReuse: false, // true = tiap iterasi pakai koneksi baru
batchPerHost: 6, // maksimal request paralel per host (mirip browser)
// ── Jaringan ──
insecureSkipTLSVerify: true, // hanya untuk staging bersertifikat self-signed
userAgent: 'k6-loadtest/1.0 (kontak: [email protected])',
dns: { ttl: '1m', select: 'roundRobin', policy: 'preferIPv4' },
hosts: { 'api.contoh.id': '10.0.0.5' }, // paksa resolusi (bypass DNS/LB)
// ── Perilaku tes ──
setupTimeout: '60s',
teardownTimeout: '60s',
maxRedirects: 5,
throw: false, // true = error HTTP jadi exception JS
// ── Tag global untuk semua metrik ──
tags: { environment: 'staging', tim: 'checkout', build: __ENV.BUILD_ID || 'lokal' },
// ── Ringkasan ──
summaryTrendStats: ['avg', 'min', 'med', 'p(90)', 'p(95)', 'p(99)', 'max'],
};Variabel Lingkungan dengan __ENV
// Dipanggil: k6 run -e ENV=staging -e VUS=100 skrip.js
const BASE = __ENV.BASE_URL || 'http://localhost:3000';
const VUS = parseInt(__ENV.VUS || '10', 10);
export const options = {
vus: VUS,
duration: __ENV.DURATION || '30s',
};Skrip tes masuk ke Git dan bisa dibaca siapa saja di organisasi Anda. Password, API key, dan token wajib lewat variabel lingkungan atau secret manager CI:
const password = __ENV.TEST_PASSWORD;
if (!password) throw new Error('TEST_PASSWORD belum diset');Dan pastikan CI Anda me-mask nilai secret di log. Jangan pernah console.log(token).
Berkas Konfigurasi Terpisah
{
"vus": 50,
"duration": "10m",
"thresholds": {
"http_req_duration": ["p(95)<500"],
"http_req_failed": ["rate<0.01"]
},
"summaryTrendStats": ["avg", "p(95)", "p(99)", "max"]
}k6 run --config k6.config.json skrip.js