Berpengalaman dalam pengujian API, uji performa dengan K6 pada 95 API, dan validasi fungsional aplikasi, dengan latar belakang sebagai Application Developer. Terbiasa menyelidiki defect, memvalidasi perilaku API, dan memverifikasi perbaikan bersama tim lintas fungsi. Saat ini mendalami praktik quality assurance yang terstruktur untuk berkarier di bidang QA/QC.
Sarjana Terapan, Teknik Informatika · IPK 3,95 / 4,00
Juri Project Innovation pada MaFIA Inclusive Bootcamp 2025 yang diselenggarakan Universitas Brawijaya
Mahasiswa Berprestasi Jurusan Teknologi Informasi 2024 dan 2025
HAKI: Greeny, inovasi sistem pintar untuk pertanian perkotaan dengan pendekatan gamifikasi, IoT, dan AR
5 kali juara lomba software development tingkat nasional
Pengalaman Kerja
Mar 2025 – sekarang
Application Developer
PT Intelix Global Crossing, Malang
Testing
Menguji performa 95 API dengan k6 (smoke, load, stress, spike, soak).
Memakai Postman, Swagger, dan Scalar untuk memeriksa request dan response API serta menyelidiki masalah integrasi.
Melakukan functional validation fitur aplikasi CMS dan Scoring selama pengembangan dan penyelesaian issue.
Menyelidiki defect, melaporkannya lewat bug-tracking tool dan komunikasi tim, lalu memverifikasi perbaikannya.
Pekerjaan pengembangan (2)
Membangun dan mengintegrasikan aplikasi web dengan React.js dan Next.js, memakai ±200 REST API dan ±15 koneksi WebSocket.
Bekerja dengan tim lintas fungsi, melakukan code review, dan mengoordinasi tugas anak magang dalam sprint agile.
Jul 2024 – Des 2024
Application Developer (magang)
PT Intelix Global Crossing, Malang
Testing
Menyelidiki masalah terkait API saat mengintegrasikan ±95 REST API.
Pekerjaan pengembangan (2)
Membangun fitur web dengan React.js, Vite, dan Tailwind CSS.
Memimpin tim 3 orang, serta menulis dokumentasi teknis dan panduan pengguna.
Feb 2024 – Jul 2024
Full Stack Developer (magang)
PT Amerta Indah Otsuka, Pasuruan
Testing
Melakukan functional testing dan evaluasi pengguna untuk pengenalan gestur, pengambilan foto, dan pembuatan QR code.
Pekerjaan pengembangan (2)
Membangun aplikasi photobooth hand gesture dengan Python, Flask, dan computer vision.
Ikut memperbaiki UI/UX berdasarkan masukan pengguna. Aplikasi ini dipakai lebih dari 1.000 pengunjung.
Proyek terpilih
Okt 2024 – Mei 2025
Aplikasi Manajemen Proyek berbasis Kanban
PT Intelix Global Crossing
Testing
Functional validation dan scenario-based testing untuk manajemen workflow, penugasan, pelaporan, dan monitoring proyek.
Mendukung User Acceptance Testing (UAT) dengan hasil evaluasi 96,25% dari 6 responden.
Pekerjaan pengembangan (1)
Membangun aplikasinya dengan framework Kanban dan metode Agile Prototyping.
Keahlian
Testing & quality
API testing
Performance testing
Functional validation
Defect investigation
Bug fix verification
UAT
Tools
Postman
k6
Swagger
Scalar
Newman
Teknis
REST API
WebSocket
JavaScript
SQL
Git
Portfolio
Pengujian API Restful-Booker
Proyek mandiri untuk latihan: saya menguji Restful-Booker, sebuah API pemesanan hotel publik yang memang disediakan untuk belajar testing. Saya menulis test case, mengotomasinya dengan Postman, mengukur performanya dengan k6, lalu melaporkan bug yang ketemu. Semua angka di bawah dibaca langsung dari repository.
29
test case26 sudah otomatis
41
assertiondi 22 request Postman
7
bug4 di antaranya major
4
run k6smoke, load, dan 2× stress
Temuan
API ini hampir tidak memvalidasi input. Harga negatif, tanggal checkout sebelum checkin, dan nama kosong tetap diterima, dan field wajib yang hilang malah menghasilkan error 500. Sisi baiknya, semua PUT, PATCH, dan DELETE tanpa token ditolak dengan 403. Klik satu bug untuk melihat langkah reproduksinya.
BUG-001Booking menerima totalprice negatifMajor · P1
POST /booking dengan "totalprice": "abc" dan data lain yang valid.
Kasus B - format tanggal salah
POST /booking dengan "checkin": "not-a-date" dan data lain yang valid.
Hasil yang diharapkan
400 Bad Request yang menjelaskan field yang tidak valid.
Hasil aktual
Keduanya mengembalikan 200 OK dan datanya rusak tanpa pemberitahuan:
Input
Nilai yang tersimpan
"totalprice": "abc"
"totalprice": null
"checkin": "not-a-date"
"checkin": "0NaN-aN-aN"
Dampak
Data rusak secara diam-diam: pemanggil mengira booking sudah tersimpan dengan benar. Laporan dan logika tanggal di hilir menerima null atau tanggal yang tidak bisa dibaca.
Saran perbaikan
Validasi tipe data dan format tanggal ISO-8601 (YYYY-MM-DD) sebelum menyimpan, lalu kembalikan pesan error per field.
POST /booking
Content-Type: application/json
Accept: application/json
{ "firstname": "OnlyName" }
Hasil yang diharapkan
400 Bad Request yang menyebutkan field wajib yang hilang (lastname, totalprice, depositpaid, bookingdates).
Hasil aktual
500 Internal Server Error dengan body yang generik.
Dampak
Kode 5xx memberi tahu client bahwa server yang gagal, bukan permintaannya yang salah. Ini mengotori monitoring error dan membuat pengguna API tidak punya petunjuk untuk memperbaiki permintaannya.
Saran perbaikan
Validasi body permintaan dan kembalikan 400 beserta rinciannya, bukan membiarkan exception merambat.
POST /auth
Content-Type: application/json
{ "username": "admin", "password": "wrong" }
Hasil yang diharapkan
401 Unauthorized.
Hasil aktual
200 OK dengan body {"reason":"Bad credentials"} (tanpa token). Body kosong {} menghasilkan perilaku yang sama.
Dampak
Client dan API gateway yang menganggap 2xx sebagai sukses bisa salah menafsirkan login yang gagal. Pemantauan login gagal dan rate limiting yang berbasis status code tidak akan berfungsi.
Saran perbaikan
Kembalikan 401 Unauthorized untuk kredensial yang tidak valid dan 400 untuk permintaan yang formatnya salah.
BUG-007Status code hapus tidak konsisten: berhasil mengembalikan 201, hapus ulang mengembalikan 405 (seharusnya 204/200 dan 404)Minor · P3
Langkah reproduksi
DELETE /booking/{id} dengan token valid -> 201 Created; permintaan yang sama diulang -> 405 Method Not Allowed.
Desain tes
Saya mulai dari 24 skenario, lalu memecahnya jadi 29 test case. Tiap ID bisa ditelusuri sampai ke Postman, misalnya TC-CRT-01.
1892
LulusGagalObservasi / belum dijalankanLihat 24 skenario
TS-AUTH - Autentikasi (POST /auth)
TS-AUTH-01 Pengguna dengan kredensial valid menerima token
TS-AUTH-02 Pengguna dengan kredensial salah tidak menerima token
TS-AUTH-03 Permintaan tanpa kredensial tidak menerima token
TS-CRT - Membuat booking (POST /booking)
TS-CRT-01 Booking dengan semua field valid berhasil dibuat dan id dikembalikan
TS-CRT-02 Booking tanpa field opsional berhasil dibuat
TS-CRT-03 Permintaan dengan field wajib yang hilang ditolak dengan error dari sisi client
TS-CRT-04 Nilai field di luar rentang valid (harga negatif, checkout sebelum checkin) ditolak
TS-CRT-05 Tipe data yang salah dan format tanggal yang rusak ditolak
TS-CRT-06 Teks kosong / sangat panjang / berisi karakter khusus ditangani dengan aman
TS-CRT-07 Permintaan ditolak ketika header Accept tidak ada
TS-GET - Membaca booking (GET /booking, GET /booking/{id})
TS-GET-01 Booking yang ada bisa diambil berdasarkan id dan sesuai schema
TS-GET-02 Id yang tidak ada atau formatnya salah mengembalikan 404
TS-GET-03 Daftar booking mengembalikan id
TS-GET-04 Daftar bisa difilter berdasarkan nama dan tanggal
TS-UPD - Mengubah booking (PUT, PATCH /booking/{id})
TS-UPD-01 Pengguna yang terautentikasi bisa mengganti seluruh isi booking
TS-UPD-02 Pengguna yang terautentikasi bisa mengubah sebagian field saja
TS-UPD-03 Permintaan tanpa token atau dengan token tidak valid ditolak
TS-DEL - Menghapus booking (DELETE /booking/{id})
TS-DEL-01 Pengguna yang terautentikasi bisa menghapus booking, dan booking itu tidak bisa diambil lagi
TS-DEL-02 Penghapusan tanpa autentikasi ditolak
TS-DEL-03 Menghapus booking yang sudah tidak ada ditangani dengan wajar
TS-E2E - Alur end-to-end
TS-E2E-01 Login -> buat booking -> baca -> ubah -> ubah sebagian -> hapus -> pastikan sudah hilang (folder Postman 1-5 dijalankan berurutan)
TS-NFR - Non-fungsional
TS-NFR-01 Endpoint utama merespons dalam waktu kurang dari 2 detik untuk satu pengguna
TS-NFR-02 Dengan 10 pengguna bersamaan, latensi p95 dan tingkat error tetap dalam threshold
TS-NFR-03 Perilaku saat beban dinaikkan melewati tingkat normal (mencari titik jenuh)
Lihat semua 29 test case
29 dari 29
ID
Judul
Tipe
Prioritas
Status
Otomasi
Login dengan kredensial valid
Positif
P1
Lulus
Postman
Login dengan password salah
Negatif
P1
Gagal (sudah diketahui)
Postman
Login dengan body kosong
Negatif
P2
Gagal (sudah diketahui)
Postman
Membuat booking dengan data valid
Positif
P1
Lulus
Postman
Membuat booking tanpa header Accept
Negatif
P3
Lulus (perilaku terdokumentasi)
Postman
Membuat booking dengan field wajib hilang
Negatif
P1
Gagal (sudah diketahui)
Postman
Membuat booking tanpa additionalneeds (opsional)
Positif
P2
Lulus
Postman
Membuat booking dengan totalprice negatif
Batas
P1
Gagal
Postman (folder defect)
Membuat booking dengan checkout sebelum checkin
Batas
P1
Gagal
Postman (folder defect)
Membuat booking dengan firstname kosong
Batas
P2
Gagal
Postman (folder defect)
Membuat booking dengan totalprice bukan angka
Negatif
P1
Gagal
Postman (folder defect)
Membuat booking dengan format tanggal salah
Negatif
P1
Gagal
Postman (folder defect)
Membuat booking dengan HTML/script di firstname
Keamanan
P2
Observasi
Manual
Membuat booking dengan lastname 10.000 karakter
Batas
P3
Belum dijalankan
Manual
Mengambil booking berdasarkan id
Positif
P1
Lulus
Postman
Mengambil booking yang tidak ada
Negatif
P1
Lulus
Postman
Mengambil booking dengan id bukan angka
Negatif
P3
Lulus
Postman
Menampilkan daftar semua booking
Positif
P1
Lulus
Postman
Memfilter booking berdasarkan firstname
Positif
P2
Lulus
Postman
Memfilter booking berdasarkan tanggal checkin
Positif
P3
Lulus
Manual
Update penuh (PUT) dengan token valid
Positif
P1
Lulus
Postman
PUT tanpa token
Keamanan
P1
Lulus
Postman
PUT dengan token tidak valid
Keamanan
P1
Lulus
Postman
Update sebagian (PATCH)
Positif
P1
Lulus
Postman
PATCH tanpa token
Keamanan
P1
Lulus
Postman
Hapus tanpa token
Keamanan
P1
Lulus
Postman
Hapus dengan token valid
Positif
P1
Lulus (perilaku terdokumentasi)
Postman
Booking yang sudah dihapus tidak bisa diambil
Positif
P1
Lulus
Postman
Menghapus booking yang sama dua kali
Negatif
P2
Gagal (sudah diketahui)
Postman
Otomasi dan CI
Test case yang bisa diotomasi saya tulis sebagai collection Postman dan dijalankan dengan Newman. Isinya token chaining, validasi JSON schema, dan satu run data-driven dari CSV. Test untuk bug yang sudah diketahui saya pisahkan ke folder sendiri, supaya regression suite tetap hijau. Semuanya berjalan otomatis di GitHub Actions setiap ada push, bersama k6 smoke test (lihat workflow).
Lihat rincian per folder dan perintahnya
Folder
Request
Assertion
0. Health
1
2
1. Auth
3
8
2. Booking - Create
4
9
3. Booking - Read
5
11
4. Booking - Update
5
7
5. Booking - Delete
4
4
6. Data-driven - Create booking from CSV
1
2
7. Known defects (expected to fail)
6
6
npm run test:api # regression suite, laporan HTML
npm run test:api:data # run data-driven dari CSV
npm run test:api:defects # known defect, gagal memang disengaja
Performa
Saya menjalankan skrip k6 ber-threshold ke API sungguhan dari satu laptop, jadi angkanya sudah termasuk latensi jaringan sekitar 230 sampai 250 ms. Smoke dan load lulus, sedangkan stress belum bisa disimpulkan (alasannya di bawah grafik). Baca laporan lengkap.
0s1s2s3s4s5s6s7s
Smoke1 VU, 5 iterations
Load10 VUs, 3 min
Stress, run 1up to 10 VUs, 3 min
Stress, run 2up to 10 VUs, 3 min
Batang tebal: dari 0 sampai p95. Garis tipis: sampai nilai maksimum. Titik: median. Garis tegak merah: batas p95 untuk run itu. Batang merah: run melewati threshold, bisa karena latensi atau karena persentase request gagal (cek tabel angka).Lihat tabel angka
Run
Request
Median
p95 (batas)
Maks
Gagal (batas)
Hasil
Smoke
26
248 ms
258 ms (2.00 s)
275 ms
0% (1.0%)
Lulus
Load
1,301
256 ms
952 ms (1.50 s)
1.91 s
0% (1.0%)
Lulus
Stress, run 1
1,773
263 ms
1.06 s (3.00 s)
6.37 s
6.1% (5.0%)
Gagal
Stress, run 2
2,061
262 ms
665 ms (3.00 s)
1.18 s
0% (5.0%)
Lulus
Dua run stress memakai pengaturan yang sama tapi hasilnya berbeda: run 1 gagal 6,1% (semuanya di DELETE), run 2 bersih. Karena itu saya belum menyimpulkan batas kapasitasnya. Beban saya batasi 10 VU karena targetnya server publik yang dipakai bersama.
Kontak
Saya terbuka untuk peran QA, QC, dan software tester. Silakan hubungi saya lewat: