Tiga Konsep yang Sering Tertukar
| Konsep | Gunanya | Menggagalkan tes? |
|---|---|---|
check() | Memverifikasi satu kondisi, mencatat rasio benar/salah | TIDAK |
group() | Mengelompokkan langkah agar laporan terbaca | Tidak |
thresholds | Menetapkan kriteria lulus atas sebuah metrik | YA — exit code 99 |
Menulis puluhan check() lalu mengira pipeline CI akan merah bila ada yang gagal. Tidak akan. k6 tetap keluar dengan exit code 0 meskipun 100% check gagal. Satu-satunya cara membuat tes benar-benar gagal adalah thresholds.
Karena itu, hampir setiap proyek yang serius menambahkan threshold pada metrik checks itu sendiri:
thresholds: { checks: ['rate>0.99'] }check() — Verifikasi Tanpa Menghentikan
import { check } from 'k6';
const res = http.get(url);
const berhasil = check(res, {
'status 200': (r) => r.status === 200,
'respons < 500ms': (r) => r.timings.duration < 500,
'body ada isinya': (r) => r.body.length > 0,
'field id ada': (r) => r.json('id') !== undefined,
});
// check() mengembalikan boolean -> bisa dipakai untuk logika lanjutan
if (!berhasil) {
console.error('Request gagal: ' + res.status + ' ' + res.body.slice(0, 200));
return; // hentikan iterasi ini, jangan lanjut ke langkah berikutnya
}group() — Struktur Laporan
Group membungkus beberapa langkah menjadi satu unit yang muncul terpisah di laporan, dan otomatis menambahkan tag group pada semua metrik di dalamnya.
group('Alur Checkout', function () {
group('01 Tambah ke keranjang', function () { /* … */ });
group('02 Isi alamat', function () { /* … */ });
group('03 Bayar', function () { /* … */ });
});
// Threshold bisa menyasar group tertentu:
thresholds: {
'http_req_duration{group:::Alur Checkout::03 Bayar}': ['p(95)<2000'],
}::Group bersarang dipisahkan dengan dua titik dua, dan diawali ::. Salah satu titik dua saja membuat threshold tidak pernah cocok — dan yang berbahaya, k6 tidak memberi peringatan; threshold itu hanya diam saja tidak pernah dievaluasi.
thresholds — SLO sebagai Kode
export const options = {
thresholds: {
// Latency
http_req_duration: ['p(95)<500', 'p(99)<1500', 'max<5000'],
// Hanya request yang dianggap "berhasil" — lebih adil
'http_req_duration{expected_response:true}': ['p(95)<400'],
// Error rate
http_req_failed: ['rate<0.01'], // < 1% gagal
// Rasio check yang lulus
checks: ['rate>0.99'],
// Throughput minimum
http_reqs: ['count>1000', 'rate>50'],
// Per endpoint (memakai tag name)
'http_req_duration{name:Login}': ['p(95)<800'],
'http_req_duration{name:Checkout}': ['p(95)<2000'],
// Metrik kustom
waktu_checkout: ['p(95)<3000'],
// Hentikan tes SEGERA bila sistem jelas sudah rusak
'http_req_failed{scenario:beban_utama}': [
{ threshold: 'rate<0.25', abortOnFail: true, delayAbortEval: '30s' },
],
},
};Agregasi yang Tersedia
| Tipe metrik | Agregasi |
|---|---|
| Counter | count, rate |
| Gauge | value |
| Rate | rate |
| Trend | avg, min, med, max, p(N) |
Exit Code — Bahasa yang Dimengerti CI/CD
| Exit code | Arti |
|---|---|
0 | Tes selesai, semua threshold lulus |
99 | Tes selesai tetapi ada threshold yang gagal |
104 | Tes dihentikan oleh abortOnFail |
107 | Error saat menjalankan skrip (sintaks, dsb.) |
Inilah alasan k6 mudah sekali dipasang di pipeline: cukup jalankan perintahnya, dan CI otomatis merah bila SLO dilanggar.