Tutorial K6 API Load Test

Fadhila Rizki Anindita
9 min readJun 7, 2023

A. Apa itu Load Test?

Load test adalah salah satu jenis pengujian non fungsional yang berguna untuk memastikan suatu API atau UI pada software tetap berfungsi dengan baik saat di akses oleh ribuan user dalam waktu tertentu. Sebagai contoh website penyedia tiket konser tetap berfungsi dengan baik saat di akses oleh lima belas ribu user dalam waktu satu menit.

B. Apa itu K6?

Grafana K6 adalah open source load test yang membuat load test menjadi mudah, yang ditulis dengan bahasa pemrograman javascript. K6 gratis, developer-centric, and extensible. Dengan menggunakan K6, dapat menguji keandalan dan kinerja sistem, dan mengetahui regresi dan masalah kinerja lebih awal. K6 akan membantu membangun aplikasi yang tangguh dan berperforma tinggi yang dapat diskalakan.

C. Installation

K6 dapat di jalankan pada berbagai operation system seperti Mac, Windows, and Linux. Untuk info lebih lengkap mengenai install dan download, dapat mengunjungi https://k6.io/docs/get-started/installation/

D.K6 Sebagai Load API Test

Setelah selesai install atau download K6, sekarang kita memulai dengan API Test terlebih dahulu. Untuk mengetahui lebih lengkapnya mengenai API Test dapat mengunjungi artikel saya di https://medium.com/@fadhilara/api-testing-b6c640ba2763. Kali ini kita akan API load test https://jsonplaceholder.typicode.com/users, dengan method get, post, put & delete. Silahkan buka text editor favorit kalian.

Copy paste code berikut untuk import K6 & function check

import http from 'k6/http';
import { check } from "k6";

I. Load test vus & duration (scenario 1)

export const options = {
vus: 800,
duration: '120s',


thresholds: {
http_req_failed: ['rate<0.001'], // the error rate must be lower than 0.1%
http_req_duration: ['p(90)<2000'], // 90% of requests must complete below 2000ms
http_req_receiving: ['max<17000'], // max receive request below 17000ms
},
};

Vus : virtual users, simulasi berapa user yang mengakses suatu URL

Duration : berapa lama waktu mengakses suatu URL

p(90) : 90% dari request. P singkatan dari percentile

p(95) : 95% dari request

http_req_failed : request http yang gagal

http_req_duration : durasi request http

http_req_receiving : request http yang di terima

Thresholds : kriteria yang ditetapkan (expected result) untuk metrik pengujian, terdiri dari :

1. Rate dari http_req_failed harus bernilai kurang dari 0.001 atau 0.1%

2. 90% request dari http_req_duration harus bernilai kurang dari 2000 millisecond

3. Slowest request dari http_req_receiving harus selesai dalam 17000 millisecond

II. Load test stages (scenario 2)

export const options = {
stages: [
{ duration: '0.3m', target: 500 }, // simulate ramp-up of traffic from 1 to 500 users over 0.3 minute
{ duration: '0.4m', target: 500 }, // stay at 500 users for 0.4 minute
{ duration: '0.6m', target: 1000 }, // simulate ramp-up of traffic from 500 to 1000 users over 0.6 minute
{ duration: '1m', target: 2000 }, // simulate ramp-up to 2000 users over 1 minute
{ duration: '1.4m', target: 0 }, // simulate ramp-down to 0 users over 1.4 minute
],
thresholds: {
http_req_failed: ['rate<0.001'], // the error rate must be lower than 0.1%
http_req_duration: ['p(90)<1800'], // 90% of requests must complete below 1800ms
http_req_receiving: ['max<6000'], // max receive request below 6000ms
},
};

Stage : tahap dalam melakukan load test

Target : jumlah user yang mengakses suatu URL. Target sama dengan Vus

Thresholds terdiri dari :

1. Rate dari http_req_failed harus bernilai kurang dari 0.001 atau 0.1%

2. 90% request dari http_req_duration harus bernilai kurang dari 1800 millisecond

3. Slowest request dari http_req_receiving harus selesai dalam 6000 millisecond

III. Load test iteration, start time, graceful stop (scenario 3)

export const options = {
scenarios: {
shared_iter_scenario: {
executor: "shared-iterations",
vus: 100,
iterations: 200,
startTime: "0s",
gracefulStop: '25s'
},
per_vu_scenario: {
executor: "per-vu-iterations",
vus: 100,
iterations: 10,
startTime: "10s",
gracefulStop: '20s'
},
},
thresholds: {
http_req_failed: ['rate<0.001'], // the error rate must be lower than 0.1%
http_req_duration: ['p(90)<600'], // 90% of requests must complete below 600ms
http_req_receiving: ['max<150'], // slowest request below 150ms
iteration_duration: ['p(95)<20000'], // 95% of requests must complete below 20000ms
},
};

