Kodeloka
  1. Kodeloka
  2. Kelas k6
  3. Materi

Modul 6 · Modul 6 dari 15

Options & Konfigurasi: VU, Stages, Env, Urutan Prioritas

Semua cara mengatur perilaku tes, urutan prioritas antar sumber konfigurasi, dan opsi produksi yang wajib Anda tahu.

Empat Sumber Konfigurasi & Urutan Prioritasnya

k6 membaca konfigurasi dari beberapa tempat. Bila nilainya bertabrakan, yang lebih ke bawah menang:

  1. Nilai bawaan k6
  2. Berkas konfigurasi (--config config.json)
  3. Objek export const options di dalam skrip
  4. Variabel lingkungan (K6_VUS=10)
  5. Flag CLI (--vus 10) — prioritas tertinggi
💡 Kenapa urutan ini penting

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

beban.jsjavascript
// 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
};
⚠️ Selalu sediakan fase ramp-up dan ramp-down

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

options-lengkap.jsjavascript
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

env.jsjavascript
// 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',
};
⛔ Jangan taruh kredensial di dalam skrip

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:

javascript
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

k6.config.jsonjson
{
  "vus": 50,
  "duration": "10m",
  "thresholds": {
    "http_req_duration": ["p(95)<500"],
    "http_req_failed": ["rate<0.01"]
  },
  "summaryTrendStats": ["avg", "p(95)", "p(99)", "max"]
}
bash
k6 run --config k6.config.json skrip.js