Testing 1: Load and performance testing
Load and performance testing dengan K6
Jenis-Jenis Uji Beban (Load Test)
Banyak hal yang bisa salah ketika sebuah sistem berada di traffik yang tinggi. Sistem harus menjalankan banyak operasi secara bersamaan dan merespons berbagai permintaan dari sejumlah pengguna yang bervariasi (concurrent users). Untuk mengantisipasi risiko kinerja ini, kita bisa menggunakan uji beban (load testing). Namun, strategi uji beban yang baik tidak cukup hanya dengan menjalankan satu skrip saja. Pola trafik yang berbeda menciptakan profil risiko (risk profiles) yang berbeda bagi aplikasi. Untuk persiapan yang lebih menyeluruh, kita harus menguji sistem dengan berbagai jenis pengujian.
Bentuk-Bentuk Uji Beban
Uji Berbeda untuk Tujuan Berbeda
Mulailah dengan smoke test, lalu tingkatkan beban dan durasi secara bertahap.
Berikut adalah jenis-jenis utama uji beban. Setiap jenis memiliki konsep dan tujuan spesifiknya:
Smoke Test: Memvalidasi apakah skrip pengujian berfungsi dan apakah sistem dapat bekerja dengan baik di bawah beban minimal.
Uji Beban Normal (Average Load Test): Mengevaluasi bagaimana sistem bekerja dalam kondisi penggunaan yang diharapkan.
Uji Stres (Stress Test): Mengevaluasi kinerja sistem pada batas maksimumnya ketika beban melebihi rata-rata yang diharapkan.
Uji Ketahanan (Soak Test): Mengukur keandalan dan kinerja sistem dalam jangka waktu yang panjang.
Uji Lonjakan (Spike Test): Memverifikasi bagaimana sistem berperilaku dan bertahan dalam lonjakan aktivitas yang tiba-tiba, singkat, dan besar.
Uji Batas (Breakpoint Test): Meningkatkan beban secara bertahap untuk mengidentifikasi kapasitas maksimum sistem.
Catatan
Dalam skrip k6, konfigurasi beban dapat diatur menggunakan opsi atau skenario. Ini memungkinkan pemisahan antara konfigurasi beban kerja dan logika iterasi.
Ringkasan Jenis Uji Beban
Smoke
Rendah
Pendek (detik atau menit)
Saat ada perubahan kode sistem atau aplikasi untuk memeriksa logika fungsional, metrik dasar, dan penyimpangan
Load
Rata-rata produksi
Menengah (5-60 menit)
Sering digunakan untuk memastikan sistem dapat mempertahankan kinerjanya dalam penggunaan rata-rata
Stress
Tinggi (di atas rata-rata)
Menengah (5-60 menit)
Ketika sistem diperkirakan menerima beban di atas rata-rata untuk menguji bagaimana sistem menangani kondisi tersebut
Soak
Rata-rata
Panjang (berjam-jam)
Setelah ada perubahan untuk menguji kinerja sistem dalam penggunaan terus-menerus yang berkepanjangan
Spike
Sangat tinggi
Pendek (beberapa menit)
Saat sistem dipersiapkan untuk acara musiman atau sering menerima lonjakan lalu lintas
Breakpoint
Meningkat sampai batasnya
Selama yang diperlukan
Dilakukan beberapa kali untuk menemukan batas maksimum sistem
Rekomendasi Umum
Mulailah dengan Uji Asap
Sebelum menjalankan pengujian yang lebih besar, pastikan terlebih dahulu bahwa skrip berfungsi sebagaimana mestinya dan sistem dapat bekerja dengan baik dengan sejumlah kecil pengguna. Setelah itu, lanjutkan ke pengujian beban rata-rata, lalu ke pola beban yang lebih kompleks.
Sesuaikan dengan Kasus Penggunaan
Setiap sistem memiliki arsitektur dan basis pengguna yang berbeda, sehingga strategi uji beban yang tepat sangat bergantung pada profil risiko organisasi. Hindari berpikir dalam konsep yang absolut.
Sebagai contoh, k6 dapat memodelkan beban berdasarkan jumlah Virtual Users (VU) atau jumlah iterasi per detik (sistem terbuka vs. tertutup). Saat merancang pengujian, pertimbangkan pola mana yang paling sesuai dengan kebutuhan.
Selain itu, tidak ada satu jenis pengujian yang dapat menghilangkan semua risiko. Untuk mengevaluasi berbagai kemungkinan kegagalan dalam sistem, gunakan kombinasi dari beberapa jenis pengujian. Profil risiko sistem akan menentukan jenis pengujian mana yang harus lebih diprioritaskan:
Jika sistem lebih rentan terhadap penggunaan jangka panjang, uji ketahanan (soak test) harus diutamakan.
Jika sistem lebih rentan terhadap penggunaan intensif, uji stres (stress test) harus menjadi prioritas utama.
Gunakan Desain yang Sederhana dan Hasil yang Dapat Direproduksi
Meskipun detail pengujian sangat bergantung pada konteksnya, prinsip utamanya adalah menghasilkan hasil yang dapat dibandingkan dan diinterpretasikan dengan mudah.
Gunakan pola beban yang sederhana, yaitu: peningkatan bertahap, dataran tinggi (plateau), dan penurunan bertahap.
Hindari pola seperti "rollercoaster", di mana beban naik dan turun berkali-kali, karena ini akan menghabiskan sumber daya dan menyulitkan analisis penyebab masalah.
Dengan strategi yang tepat, uji beban dapat membantu memastikan sistem dapat bekerja dengan optimal di berbagai skenario penggunaan.
Smoke Testing
Pengertian Smoke Test
Smoke test dilakukan dengan beban minimal. Bentuk ini digunakan untuk memverifikasi apakah sistem dapat berjalan dengan baik dalam kondisi beban rendah serta untuk mengumpulkan nilai dasar kinerja.
Jenis pengujian ini dijalankan dengan beberapa Virtual Users (VU). Lebih dari 5 VU dapat dianggap sebagai pengujian mini-load.
Selain itu, smoke test hanya dieksekusi dalam waktu singkat, baik dengan jumlah iterasi rendah atau durasi beberapa detik hingga maksimal beberapa menit.
Gambaran Umum Smoke Test
Dalam beberapa diskusi mengenai pengujian, smoke test juga disebut sebagai shakeout test.
Kapan Smoke Test Dijalankan?
Tim harus menjalankan smoke test setiap kali skrip pengujian dibuat atau diperbarui. Smoke testing juga harus dilakukan setiap kali kode aplikasi yang relevan mengalami perubahan.
Disarankan untuk menjadikan smoke test sebagai langkah awal dengan tujuan sebagai berikut:
Memastikan bahwa skrip pengujian tidak memiliki kesalahan.
Memverifikasi bahwa sistem tidak mengalami error (baik yang terkait dengan performa maupun sistem) saat berada di bawah beban minimal.
Mengumpulkan metrik performa dasar dari respons sistem di bawah beban minimal.
Dengan logika sederhana, smoke test dapat berfungsi sebagai pengujian sintetis untuk memantau performa dan ketersediaan lingkungan produksi.
Hal yang Perlu Dipertimbangkan
Saat mempersiapkan smoke test, perhatikan beberapa hal berikut:
Jalankan Smoke Test Setiap Kali Skrip Dibuat atau Diperbarui
Karena smoke test digunakan untuk memverifikasi skrip pengujian, usahakan menjalankannya setiap kali Anda membuat atau memperbarui skrip. Hindari menjalankan jenis pengujian lain dengan skrip yang belum diuji.
Gunakan Throughput Kecil dan Durasi Singkat
Konfigurasikan skrip pengujian agar dijalankan oleh sejumlah kecil VU (antara 2 hingga 20) dengan sedikit iterasi atau durasi singkat (30 detik hingga 3 menit).
Smoke Testing dengan k6
Berikut adalah contoh skrip smoke test menggunakan k6:
Skrip di atas adalah contoh smoke test. Anda bisa menyalinnya, mengubah endpoint, dan langsung melakukan pengujian. Untuk logika pengujian yang lebih komprehensif, lihat contoh lainnya dalam dokumentasi k6.
Diagram berikut menunjukkan bentuk smoke test yang dikonfigurasi berdasarkan skrip di atas.
Analisis Hasil
Smoke test awalnya digunakan untuk memastikan bahwa skrip Anda dapat berjalan tanpa error. Jika terdapat error dalam skrip, perbaiki terlebih dahulu sebelum menjalankan pengujian lebih lanjut.
Di sisi lain, jika Anda menemukan performa buruk meskipun menggunakan jumlah VU yang rendah, laporkan masalah tersebut, perbaiki lingkungan pengujian, lalu coba lagi dengan smoke test sebelum menjalankan pengujian lainnya.
Setelah smoke test menunjukkan nol error dan hasil performa tampak dapat diterima, Anda bisa melanjutkan ke jenis pengujian lainnya.
Pengujian Beban Rata-Rata (Average-Load Testing)
Pengertian Pengujian Beban Rata-Rata
Pengujian beban rata-rata bertujuan untuk menilai bagaimana sistem bekerja di bawah beban tipikal. Beban tipikal ini mencerminkan kondisi normal sehari-hari dalam produksi.
Pengujian ini mensimulasikan jumlah pengguna bersamaan dan permintaan per detik yang mencerminkan rata-rata perilaku dalam lingkungan produksi. Biasanya, throughput atau jumlah VU ditingkatkan secara bertahap dan dipertahankan dalam jangka waktu tertentu. Bergantung pada karakteristik sistem, pengujian dapat dihentikan secara tiba-tiba atau memiliki periode penurunan beban (ramp-down) yang singkat.
Gambaran Umum Pengujian Beban Rata-Rata
Karena istilah "load test" dapat merujuk pada berbagai jenis pengujian lalu lintas, dalam panduan ini digunakan istilah "average-load test" untuk menghindari kebingungan. Dalam beberapa diskusi, pengujian ini juga disebut "day-in-life test" atau "volume test".
Kapan Pengujian Beban Rata-Rata Dijalankan?
Pengujian ini membantu memahami apakah sistem memenuhi tujuan performa dalam kondisi beban sehari-hari (beban umum). Beban sehari-hari berarti ketika sejumlah rata-rata pengguna mengakses aplikasi secara bersamaan dan melakukan aktivitas normal.
Anda sebaiknya menjalankan pengujian ini untuk:
Menilai performa sistem di bawah beban tipikal.
Mengidentifikasi tanda-tanda degradasi awal selama periode peningkatan atau beban penuh.
Memastikan bahwa sistem tetap memenuhi standar performa setelah ada perubahan kode atau infrastruktur.
Hal yang Perlu Dipertimbangkan
Saat mempersiapkan pengujian beban rata-rata, pertimbangkan beberapa hal berikut:
Ketahui Jumlah Pengguna dan Throughput Tipikal
Gunakan alat pemantauan aplikasi (APM) atau analitik yang menyediakan informasi dari lingkungan produksi. Jika tidak tersedia, estimasi dari pihak bisnis dapat digunakan.
Tingkatkan Beban Secara Bertahap
Gunakan periode peningkatan beban (ramp-up) sekitar 5% hingga 15% dari total durasi pengujian untuk:
Memberi waktu sistem untuk menyesuaikan diri atau melakukan auto-scale.
Membandingkan waktu respons antara tahap beban rendah dan rata-rata.
Mengoptimalkan peringatan otomatis dalam pengujian cloud.
Pertahankan Beban Rata-Rata Lebih Lama dari Ramp-Up
Usahakan durasi beban rata-rata setidaknya lima kali lebih lama dari ramp-up untuk menilai tren performa secara signifikan.
Pertimbangkan Periode Ramp-Down
Periode ramp-down adalah saat aktivitas pengguna virtual berkurang secara bertahap, biasanya berlangsung selama atau sedikit lebih singkat dari ramp-up.
Pengujian Beban Rata-Rata dengan k6
Berikut adalah contoh skrip pengujian beban rata-rata:
Analisis Hasil
Hasil awal muncul selama ramp-up untuk melihat apakah waktu respons memburuk seiring peningkatan beban. Jika sistem mengalami penurunan performa, perbaiki sebelum melanjutkan ke pengujian lebih lanjut.
Stress Testing
Pengertian Stress Testing
Stress testing menilai bagaimana sistem berperforma ketika beban yang diberikan lebih tinggi dari biasanya.
Polanya mirip dengan pengujian beban rata-rata (average-load test), tetapi dengan tingkat beban yang lebih besar. Untuk mengakomodasi beban ini, periode ramp-up (peningkatan beban secara bertahap) berlangsung lebih lama. Setelah mencapai beban yang diinginkan, pengujian mungkin berlangsung sedikit lebih lama dibandingkan dengan pengujian beban rata-rata.
Gambaran Umum Stress Test
Dalam beberapa diskusi mengenai pengujian perangkat lunak, stress test juga disebut sebagai rush-hour test, surge test, atau scale test.
Kapan Stress Test Dilakukan?
Stress test digunakan untuk memverifikasi stabilitas dan keandalan sistem dalam kondisi penggunaan berat. Sistem dapat mengalami lonjakan beban yang tidak biasa pada saat-saat tertentu, seperti:
Tenggat waktu suatu proses
Hari gajian
Jam sibuk
Akhir pekan
Pola perilaku lain yang menyebabkan lonjakan lalu lintas di atas rata-rata
Hal yang Perlu Dipertimbangkan
1. Beban Harus Lebih Tinggi dari Rata-Rata
Beban dalam stress test harus lebih tinggi dari yang biasa dialami sistem dalam kondisi normal.
2. Tidak Ada Persentase Tetap untuk Stress Test
Beberapa penguji mungkin menggunakan target default, misalnya peningkatan 50% hingga 100% dari beban rata-rata, tetapi tidak ada standar tetap.
Beban yang digunakan bergantung pada kondisi ekstrem yang mungkin dialami sistem. Kadang-kadang hanya sedikit lebih tinggi dari rata-rata, tetapi dalam beberapa kasus, bisa meningkat dua kali lipat, tiga kali lipat, atau bahkan lebih besar lagi.
3. Tentukan Beban Berdasarkan Pola Risiko
Tentukan beban berdasarkan pola risiko yang mungkin dialami sistem dalam kondisi penggunaan ekstrem.
4. Jalankan Stress Test Setelah Average-Load Test
Identifikasi terlebih dahulu masalah performa dalam pengujian beban rata-rata sebelum mencoba pengujian yang lebih berat. Urutan ini sangat penting agar tidak menguji sistem dengan beban ekstrem sebelum mengetahui batas normalnya.
5. Gunakan Skrip Average-Load Test dengan Modifikasi
Gunakan kembali skrip pengujian beban rata-rata, tetapi ubah parameternya untuk meningkatkan jumlah VU atau beban yang lebih tinggi.
6. Harapkan Performa Menurun
Stress test bertujuan untuk mengukur sejauh mana performa sistem menurun ketika beban meningkat. Sistem yang baik harus mampu mempertahankan response time yang konsisten meskipun berada dalam beban tinggi untuk waktu yang lama.
Stress Testing dengan k6
Beban dalam stress test mirip dengan pengujian beban rata-rata, tetapi dengan tingkat beban yang lebih tinggi.
Tingkatkan aktivitas skrip secara bertahap dengan ramp-up yang lebih lambat hingga mencapai jumlah pengguna atau throughput di atas rata-rata.
Pertahankan beban tinggi selama beberapa waktu.
Turunkan beban secara perlahan (ramp-down) atau hentikan pengujian tergantung pada skenario pengujian.
Berikut contoh skrip k6 untuk stress test:
Bentuk Grafik Stress Test
Kurva pengguna virtual (VU) atau throughput dalam stress test terlihat serupa dengan average-load test, tetapi dengan tingkat beban yang lebih tinggi.
Pengujian dimulai dari 0, lalu meningkat hingga melampaui titik yang diuji dalam average-load test. Periode ramp-up dan ramp-down lebih panjang untuk mendapatkan respons yang lebih realistis.
Catatan Penting
Jalankan stress test hanya setelah smoke test dan average-load test.
Menjalankan stress test terlalu dini bisa menghabiskan sumber daya secara tidak perlu dan membuat sulit mengidentifikasi masalah yang mungkin sudah muncul pada tingkat beban lebih rendah.
Analisis Hasil Stress Test
Mirip dengan average-load test, hasil awal dari stress test bisa diamati selama periode ramp-up. Jika waktu respons mulai menurun drastis seiring peningkatan beban, itu bisa menjadi indikasi potensi bottleneck pada sistem.
Pada periode full load, pastikan bahwa konsumsi sumber daya tetap stabil dan sistem tidak mengalami crash atau degradasi performa yang tidak terkendali.
Jika sistem berhasil menangani beban tinggi dalam stress test, langkah berikutnya adalah melakukan Soak Test untuk melihat bagaimana performa sistem dalam jangka waktu panjang.
Soak Testing
Soak testing adalah variasi lain dari uji Average-Load. Fokusnya adalah pada periode yang lebih panjang, dengan menganalisis hal-hal berikut:
Penurunan kinerja dan konsumsi sumber daya sistem selama periode yang panjang.
Ketersediaan dan stabilitas sistem selama periode yang panjang.
Uji soak berbeda dari uji average-load dalam durasi uji. Dalam uji soak, durasi beban puncak (biasanya dalam jumlah rata-rata) berlangsung selama beberapa jam atau bahkan hari. Meskipun durasinya jauh lebih lama, periode ramp-up dan ramp-down pada uji soak sama seperti pada uji average-load.
Gambaran Umum Soak Test
Dalam beberapa percakapan tentang pengujian, uji soak mungkin disebut sebagai endurance test, constant high load test, atau stamina test.
Kapan Melakukan Soak Test
Sebagian besar sistem harus tetap menyala dan terus bekerja selama hari, minggu, dan bulan tanpa intervensi. Uji ini memverifikasi stabilitas dan keandalan sistem selama penggunaan yang panjang.
Jenis uji ini memeriksa cacat kinerja umum yang hanya muncul setelah penggunaan yang lama, seperti penurunan waktu respons, kebocoran memori atau sumber daya lainnya, saturasi data, dan kehabisan penyimpanan.
Pertimbangan
Saat mempersiapkan untuk menjalankan uji soak, pertimbangkan hal-hal berikut:
Konfigurasikan durasi uji agar jauh lebih lama dari uji lainnya.
Beberapa nilai umum adalah 3, 4, 8, 12, 24, dan 48 hingga 72 jam.
Jika memungkinkan, gunakan kembali skrip uji average-load dan hanya ubah durasi puncaknya dengan nilai-nilai yang telah disebutkan.
Jangan jalankan uji soak sebelum melakukan uji smoke dan average-load.
Setiap uji mengungkapkan masalah yang berbeda. Menjalankan ini terlebih dahulu bisa menyebabkan kebingungan dan pemborosan sumber daya.
Monitor sumber daya backend dan efisiensi kode. Karena kita memeriksa penurunan sistem, sangat disarankan untuk memonitor sumber daya backend dan efisiensi kode. Dari semua jenis uji, pemantauan backend sangat penting untuk uji soak.
Soak Testing di k6
Uji soak hampir sama dengan uji average-load. Perbedaannya hanya pada durasi puncak beban yang lebih lama.
Langkah-langkah untuk uji soak di k6:
Tingkatkan beban hingga mencapai jumlah pengguna atau throughput rata-rata.
Pertahankan beban itu untuk waktu yang jauh lebih lama.
Terakhir, tergantung pada kasus uji, berhenti atau turunkan beban secara bertahap.
Konfigurasi durasi beban dalam objek opsi:
Untuk perilaku yang lebih kompleks, lihat contoh lainnya.
Perhatikan bahwa, seperti pada uji average-load, puncak beban mencapai 100 VUs. Perbedaannya ada pada durasi. Pada uji soak ini, puncak beban dipertahankan selama 8 jam, bukan hanya beberapa menit.
Analisis Hasil
Jika kita menjalankan uji ini setelah jenis uji sebelumnya, seharusnya sistem kita berfungsi dengan baik pada skenario-skenario sebelumnya. Dalam uji ini, pantau perubahan pada metrik kinerja seiring berjalannya waktu. Cobalah untuk menghubungkan dampak apa pun dengan perubahan pengukuran backend yang menunjukkan penurunan seiring waktu. Perubahan ini bisa berupa penurunan bertahap, seperti yang disebutkan, dan perubahan mendadak (termasuk peningkatan) dalam waktu respons dan sumber daya perangkat keras backend. Sumber daya backend yang perlu diperiksa adalah RAM yang digunakan, CPU, jaringan, dan pertumbuhan sumber daya cloud, antara lain.
Hasil yang diharapkan adalah bahwa kinerja dan pemanfaatan sumber daya backend tetap stabil atau berada dalam variasi yang diharapkan.
Setelah Anda menjalankan semua jenis uji sebelumnya, Anda akan tahu bahwa sistem Anda berfungsi dengan baik pada berbagai beban: rendah, rata-rata, tinggi, dan diperpanjang.
Spike Testing
Spike testing memverifikasi apakah sistem dapat bertahan dan berfungsi dengan baik di bawah lonjakan penggunaan yang mendadak dan besar.
Uji spike berguna ketika sistem berpotensi mengalami lonjakan lalu lintas yang mendadak dan besar. Contoh peristiwa seperti itu termasuk penjualan tiket (misalnya Taylor Swift), peluncuran produk (misalnya PS5), iklan siaran (misalnya Super Bowl), tenggat waktu proses (misalnya deklarasi pajak), dan penjualan musiman (misalnya Black Friday). Selain itu, lonjakan lalu lintas juga bisa disebabkan oleh peristiwa yang lebih sering terjadi seperti jam sibuk, tugas tertentu, atau kasus penggunaan tertentu.
Spike testing meningkatkan beban hingga tingkat yang sangat tinggi dalam waktu yang sangat singkat atau tanpa periode peningkatan yang signifikan. Biasanya, tidak ada periode dataran tinggi (plateau) atau sangat singkat, karena pengguna nyata umumnya tidak akan terus melakukan langkah-langkah tambahan dalam situasi ini. Demikian juga, periode penurunan beban (ramp-down) sangat cepat atau tidak ada, sehingga proses hanya terjadi sekali.
Uji ini mungkin melibatkan proses yang berbeda dari jenis pengujian sebelumnya, karena lonjakan sering kali bukan bagian dari aktivitas rata-rata di produksi. Uji ini juga bisa memerlukan penambahan, penghapusan, atau modifikasi proses dalam skrip yang tidak ada dalam uji average-load.
Terkadang, tim harus memperbarui sistem untuk memungkinkan atau memprioritaskan sumber daya bagi proses-proses yang permintaannya tinggi selama peristiwa tersebut.
Gambaran Umum Spike Test
Kapan Melakukan Spike Test
Uji ini harus dilakukan ketika sistem diperkirakan akan menerima lonjakan aktivitas mendadak.
Ketika sistem mengharapkan perilaku jenis ini, spike test membantu untuk mengidentifikasi bagaimana sistem akan berperilaku dan apakah sistem akan bertahan dari lonjakan beban yang mendadak tersebut. Beban pada uji spike ini jauh lebih tinggi dari rata-rata dan mungkin akan fokus pada proses yang berbeda dibandingkan dengan jenis uji lainnya.
Pertimbangan
Saat mempersiapkan untuk melakukan spike test, pertimbangkan hal-hal berikut:
Fokus pada proses-proses kunci dalam jenis uji ini.
Evaluasi apakah lonjakan lalu lintas memicu proses yang sama atau berbeda dibandingkan dengan jenis uji lainnya. Sesuaikan logika uji sesuai dengan itu.
Uji ini sering kali tidak akan selesai.
Kesalahan umum terjadi dalam skenario ini.
Lakukan, sesuaikan, ulangi.
Ketika sistem Anda berisiko menghadapi peristiwa spike, tim harus menjalankan uji spike dan menyesuaikan sistem beberapa kali.
Monitor.
Pemantauan backend adalah suatu keharusan untuk hasil uji ini yang sukses.
Spike Testing di k6
Perbedaan utama dari spike test adalah simulasi lonjakan beban yang mendadak dan sangat tinggi. Uji ini tidak memiliki durasi dataran tinggi (full load) atau biasanya sangat singkat.
Terkadang, uji ini memerlukan durasi dataran tinggi untuk beberapa saat. Jika diperlukan, durasi tersebut umumnya pendek. Periode penurunan beban (ramp-down) juga bisa cepat atau tidak diperlukan karena tujuan utamanya adalah untuk mendadak meningkatkan beban pada sistem.
Pada uji spike, beban cepat meningkat ke level ekstrem. Periode penurunan beban mengikuti setelah uji mencapai maksimum, kembali ke 0 dengan cepat.
Uji spike mendapatkan namanya dari bentuk grafis beban yang ditunjukkan.
Analisis Hasil
Beberapa metrik kinerja yang perlu dievaluasi pada spike test termasuk kecepatan pod, waktu pemulihan setelah lonjakan beban, waktu untuk kembali ke normal, atau perilaku pada proses-proses penting sistem selama kelebihan beban.
Menemukan bagaimana sistem merespons (apakah bertahan) terhadap lonjakan mendadak membantu untuk mengoptimalkan sistem agar dapat bertahan selama peristiwa nyata. Pada beberapa peristiwa, beban bisa sangat tinggi sehingga seluruh sistem harus dioptimalkan untuk menangani proses-proses utama. Pada kasus-kasus seperti ini, ulangi uji hingga tingkat kepercayaan sistem tinggi.
Breakpoint Testing
Breakpoint testing bertujuan untuk menemukan batasan sistem. Beberapa alasan mengapa Anda mungkin ingin mengetahui batasan tersebut meliputi:
Untuk menyesuaikan atau merawat titik lemah sistem dan memindahkan batas-batas tersebut ke level yang lebih tinggi.
Untuk membantu merencanakan langkah-langkah perbaikan ketika sistem mendekati batas tersebut.
Dengan kata lain, mengetahui di mana dan bagaimana sistem mulai gagal membantu mempersiapkan diri menghadapi batasan tersebut.
Uji breakpoint meningkatkan beban hingga angka yang sangat tinggi secara tidak realistis. Uji ini umumnya harus dihentikan secara manual atau otomatis ketika ambang batas mulai gagal. Ketika masalah ini muncul, sistem telah mencapai batasnya.
Gambaran Umum Uji Breakpoint
Uji breakpoint adalah jenis pengujian lain yang tidak memiliki konsensus penamaan yang jelas. Dalam beberapa diskusi pengujian, ini juga dikenal sebagai pengujian kapasitas, titik beban, atau pengujian batas.
Kapan Melakukan Uji Breakpoint
Tim melakukan uji breakpoint kapan pun mereka perlu mengetahui batasan sistem mereka. Beberapa kondisi yang mungkin memerlukan uji breakpoint meliputi:
Kebutuhan untuk mengetahui apakah beban sistem akan terus tumbuh.
Jika konsumsi sumber daya saat ini dianggap tinggi.
Setelah perubahan signifikan pada kode sumber atau infrastruktur.
Seberapa sering uji jenis ini dilakukan tergantung pada risiko mencapai batasan sistem dan jumlah perubahan untuk penyediaan komponen infrastruktur.
Setelah uji breakpoint dilakukan dan batasan sistem telah diidentifikasi, Anda dapat mengulang uji tersebut setelah melakukan penyesuaian untuk memvalidasi bagaimana hal itu memengaruhi batasan. Ulangi siklus uji-penyesuaian sampai tim puas dengan hasilnya.
Pertimbangan
Hindari uji breakpoint di lingkungan cloud elastis.
Lingkungan elastis dapat berkembang seiring berjalannya uji, hanya menemukan batas dari tagihan akun cloud Anda. Jika uji ini dilakukan di lingkungan cloud, sangat disarankan untuk mematikan elastisitas di semua komponen yang terpengaruh.
Tingkatkan beban secara bertahap.
Peningkatan yang mendadak dapat menyulitkan untuk menentukan alasan dan waktu kapan sistem mulai gagal.
Kegagalan sistem dapat memiliki arti yang berbeda bagi tim yang berbeda.
Anda mungkin ingin mengidentifikasi masing-masing titik kegagalan berikut:
Kinerja menurun. Waktu respons meningkat dan pengalaman pengguna menurun.
Kinerja bermasalah. Waktu respons mencapai titik di mana pengalaman pengguna sangat terganggu.
Timeout. Proses gagal karena waktu respons yang sangat tinggi.
Kesalahan. Sistem mulai merespons dengan kode kesalahan HTTP.
Kegagalan sistem. Sistem mengalami keruntuhan.
Anda dapat mengulang uji ini beberapa kali.
Mengulang setelah setiap penyesuaian memungkinkan Anda untuk mendorong sistem lebih jauh.
Lakukan uji breakpoint hanya ketika sistem diketahui dapat berfungsi di bawah semua jenis uji lainnya.
Uji breakpoint mungkin menjadi lebih jauh jika sistem berfungsi buruk dengan jenis pengujian sebelumnya.
Breakpoint Testing di k6
Uji breakpoint sangat sederhana. Beban meningkat perlahan hingga tingkat yang sangat tinggi. Uji ini tidak memiliki dataran tinggi, penurunan beban, atau langkah lainnya. Dan biasanya gagal sebelum mencapai titik yang ditentukan.
k6 menawarkan dua cara untuk meningkatkan aktivitas: meningkatkan VU (Virtual Users) atau meningkatkan throughput (model terbuka dan tertutup). Berbeda dengan jenis uji beban lainnya, yang harus dihentikan ketika sistem mulai menurun, uji breakpoint terus meningkatkan beban meskipun sistem mulai menurun. Hal ini membuatnya disarankan untuk menggunakan ramping-arrival-rate untuk uji breakpoint.
Uji ini terus meningkatkan beban atau VU hingga mencapai titik breaking atau batas sistem yang telah ditentukan, pada titik tersebut uji dihentikan atau dibatalkan.
Analisis Hasil
Uji breakpoint harus menyebabkan kegagalan sistem. Uji ini membantu mengidentifikasi titik kegagalan sistem dan bagaimana sistem berperilaku setelah mencapai batasnya.
Setelah batasan sistem diidentifikasi, tim memiliki dua pilihan: menerima batasan tersebut atau menyesuaikan sistem.
Jika keputusan diambil untuk menerima batasan, hasil uji akan membantu tim mempersiapkan dan bertindak ketika sistem mendekati batasan tersebut.
Tindakan yang bisa diambil meliputi:
Mencegah pencapaian batas tersebut
Meningkatkan sumber daya sistem
Melakukan tindakan korektif terhadap perilaku sistem pada batasnya
Menyesuaikan sistem untuk memperpanjang batasnya
Jika tindakan yang diambil adalah menyesuaikan sistem, lakukan penyesuaian, kemudian ulangi uji breakpoint untuk menemukan di mana dan apakah batasan sistem telah bergeser.
Tim harus menentukan jumlah pengulangan uji breakpoint, sejauh mana sistem dapat disesuaikan, dan sejauh mana batasan sistem dapat disesuaikan setelah setiap latihan.
API Load Testing
Uji beban API umumnya dimulai dengan beban kecil pada komponen-komponen yang terisolasi. Seiring dengan berkembangnya pengujian, strategi Anda dapat mempertimbangkan bagaimana cara menguji API secara lebih lengkap. Dalam proses ini, Anda akan menguji API Anda dengan lebih banyak permintaan, durasi yang lebih lama, dan cakupan uji yang lebih luas—dari komponen terisolasi hingga alur kerja end-to-end yang lengkap.
Saat merancang pengujian API Anda, pertama-tama pertimbangkan mengapa Anda ingin menguji API tersebut:
Alur atau komponen apa yang ingin Anda uji?
Bagaimana Anda akan menjalankan pengujian tersebut?
Kriteria apa yang menentukan kinerja yang dapat diterima?
Setelah Anda dapat menjawab pertanyaan-pertanyaan ini, strategi pengujian API Anda kemungkinan akan mengikuti prosedur berikut:
Menulis Skrip Uji: Tulis alur pengguna, parameterisasi data uji, dan kelompokkan URL.
Memastikan Kinerja dan Kebenaran: Gunakan Cek untuk memastikan respons sistem dan gunakan Ambang Batas untuk memastikan sistem beroperasi sesuai dengan SLO (Service Level Objective) Anda.
Membuat Model dan Menghasilkan Beban: Pilih executor untuk memodelkan beban yang sesuai dengan tujuan pengujian Anda. Pastikan generator beban ditempatkan di lokasi yang tepat.
Iterasi Uji Suite Anda: Seiring waktu, Anda akan dapat menggunakan kembali logika skrip (misalnya, alur log-in pengguna atau konfigurasi throughput). Anda juga akan dapat menjalankan pengujian dengan cakupan yang lebih luas atau sebagai bagian dari suite pengujian otomatis Anda.
Bagian-bagian berikut memberikan penjelasan spesifik dan contoh-contoh langkah dalam proses ini.
Identifikasi Komponen yang Akan Diuji
Sebelum memulai pengujian, identifikasi komponen yang ingin Anda uji. Apakah Anda ingin menguji satu endpoint atau seluruh alur kerja?
Skrip berikut menggunakan modul HTTP k6 untuk menguji satu endpoint.
Ini adalah pengujian minimal, dengan satu panggilan ke satu komponen. Secara umum, suite pengujian Anda akan berkembang dari skrip seperti ini menuju alur kerja yang lebih kompleks dan lengkap. Dalam proses ini, suite pengujian Anda akan berkembang melalui piramida pengujian sebagai berikut:
Mengujii API yang Terisolasi: Menguji satu endpoint API seperti
ab
untuk menguji kinerja dasar, titik batas, atau ketersediaan. Jika komponen tidak memenuhi persyaratan kinerja, itu adalah hambatan. Secara umum, beban diatur dalam permintaan per detik.Mengujii API Terintegrasi: Menguji satu atau lebih API yang berinteraksi dengan API internal atau eksternal lainnya. Fokus Anda mungkin pada pengujian satu sistem atau berbagai sistem.
Mengujii Alur API End-to-End: Meniru interaksi realistis antara API untuk menguji sistem secara keseluruhan. Fokusnya sering kali pada skenario pengguna yang sering dan penting.
Suite uji beban Anda harus mencakup berbagai macam pengujian. Namun, saat memulai, mulailah dengan yang kecil dan sederhana, menguji API individual dan pengujian integrasi yang tidak rumit.
Menentukan Alasan Pengujian
Sebelum mengonfigurasi beban uji, Anda harus mengetahui pola lalu lintas seperti apa yang ingin Anda uji pada API tersebut. Uji beban biasanya bertujuan untuk melakukan salah satu dari dua hal:
Memvalidasi keandalan di bawah lalu lintas yang diharapkan.
Menemukan masalah dan batas sistem di bawah lalu lintas yang tidak biasa.
Misalnya, tim Anda mungkin membuat satu set uji untuk alur pengguna yang sering terjadi pada lalu lintas rata-rata, dan satu set lagi untuk menemukan titik kegagalan pada API. Meskipun logika pengujian tetap sama, bebannya bisa berubah.
Tujuan pengujian menentukan jenis pengujian, yang pada gilirannya menentukan beban pengujian. Pertimbangkan jenis-jenis pengujian berikut, yang sesuai dengan profil beban tujuan yang berbeda:
Pengujian Asap (Smoke Test): Memverifikasi bahwa sistem berfungsi dengan beban minimal.
Pengujian Beban “Rata-Rata” (Average Load Test): Menemukan bagaimana sistem berfungsi dengan lalu lintas yang tipikal.
Pengujian Stres (Stress Test): Menemukan bagaimana sistem berfungsi dengan beban lalu lintas puncak.
Pengujian Spike (Spike Test): Menemukan bagaimana sistem berfungsi dengan lonjakan lalu lintas yang mendadak dan besar.
Pengujian Breakpoint (Breakpoint Test): Secara progresif menaikkan lalu lintas untuk menemukan titik-titik kegagalan sistem.
Pengujian Soak (Soak Test): Menemukan apakah atau kapan sistem mengalami penurunan kinerja di bawah beban durasi panjang.
Jenis pengujian yang Anda pilih akan memberi petunjuk bagaimana Anda merencanakan dan menyusun pengujian Anda. Namun, setiap aplikasi, organisasi, dan proyek pengujian berbeda. Rekomendasi kami selalu:
“Mulailah dengan yang sederhana dan uji secara berkala. Iterasi dan kembangkan suite pengujian.”
Setelah Anda memutuskan profil beban, Anda dapat menjadwalkannya dengan opsi k6.
Memodelkan Beban Kerja
Untuk mengonfigurasi beban kerja, gunakan opsi uji. Beban uji mengonfigurasi lalu lintas yang dihasilkan oleh uji. k6 menyediakan dua cara utama untuk memodelkan beban:
Melalui pengguna virtual (VUs), untuk mensimulasikan pengguna yang bersamaan
Melalui permintaan per detik, untuk mensimulasikan throughput nyata dunia
Catatan
Secara umum, uji beban Anda harus menambahkan sleep time. Sleep membantu mengontrol generator beban dan mensimulasikan pola lalu lintas pengguna manusia dengan lebih baik.
Namun, ketika datang ke pengujian beban API, rekomendasi tentang slepp ini memiliki beberapa kualifikasi. Jika menguji komponen yang terisolasi, Anda mungkin hanya peduli tentang kinerja di bawah throughput yang telah ditentukan sebelumnya. Tetapi, bahkan dalam kasus ini, sleep dapat membantu Anda menghindari terlalu membebani generator beban, dan menyertakan beberapa milidetik acak sleep dapat menghindari masalah konkurensi yang tidak disengaja.
Saat menguji API terhadap alur kerja manusia normal, tambahkan sleep seperti pada pengujian normal.
Pengguna Virtual (Virtual Users)
Ketika Anda memodelkan beban berdasarkan VUs, opsi beban dasar adalah:
vus
duration
iterations
Anda dapat mendefinisikan opsi ini dalam skrip pengujian. Dalam pengujian berikut, 50 pengguna bersamaan menjalankan alur default secara terus-menerus selama 30 detik.
Laju Permintaan (Request Rate)
Saat menganalisis kinerja endpoint API, beban biasanya dilaporkan berdasarkan laju permintaan—baik permintaan per detik atau per menit.
Untuk mengonfigurasi beban kerja berdasarkan target laju permintaan, gunakan eksekutor constant-arrival-rate
.
constant-arrival-rate
menetapkan laju iterasi konstan yang mengeksekusi fungsi skrip. Setiap iterasi dapat menghasilkan satu atau beberapa permintaan.
Untuk mencapai target laju permintaan (RequestsRate), ikuti pendekatan ini:
Setel frekuensi laju ke unit waktu dari target. Per detik atau per menit.
Dapatkan jumlah permintaan per iterasi (RequestsPerIteration).
Setel laju iterasi ke target permintaan per detik dibagi dengan jumlah permintaan per iterasi.
rate = RequestsRate ÷ RequestsPerIteration
.
Untuk mencapai target 50 permintaan/detik dengan contoh sebelumnya:
Setel opsi
timeUnit
ke1s
.Jumlah permintaan per iterasi adalah 1.
Setel opsi
rate
ke 50/1 (sehingga menjadi 50).
Pengujian ini menghasilkan jumlah total permintaan HTTP dan RPS pada metrik http_reqs
:
Dengan eksekutor constant-arrival-rate
, beban tetap konstan selama pengujian. Untuk menaikkan atau menurunkan laju permintaan, gunakan eksekutor ramping-arrival-rate
sebagai gantinya.
Untuk semua cara memodelkan beban di k6, lihat Scenarios.
Verifikasi Fungsionalitas dengan Cek
Secara tradisional, uji kinerja lebih mengutamakan:
Latensi, seberapa cepat sistem merespons
Ketersediaan, seberapa sering sistem mengembalikan kesalahan
Metrik http_req_duration
melaporkan latensi, dan http_req_failed
melaporkan tingkat kesalahan untuk permintaan HTTP. Hasil uji sebelumnya memberikan hasil berikut:
Analisis uji Anda mungkin perlu melampaui apa yang tersedia dengan metrik default. Untuk analisis hasil yang lebih bermakna, Anda mungkin juga ingin memverifikasi fungsionalitas dan melaporkan kesalahan.
Beberapa kegagalan aplikasi hanya terjadi dalam kondisi beban tertentu, seperti lalu lintas yang tinggi. Kesalahan ini sulit ditemukan. Untuk menemukan penyebab kegagalan dengan lebih cepat, instrumentasikan API Anda dan verifikasi bahwa permintaan mendapatkan respons yang diharapkan. Untuk memverifikasi logika aplikasi di k6, Anda dapat menggunakan Cek.
Cek memvalidasi kondisi selama eksekusi uji. Sebagai contoh, Anda dapat menggunakan cek untuk memverifikasi dan melacak respons API. Dengan cek, Anda dapat mengonfirmasi respons API yang diharapkan, seperti status HTTP atau data yang dikembalikan.
Skrip untuk memverifikasi status respons HTTP, header, dan payload.
Dalam cuplikan ini, semua cek berhasil:
Setelah beban meningkat menjadi 300 permintaan per detik, hasilnya mengembalikan 8811 permintaan yang berhasil dan 7 kegagalan:
Secara default, cek yang gagal tidak akan menyebabkan kegagalan atau penghentian uji. Dalam hal ini, cek berbeda dari cara kerja asersi pada jenis pengujian lainnya. Uji beban dapat menjalankan ribuan atau jutaan iterasi skrip, masing-masing dengan puluhan asersi.
Beberapa tingkat kegagalan dapat diterima, sesuai dengan “jumlah sembilan” dari SLO Anda atau anggaran kesalahan organisasi Anda.
Uji Tujuan Keandalan Anda dengan Ambang Batas
Setiap uji coba harus memiliki tujuan. Organisasi teknik menetapkan tujuan keandalan mereka menggunakan Service Level Objectives (SLOs) untuk memvalidasi ketersediaan, kinerja, atau persyaratan kinerja lainnya.
SLO dapat didefinisikan pada berbagai cakupan, seperti pada tingkat komponen infrastruktur, API, atau seluruh aplikasi. Beberapa contoh SLO mungkin seperti:
99% API yang mengembalikan informasi produk merespons dalam waktu kurang dari 600ms.
99,99% permintaan login yang gagal merespons dalam waktu kurang dari 1000ms.
Desain uji beban Anda dengan kriteria lulus/gagal untuk memvalidasi SLO, tujuan keandalan, atau metrik penting lainnya. Untuk memastikan sistem Anda mencapai SLO-nya, uji secara teratur, baik di lingkungan pra-produksi maupun produksi.
Di k6, Anda dapat menggunakan Ambang Batas untuk menetapkan kriteria lulus/gagal uji coba. Skrip ini mengkodifikasi dua SLO dalam objek ambang batas, satu tentang tingkat kesalahan (ketersediaan) dan satu lagi tentang durasi permintaan (latensi).
Ketika k6 menjalankan uji coba, output uji coba menunjukkan apakah metrik berada dalam ambang batas, ✅, atau apakah melebihi batas, ❌. Dalam output ini, uji coba memenuhi kedua ambang batas.
Contoh Output:
Contoh Uji Gagal:
Jika uji gagal, CLI k6 akan mengembalikan kode keluar non-nol—syarat penting untuk otomatisasi uji coba. Berikut adalah contoh output untuk uji coba yang gagal dengan ambang batas bahwa 95 persen permintaan selesai dalam waktu kurang dari 50ms:
Pertimbangan Scripting
Jika Anda pernah menulis uji coba sebelumnya, penulisan skrip k6 seharusnya terasa familiar. Uji coba k6 ditulis dalam JavaScript, dan desain API k6 memiliki kesamaan dengan kerangka uji coba lainnya.
Namun, berbeda dengan uji coba lainnya, uji beban menjalankan skripnya ratusan, ribuan, atau bahkan jutaan kali. Kehadiran beban menciptakan beberapa kekhawatiran spesifik. Ketika Anda menguji API dengan k6, pertimbangkan aspek-aspek desain skrip berikut.
Parameterisasi Data
Parameterisasi data terjadi ketika Anda mengganti data uji yang telah diprogram dengan nilai dinamis. Parameterisasi mempermudah pengelolaan uji beban dengan pengguna dan panggilan API yang bervariasi. Sebagai contoh, pertimbangkan file JSON dengan daftar informasi pengguna:
Anda dapat melakukan parameterisasi data pengguna dengan objek SharedArray seperti berikut:
Penanganan Error dan Penerimaan Kegagalan
Ingat untuk mengimplementasikan penanganan error dalam logika uji coba. Di bawah beban yang cukup berat, SUT (sistem yang diuji) dapat gagal dan mulai merespons dengan kesalahan. Meskipun uji coba mungkin dirancang untuk menyebabkan kegagalan, terkadang kita fokus hanya pada skenario terbaik dan melupakan pentingnya mempertimbangkan error.
Skrip uji coba harus menangani kesalahan API untuk menghindari pengecualian saat runtime dan memastikan bahwa uji coba menguji bagaimana SUT berperilaku di bawah saturasi sesuai tujuan uji.
Penggunaan Kembali Skrip Uji dan Modularisasi
Uji beban dapat memiliki ruang lingkup yang sangat besar, dan seringkali melibatkan berbagai jenis uji coba. Tim biasanya memulai dengan uji coba beban yang sederhana atau kritis dan terus menambahkan uji untuk alur pengguna baru, pola lalu lintas, fitur, sistem, dll.
Untuk meminimalkan pekerjaan berulang, coba untuk menggunakan kembali skrip uji dan modularisasi fungsi serta logika uji.
Lokasi Generator Beban
Saat merencanakan uji coba, pertimbangkan lokasi generator beban Anda, yaitu mesin yang menjalankan uji coba. Terkadang, menjalankan uji coba dari lokasi tertentu merupakan persyaratan uji.
API Internal
Tes end-to-end API mencoba meniru alur pengguna dunia nyata, yang mengakses API publik dari sistem eksternal. API lainnya bersifat internal dan tidak dapat dijangkau dari luar. Anda dapat menggunakan k6 untuk mengujinya dalam beberapa cara berbeda.
Alat Pendukung
Anda mungkin ingin menggunakan k6 bersama dengan alat API lainnya untuk memperluas kemampuan pengujian Anda.
Recap & Praktek
Pengujian Performa API di Dunia Nyata dengan k6
K6 adalah alat pengujian performa open-source yang dirancang khusus untuk pengujian API dan aplikasi web. Berikut adalah panduan langkah demi langkah untuk melakukan pengujian performa API menggunakan k6:
Langkah 1: Instalasi k6
Pertama, Anda perlu menginstal k6 di sistem Anda:
Untuk Windows (menggunakan Chocolatey):
Untuk macOS (menggunakan Homebrew):
Untuk Linux (menggunakan apt):
Menggunakan Docker:
Cara Kerja k6 dan Mekanisme Pengelolaan Virtual Users
K6 adalah alat pengujian performa berbasis JavaScript yang didesain untuk mensimulasikan beban pada API, website, dan layanan backend. Berikut penjelasan tentang cara kerjanya, pengelolaan virtual users, dan eksekusi fungsinya:
1. Arsitektur dan Cara Kerja k6
K6 beroperasi dengan model eksekusi sebagai berikut:
JavaScript Runtime: K6 menggunakan mesin JavaScript Goja (Go-based JS interpreter) bukan Node.js atau browser. Ini memungkinkan pengelolaan memori yang lebih efisien dan performa yang lebih tinggi.
Event Loop: K6 mengadopsi model event loop mirip dengan Node.js tetapi dioptimalkan untuk pengujian beban.
Single Process, Multi-threaded: Secara default, k6 berjalan sebagai proses tunggal dengan multi-thread, yang memungkinkan penskalaan yang efisien pada mesin uji.
Execution Model: Setiap skenario pengujian dalam k6 didefinisikan dalam sebuah fungsi JavaScript, biasanya fungsi
default()
, yang mewakili satu iterasi dari aktivitas pengguna.
2. Pengelolaan Virtual Users (VUs)
Virtual User (VU) adalah abstraksi dari pengguna nyata dalam k6:
Isolasi: Setiap VU dijalankan dalam thread terpisah dan memiliki konteks JavaScript terpisah.
Independensi: VU berjalan independen satu sama lain, mirip dengan bagaimana pengguna nyata berperilaku.
Iterasi Berulang: Setiap VU akan mengeksekusi fungsi
default()
berulang kali selama durasi pengujian.Lifecycle VU:
Initialization: Membuat thread dan lingkungan JavaScript baru
Setup: Menjalankan fungsi
setup()
(jika ada) - ini dijalankan sekali sebelum semua VU mulaiExecution: Menjalankan fungsi
default()
berulang kaliTeardown: Menjalankan fungsi
teardown()
(jika ada) - ini dijalankan sekali setelah semua VU selesaiCleanup: Membersihkan sumber daya
3. Flow Pengelolaan VU Berdasarkan Skenario
K6 mendukung beberapa tipe executor (pengelola VU):
a. Shared Iterations
Cara Kerja: Semua VU bersaing untuk menyelesaikan sejumlah iterasi yang ditentukan
Flow:
Inisialisasi semua VU
Setiap VU mengeksekusi iterasi dari pool yang sama
VU yang lebih cepat akan mengeksekusi lebih banyak iterasi
b. Per VU Iterations
Cara Kerja: Setiap VU menjalankan jumlah iterasi yang sama
Flow:
Inisialisasi semua VU
Setiap VU mengeksekusi jumlah iterasi yang ditentukan secara independen
c. Constant VUs
Cara Kerja: Jumlah VU tetap konstan selama durasi yang ditentukan
Flow:
Inisialisasi semua VU
Semua VU mengeksekusi fungsi
default()
berulang kali selama durasi yang ditentukan
d. Ramping VUs (Stages)
Cara Kerja: Jumlah VU meningkat atau menurun selama durasi tertentu
Flow:
VU diinisialisasi atau dihentikan sesuai dengan tahapan yang dikonfigurasi
VU aktif mengeksekusi fungsi
default()
berulang kali
e. Arrival Rate
Cara Kerja: Menjaga tingkat kedatangan permintaan konstan (RPS - Requests Per Second)
Flow:
k6 secara dinamis mengelola VU untuk mencapai rate yang ditentukan
VU dibuat atau didaur ulang sesuai kebutuhan untuk mempertahankan rate
4. Berapa Kali Fungsi Dieksekusi
Jumlah eksekusi fungsi default()
tergantung pada konfigurasi skenario:
Untuk Shared Iterations:
Total eksekusi = jumlah iterasi yang dikonfigurasi
Contoh: 100 iterasi dengan 10 VU = 100 total eksekusi
Untuk Per VU Iterations:
Total eksekusi = jumlah VU × jumlah iterasi per VU
Contoh: 10 VU dengan 10 iterasi masing-masing = 100 total eksekusi
Untuk Constant VUs atau Ramping VUs:
Total eksekusi = ∑(jumlah VU pada waktu t × tingkat iterasi)
Iterasi terus berlanjut selama durasi pengujian
Contoh: 10 VU selama 60 detik dengan iterasi 1/detik = ~600 eksekusi
Untuk Arrival Rate:
Total eksekusi = tingkat kedatangan × durasi
Contoh: 30 iterasi/detik selama 60 detik = 1800 total eksekusi
5. Mekanisme Iterasi Internal
Saat k6 menjalankan fungsi default()
:
Iterasi Sekuensial: Setiap VU mengeksekusi fungsi
default()
secara sekuensial, tidak secara paralel.Kontrol Iterasi:
VU akan menjalankan iterasi berikutnya segera setelah iterasi saat ini selesai
Jika
sleep()
digunakan, VU akan menunggu waktu yang ditentukan sebelum iterasi berikutnyaTanpa
sleep()
, iterasi akan berjalan secepat mungkin dalam batas CPU dan jaringan
Throttling:
Fungsi
sleep()
digunakan untuk mensimulasikan jeda antar aksi penggunaTanpa throttling, tes akan menjalankan iterasi maksimum yang memungkinkan, yang mungkin tidak realistis
6. Contoh Perhitungan Eksekusi
Skenario: Constant VUs dengan 10 VU selama 60 detik
Jika setiap iterasi menggunakan
sleep(1)
(1 detik jeda):Satu VU dapat mengeksekusi ~60 iterasi selama 60 detik
10 VU akan mengeksekusi ~600 iterasi total
Jika setiap iterasi membutuhkan 200ms untuk menyelesaikan request +
sleep(1)
:Satu VU dapat mengeksekusi ~50 iterasi (1.2 detik per iterasi)
10 VU akan mengeksekusi ~500 iterasi total
Pemahaman tentang cara k6 mengelola VU dan eksekusi fungsi sangat penting untuk menyusun skenario pengujian yang akurat dan mencerminkan penggunaan dunia nyata. Dengan mengoptimalkan konfigurasi VU, Anda dapat mensimulasikan berbagai pola lalu lintas dan mengidentifikasi batasan performa aplikasi Anda.
Langkah 2: Membuat Skrip Pengujian Dasar
K6 menggunakan JavaScript untuk skrip pengujian. Buat file baru bernama api-test.js
:
Langkah 3: Konfigurasi Skenario Pengujian
Sesuaikan skrip untuk mengatur skenario pengujian yang sesuai dengan kebutuhan Anda:
Langkah 4: Menjalankan Pengujian
Jalankan pengujian Anda dengan perintah berikut:
Untuk menjalankan melalui Docker:
Langkah 5: Analisis Hasil
Setelah pengujian selesai, k6 akan menampilkan rangkuman hasil pengujian yang mencakup:
Request rate
Response time (min, max, median, p90, p95)
Tingkat keberhasilan/kegagalan
Metrik throughput
Validasi check
Langkah 6: Skenario Pengujian Lanjutan
1. Load Test (Pengujian Beban)
Pengujian untuk melihat performa sistem pada beban normal dan puncak:
2. Stress Test
Pengujian untuk mengetahui batas sistem dengan peningkatan beban secara bertahap:
3. Spike Test
Pengujian untuk mengevaluasi respons sistem terhadap lonjakan tiba-tiba:
4. Soak Test
Pengujian untuk memeriksa ketahanan sistem dalam durasi panjang:
Langkah 7: Pengujian Skenario Dunia Nyata
Berikut contoh skrip pengujian yang lebih realistis untuk API:
Langkah 8: Menambahkan Pemantauan dan Visualisasi
K6 dapat diintegrasikan dengan alat visualisasi seperti Grafana:
Jalankan k6 dengan output InfluxDB:
Gunakan dashboard Grafana yang telah dikonfigurasi untuk memvisualisasikan hasil pengujian secara real-time.
Penjelasan Metrik Penting dalam k6
K6 menyediakan berbagai metrik yang dapat Anda gunakan untuk mengevaluasi performa API:
http_reqs: Jumlah total permintaan HTTP
http_req_duration: Waktu total untuk permintaan (termasuk koneksi, TLS, mengirim, menunggu, menerima)
http_req_failed: Tingkat permintaan yang gagal
iterations: Jumlah iterasi fungsi default yang diselesaikan
vus: Jumlah virtual users aktif
http_req_waiting: Waktu menunggu response (Time to First Byte)
Tips Pengujian API di Dunia Nyata
Simulasikan penggunaan nyata: Buat skenario yang mencerminkan pola penggunaan aktual.
Gunakan data yang realistis: Hindari penggunaan data statis yang sama berulang kali.
Pertimbangkan caching: Evaluasi performa dengan dan tanpa caching.
Uji API endpoint penting: Fokus pada endpoint yang kritis untuk fungsi aplikasi.
Pertimbangkan throttling: Beberapa API memiliki batas rate limiting.
Alokasikan sumber daya yang cukup: Pastikan mesin pengujian memiliki sumber daya yang cukup.
Mulai kecil: Mulai dengan beban rendah dan tingkatkan secara bertahap.
Lakukan pengujian berulang: Jalankan pengujian beberapa kali untuk hasil yang konsisten.
Performa API sangat penting dalam aplikasi modern, dan k6 menyediakan alat yang kuat untuk memastikan API Anda dapat menangani beban yang diharapkan dengan andal. Dengan mengikuti langkah-langkah di atas, Anda dapat mengidentifikasi potensi masalah performa sebelum memengaruhi pengguna akhir.
Contoh Aplikasi CRUD
Aplikasi CRUD notes dengan stack Go (Chi), PostgreSQL, pgx pool, Squirrel query builder, dan Docker, serta load testing yang sesuai.
Jalankan perintah docker compose up -d --build
dan Jalankan load test k6 run load-test.js
Last updated