Iteration : iterasi/perulangan, simulasi berapa banyak perulangan yang dilakukan

Start time : waktu mulai pengujian

Graceful stop : waktu menunggu iterasi selesai dijalankan

iteration_duration : durasi iterasi/perulangan

Thresholds terdiri dari :

1. Rate dari http_req_failed harus bernilai kurang dari 0.001 atau 0.1%

2. 90% request dari http_req_duration harus bernilai kurang dari 600 millisecond

3. Slowest request dari http_req_receiving harus selesai dalam 150 millisecond

4. 95% request dari iteration_duration harus bernilai kurang dari 20000 millisecond

IV. Load test vus & duration melalui command (scenario 4)

export const options = {
thresholds: {
http_req_failed: ['rate<0.001'], // the error rate must be lower than 0.1%
http_req_duration: ['p(90)<500'], // 90% of requests must complete below 500ms
http_req_receiving: ['max<400'], // slowest request below 400ms
iteration_duration: ['p(95)<10000'], // 95% of requests must complete below 10000ms
},
};

Thresholds terdiri dari :

1. Rate dari http_req_failed harus bernilai kurang dari 0.001 atau 0.1%

2. 90% request dari http_req_duration harus bernilai kurang dari 500 millisecond

3. Slowest request dari http_req_receiving harus selesai dalam 400 millisecond

4. 95% request dari iteration_duration harus bernilai kurang dari 10000 millisecond

V. Method get (http.get)

Method get bisa dibedakan lagi menjadi 2 yaitu get all dan get by id.

  • Get all (http.get)

Mendapatkan semua data dari API https://jsonplaceholder.typicode.com/users

const res_1 = http.get('https://jsonplaceholder.typicode.com/users');


const checkOutput_1 = check(
res_1,
{
'verify success response of get all': (res_1) => res_1.status == 200,
},
);

http.get(‘https://jsonplaceholder.typicode.com/users’) : eksekusi yang kita lakukan untuk mendapatkan semua data.

‘Verify success response of get all’ : pesan yang akan tampil pada terminal.

Res_1.status == 200 : response status yang akan kita test, apakah benar response status nya 200.

  • Get by id (http.get)

Mendapatkan data berdasarkan id 1 dari API https://jsonplaceholder.typicode.com/users

const res_2 = http.get('https://jsonplaceholder.typicode.com/users/1');


const checkOutput_2 = check(
res_2,
{
'verify success response of get by id': (res_2) => res_2.status == 200,
);

http.get(‘https://jsonplaceholder.typicode.com/users/1’) : eksekusi yang kita lakukan untuk mendapatkan data dengan id 1.

Verify success response of get by id’ : pesan yang akan tampil pada terminal.

res_2.status == 200 : response status yang akan kita test, apakah benar response status nya 200.

VI. Method post (http.post)

create / insert data pada API https://jsonplaceholder.typicode.com/users

const payload_1 = JSON.stringify({
id: 11,
name: 'amanda zahra',
username: 'amanda.zahra',
email: 'amanda.zahra@test.com',
address: {
street: 'jl. damai',
},
phone: '089876543321'
});


const params = {
headers: {
'Content-Type': 'application/json'
},
};


const res_3 = http.post('https://jsonplaceholder.typicode.com/users', payload_1, params);


const checkOutput_3 = check(
res_3,
{
'verify success response of post': (res_3) => res_3.status == 200,
);

JSON.stringify : untuk mengkonversi objek (value javascript) menjadi string (JSON string).

id: 11, name: ‘amanda zahra’, username: ‘amanda.zahra’, email: ‘amanda.zahra@test.com’, address: street: ‘jl. damai’,phone: ‘089876543321’ : data dalam body API yang kita insert.

headers: { ‘Content-Type’: ‘application/json’ } : data dalam headers API yang kita insert.

http.post(‘https://jsonplaceholder.typicode.com/users’, payload_1, params) : eksekusi yang kita lakukan untuk insert data dengan data dalam payload_1 dan params.

verify success response of post’ : pesan yang akan tampil pada terminal.

res_3.status == 200 : response status yang akan kita test, apakah benar response status nya 200.

VII. Run K6

Buka terminal pada text editor, lalu copy paste command berikut

k6 run load_api.js

VIII. Run K6 dengan command vus & duration

Kita dapat run load test dengan command

k6 run --vus 400 -–duration 60s load_api.js

Lalu akan muncul hasil seperti ini pada terminal anda

a. Load test vus & duration (scenario 1)

  1. Terdapat ceklis berwarna hijau menunjukan beberapa function check & thresholds passed

2. Actual result rate dari http_req_failed adalah 0.00%

3. Actual result p(90) dari http_req_duration adalah 1.16 second

4. Actual max dari http_req_receiving adalah 8.88 second

b. Load test stages (scenario 2)

  1. Terdapat error warna kuning menunjukan request timeout pada URL
  2. Terdapat ceklis berwarna hijau menunjukan beberapa function check & thresholds passed
  3. Terdapat silang berwarna merah menunjukan beberapa function check & thresholds failed

4. Actual result rate dari http_req_failed adalah 0.00%

5. Actual result p(90) dari http_req_duration adalah 1.55 second

6. Actual max dari http_req_receiving adalah 59.21 second

c. Load test iteration, start time, graceful stop (scenario 3)

1. Terdapat ceklis berwarna hijau menunjukan semua function check & thresholds passed

2. Actual result rate dari http_req_failed adalah 0.00%

3. Actual result p(90) dari http_req_duration adalah 562.45 millisecond

4. Actual max dari http_req_receiving adalah 40.31 millisecond

5. Actual result p(95) dari itteration_duration adalah 1.09 second

d. Load test command vus & duration (scenario 4)

1. Terdapat tanda ceklis berwarna hijau menunjukan semua function check & beberapa thresholds passed

2. Terdapat tanda silang berwarna merah menunjukan beberapa thresholds failed

3. Actual result dari http_req_failed adalah 0.00%

4. Actual result p(90) dari http_req_duration adalah 581.25 millisecond

5. Actual max dari http_req_receiving adalah 494.56 millisecond

6. Actual result p(95) dari itteration_duration adalah 960.22 millisecond

E. Generate simple report.html

Kita akan generate simple report pada scenario Load test iteration, start time, graceful stop.

Copy paste code berikut untuk import K6, function check & html report

import http from 'k6/http';
import { check } from "k6";
import { htmlReport } from "https://raw.githubusercontent.com/benc-uk/k6-reporter/main/dist/bundle.js";

Copy paste code berikut untuk generate html report

export function handleSummary(data) {
return {
"report.html": htmlReport(data),
};
}

Run K6

k6 run load_api.js

Lalu akan muncul hasil seperti ini pada terminal anda

Tidak ada detail data load test pada terminal, karena sudah ada dalam report.html.

Terdapat file baru bernama report.html, klik kanan file tersebut, lalu pilih copy path, kemudian paste pada browser Anda.

Keterangan dari report.html

Data load test yang tadi kita lihat pada terminal, sekarang dapat kita lihat pada tab request metrics. Data request metric yang berwarna merupakan actual result dari yang kita test.

Pada tab other stats terdapat data checks, iteration, virtual users, requests, data received, & data sent.

Pada tab checks & group terdapat data API fungsional yang kita test.

Total request berwarna hijau merupakan jumlah request yang passed.

Failed request & checks berwarna merah merupakan jumlah request yang failed di karenakan request timeout.

Breached thresholds berwarna merah merupakan jumlah thresholds yang failed.

Data request metric yang berwarna hijau merupakan actual result dari yang kita test dan passed.

Data request metric yang berwarna merah merupakan actual result dari yang kita test dan failed.

a. Load test vus & duration (scenario 1)

b. Load test stages (scenario 2)

c. Load test iteration, start time, graceful stop (scenario 3)

d. Load test command vus & duration (scenario 4)

Sekian dulu tutorial kali ini, jika ada pertanyaan, kritik & saran boleh tulis di kolom komentar. Mohon maaf masih banyak kekurangan. Sampai bertemu di artikel selanjutnya Tutorial Selenium Cucumber Ruby API Test. Kalo ada usul untuk artikel selanjutnya juga boleh tulis di kolom komentar ya.

Referensi :

https://k6.io/docs/using-k6/scenarios/

https://betterprogramming.pub/an-introduction-to-k6-an-api-load-testing-tool-132a0d87827d

https://anivaz.medium.com/getting-started-with-k6-a-beginners-guide-to-load-testing-1249c64118b6

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

Fadhila Rizki Anindita
Fadhila Rizki Anindita

Responses (1)

Write a response

ini teknikal men-detail, type of content, cocok buat yang spesifik teknikal untuk read article ini, btw good writes, izin follow yup

--