Bu yazı, tecrübe gerektirmeden API'ler üzerinde yük testi yapmanın nasıl mümkün olduğunu hızlı ve açık kaynaklı sistemlerden olan k6 ve JMeter araçlarıyla anlatır.

API nedir ? API (Application Programming Interface), yazılımlar arası iletişimi sağlayan bir arayüzdür. 

Yük Testi nedir? Yük Testi, bir uygulamanın belirlibir yük altında performansını değerlendirmek için yapılan testlerdir. Bu testler, uygulamanın dayanıklılığını, hızını ve genel performansını değerlendirmeyi amaçlar.

k6 nedir ? k6, açık kaynaklı bir yük testi aracıdır ve uygulamaların performansını ölçmek için kullanılır. JavaScript tabanlı bir script dilini kullanır ve kullanıcı dostu bir arayüz sunar. k6 ile gerçekçi API trafiği simüle edebilir ve sisteminizin yük altında nasıl tepki verdiğini ölçebilirsiniz. Performans sorunlarını kullanıcılarınızı etkilemeden önce tanımlayıp düzeltebilmek için çok deneyimli olmanızda gerekmiyor.

JMeter nedir ? JMeter, açık kaynaklı bir yük testi aracıdır ve uygulamaların performansını ölçmek için kullanılır. Java tabanlı bir araç olan JMeter, kullanıcı dostu bir arayüz sunar ve performans testlerini oluşturmak ve yönetmek için geniş bir yelpazede kullanılabilir. JMeter, gerçekçi kullanıcı davranışlarını simüle etmek için esnek bir yapı sunar ve sisteminizin yük altında nasıl tepki verdiğini ölçmenizi sağlar. Performans sorunlarını tespit edip çözmek için deneyimli olmanıza gerek yoktur; ancak deneyimli kullanıcılar, JMeter'ı karmaşık senaryoları test etmek için kullanabilirler.

Aynı testleri hem k6 hem de JMeter ile gerçekleştirip, her birinin avantajlarını ve dezavantajlarını karşılaştıracağız.

Aşağıdaki tabloda kurulum, tanımlama, kapsam ve destek gibi metriklerde bu iki aracın genel bir karşılaştırma tablosu bulunmaktadır.


Grafana k6 ve Apache JMeter Karşılaştırması

ÖzelliklerJMeterk6
Dil ve Yazım Stili

Java

JavaScript
Kurulum ve BaşlatmaJRE gerektirir, GUI tabanlıNode.js gerektirir, Konsol tabanlı
Performans ve ÖlçeklenebilirlikBüyük yük testleri, kaynak tüketimi yüksekHafif, ölçeklenebilir, daha iyi ölçeklenebilir
Senaryo TanımlamaXML tabanlı, GUI veya manuel XMLJavaScript dilinde kodlama
Dağıtık Test DesteğiKapsamlı destek, dağıtık test yönetimiDağıtık test desteği k6 Cloud veya özel dağıtık ortamlar
Raporlama ve AnalizGUI tabanlı, grafiksel analiz araçlarıKonsol tabanlı, k6 Cloud ve entegrasyonlar
Topluluk ve DestekGeniş kullanıcı topluluğu, belgelendirmeHızla büyüyen topluluk


JMeter arayüzü, kullanıcılar için çeşitli veri görselleştirme imkanları sunar. Backend listener, grafik raporları, JMeter eklentileri, Grafana ve InfluxDB kullanılabilir.



k6, konsol tabanlı bir kullanımın yanında aşağıdaki görseldeki gibi birçok veri görselleştirme sistemi ve yöntemiyle de kullanılabilir.



Bu testleri Windows bir makinede hızlıca gerçekleştirmek mümkündür.

K6 için test.js dosyasını oluşturacak ve k6 test sonuçlarını terminalde standart çıktı olarak alacağız.

JMeter için ise testleri hem arayüz üzerinden hem de terminal üzerinden uygulayacağız.

k6 Temel Test Senaryoları 


API endpointleri için bazı K6 yük testi senaryolarına ait basit Javascript kodlarını inceleyeğiz. Bu senaryolar yük testi, dayanıklılık testi, stres testi ve performans optimizasyonudur.

Yük Testi

Yük testi, bir HTTP metodu ile erişilen web sunucusuna aynı anda yüksek sayıda kullanıcı bağlandığı durumu simüle eder.

k6, web uygulamalarının belirli bir yük altında nasıl performans gösterdiğini değerlendirmek için kullanılabilir: 

import http from 'k6/http';
import { sleep } from 'k6';
export default function () {
 // Simüle edilen kullanıcı sayısını ifade eder
 // Anlık kullanıcı sayısını senaryonuza göre düzenleyebilirsiniz
 const numberOfUsers = 100;
 // Her bir kullanıcı için aynı anda yapılan GET isteği
 Array.from({ length: numberOfUsers }, (_, index) => {
 http.get(`https://example.com/page${index}`);
 sleep(1);
 });
}
JS

Dayanıklılık Testi

Dayanıklılık Testi, belirli bir süre boyunca devam eden bir yük testi senaryosu oluşturur ve uygulamanın ne kadar süre boyunca stabil bir şekilde çalışabildiğini simüle eder.

k6, web uygulamalarının belirli bir süre boyunca sabit bir yük altında sistem performansını değerlendirebilir:

import http from 'k6/http';
import { sleep } from 'k6';
export default function () {
 // Belirli bir süre boyunca sabit bir yük altında test için “minute” cinsinden süreyi ayarlayabilirsiniz
 const testDuration = '1m';
 // Her bir kullanıcı için aynı anda yapılan GET isteği
 while (1) {
 http.get('https://example.com');
 sleep(1);
 }
}
JS

Stres Testi

Stres Testi, uygulamanın sınırlarını ölçmek için ani trafik artışları veya kullanıcı sayısındaki hızlı değişiklikleri simüle eder.

k6, web uygulamalarının sistem kapasitesini aşan anlık bir yük altında nasıl davrandığını değerlendirebilir:

import http from 'k6/http';
import { sleep } from 'k6';
export default function () {
 // Ani trafik artışlarını simüle etmek için anlık kullanıcı yüklenme sayısını artırabilirsiniz
 const numberOfUsers = __VU * 10;
 // Her bir kullanıcı için aynı anda yapılan GET isteği
 Array.from({ length: numberOfUsers }, (_, index) => {
 http.get(`https://example.com/page${index}`);
 sleep(0.1);
 });
}
JS

Performans Optimizasyon Testi

Performans Optimizasyon Testi, uygulamada belirli optimizasyonlar yapıldıktan sonra performans artışını simüle etmek için uygundur.

K6, web uygulamalarının performansını artırmak amacıyla yapılan kod değişiklikleri veya altyapı güncellemelerinin etkilerini değerlendirmek için kullanılabilir: 

import http from 'k6/http';
import { sleep } from 'k6';
export default function () {
 // Optimizasyon yapılan sayfa
 const optimizedPage = 'https://example.com/optimized-page';
 // Her bir kullanıcı için aynı anda yapılan GET isteği
 Array.from({ length: 100 }, () => {
 http.get(optimizedPage);
 sleep(0.1);
 });
}
JS


Bu senaryoları içeren daha kapsamlı bir test senaryosu için örnek k6 test scriptini uygulamalı olarak görelim. 


Javascript ile çalışan k6 için k6_load_test.js dosyasını oluşturalım. Devamında dosyanın içine aşağıdaki test kodunu atalım:

import http from 'k6/http';
import { check, sleep, group } from 'k6';
export let options = {
 stages: [
 { duration: '30s', target: 500 }, // 90 saniye boyunca 500 kullanıcı
 { duration: '1m', target: 50 }, // 60 saniye boyunca 50 kullanıcı
 { duration: '30s', target: 0 }, // 30 saniye boyunca 0 kullanıcı (ramp down)
 ],
};
export default function () {
 // Random olarak bir HTTP metodu seç
 let methods = ['GET', 'POST', 'PUT', 'DELETE'];
 let method = methods[Math.floor(Math.random() * methods.length)];
 // Random olarak bir API endpoint'i seç
 let endpoints = [
 'https://example.com/k6_load_test/get',
 'https://example.com/k6_load_test/post',
 'https://example.com/k6_load_test/put',
 'https://example.com/k6_load_test/delete',
 ];
 let endpoint = endpoints[Math.floor(Math.random() * endpoints.length)];
 // Yük testi için HTTP isteği yap
 let res = http.request(method, endpoint);
 // HTTP cevabını kontrol et
 check(res, {
 'is status 200': (r) => r.status === 200,
 });
 // Kısa bir süre bekleme ekleyerek sabit bir yük altında çalışmayı simüle et
 // sleep(1);
}
JS


Yukarıdaki k6 test kodu, belirli bir API üzerinde gerçekleştirilen yük testini simüle eder.

Test, belirli bir süre boyunca (toplamda 3 dakika) aşamalı olarak artan sanal kullanıcı sayısında HTTP isteklerini gerçekleştirir.

İlk aşamada 30 saniye boyunca 500 sanal kullanıcı, ardından bir dakika boyunca 50 sanal kullanıcı ve son olarak 30 saniye boyunca hiçbir sanal kullanıcı olmayacak şekilde azalır.

Her bir sanal kullanıcı, rastgele seçilen HTTP metodu (GET, POST, PUT, DELETE) ve API endpoint kombinasyonları üzerinden HTTP isteği yapar. Yapılan her isteğin HTTP cevabı kontrol edilir, ve eğer cevap kodu 200 ise başarılı kabul edilir.

Her bir isteğin ardından kısa bir bekleme süresi (1 saniye) eklenerek sabit bir yük altında çalışma simüle edilir.


Kodu çalıştıralım:

k6 run k6_load_test.js
XML


k6 komut dosyası çalıştırıldıktan sonra aşağıdaki gibi bir çıktı alınır. Terminal çıktısında aldığınız ölçümler, API'nizin yük altında nasıl performans gösterdiğine ilişkin bilgiler sağlar ve herhangi bir darboğaz veya sorunu belirlemenize yardımcı olabilir.


k6 Sonuç Çıktısı


k6 test sonucu metrik değerleri ne anlama gelir ?


Grafana k6 Sonuç Metrikleri

MetrikAçıklamaDeğer
checksBelirli bir HTTP durumu veya başka bir kontrolü içerir46 MB
data_receivedSenaryo boyunca alınan toplam veri miktarını gösterir23 MB
data_sentSenaryo boyunca gönderilen toplam veri miktarını gösterir180.077
http_req_blockedHTTP isteği bloke edilirken geçen süreyi gösterirOrtalama 9.42ms
http_req_connectingHTTP isteğinin sunucu ile bağlantı kurma süresini gösterirOrtalama 5.04 ms
http_req_durationHTTP isteğinin tamamlanma süresini gösterirOrtalama 242.36 ms
http_req_failedBaşarısız HTTP isteklerinin sayısını gösterir0
http_req_receivingHTTP isteğinin sunucudan gelen veriyi alma süresini gösterir216.14 µs
http_req_sendingHTTP isteğinin veriyi sunucuya gönderme süresini gösterir52.92 µs
http_req_tls_handshakingHTTP isteğinin TLS el sıkışma süresini gösterirOrtalama 4.37 ms
http_req_waitingHTTP isteğinin sunucudan bir yanıt beklerken geçirdiği süreyi gösterirOrtalama 242.09 ms
http_reqsSenaryo boyunca yapılan toplam HTTP isteği sayısını gösterir180.077
iteration_durationSenaryo içinde bir iterasyonun tamamlanma süresini gösterir252.11 ms
iterationsSenaryo içinde tamamlanan toplam iterasyon sayısını gösterir180.077
vusŞu an çalışan sanal kullanıcı (VU) sayısını gösterirMin: 1, Maks: 499
vus_maxSenaryo boyunca maksimum sanal kullanıcı sayısını gösterir500
p(90)Veri setinin en düşük %90'ını temsil eden değeri ifade eder
p(95)Veri setinin en düşük %95'ini temsil eden değeri ifade eder


Bu çıktılar ışığında API veya API sağlayıcı servisiniz için yapılması gereken geliştirmeleri planlayabilirsiniz.

k6 esnek test senaryoları oluşturmak için en önemli araçlardan biridir. Script kodlama ile oluşturulan bu senaryolar yazılım sınırları kadar geniş ve uçsuzdur.

k6 testi sırasında veri görselleştirme, Kubernetes üzerinde çalışan sistemler de Prometheus ile alınan sistem çalışma metrikleri Grafana ile aşağıdaki gibi görselleştirilebilmektedir.

Grafana Sistem Metrikleri


Windows, Mac ve Linux da k6 kullanmak için https://k6.io/docs/get-started/installation/ adresini ziyaret ediniz.

JMeter Temel Test Senaryoları

JMeter genel test senaryoları için arayüz üzerinde Threads (Thread Grubu Sayısı), Loop (Döngü Sayısı) ve Ramp-up Period (Yükleme Süresi) değerleri girilmelidir. 


JMeter Threads Özellikleri

API Performans Testi:

Threads: API'ye gönderilen isteklerin sayısıdır. Örneğin, 500 veya daha fazla istemci iş parçacığı olabilir.
Loop: Her istemcinin belirli bir işlemi kaç kez tekrarlayacağını belirler. Genellikle 1 olarak ayarlanır, çünkü her istek farklı olabilir.
Ramp-up Period: Tüm istemcilerin ne kadar sürede başlatılacağını belirler. Örneğin, 500 istemciyi 6 saniyede başlatmak için 360 olarak ayarlanabilir.

Ek olarak API Performans testi senaryoları:

1.İstek Sayısı Artırma:

Belirli bir süre içinde API'ye gönderilen istek sayısını artırarak, her saniye artan bir istek yükü simüle edilebilir.

2.Maksimum Yük Testi:

API'ye maksimum erişim yükünü simüle ederken, API'ye aynı anda en fazla erişen istemci sayısını belirleyerek API'nin bu yük altında nasıl davrandığını gözlemlenebilir.

3.Uzun Süreli Yük Testi:

API'ye belirli bir süre boyunca sürekli olarak istek göndermek, API'nin uzun süreli yük altında nasıl performans gösterdiğini belirlemek için kullanılabilir.

4.Farklı İstek Türleri Testi:

API'ye farklı türde isteklerle test gerçekleştirilebilir. Örneğin GET, POST, PUT, DELETE gibi farklı HTTP metodlarını ve farklı istek gövdelerini içeren senaryolar oluşturulabilir.

5.Ortalama Yanıt Süresi Testi:

Belirli bir yük altında API'nin ortalama yanıt süresini test ederek, API'nin genel performansını değerlendirilebilir.

6.Hata Yönetimi Testi:

API'nin belirli bir yük altında hata durumlarını nasıl işlediğini test etmek, yanlış biçimlendirilmiş istekler veya yetkilendirme hataları gibi senaryoları simüle edebilir.

7.Zamanlayıcı Testler:

Belirli bir zaman aralığında API'ye istek göndererek, bir gün boyunca API'nin nasıl performans gösterdiğini izlemek için bir zamanlayıcı kullanılabilir.


JMeter arayüzünde RUN komutu ile bu testler başlatılabildiği gibi terminal üzerinden de bu testler çalıştırılabilir. Ayrıca test içerikleri csv formatında kaydedilebilir. Aşağıdaki komut ile bu işlem gerçekleştirilir.

jmeter -n -t \Users\YOUR_USER\path\apache-jmeter-5.6.3\apache-jmeter-5.6.3\backups\TEST_NAME.jmx -l \Users\YOUR_USER\path\apache-jmeter-5.6.3\apache-jmeter-5.6.3\backups\RECORD_NAME.csv
XML


Komut çalıştırıldıktan sonra aşağıda bulanan görseldeki gibi bir çıktı elde edilir.


JMeter Sonuç Çıktısı


JMeter test sonucu metrik değerleri ne anlama gelir ?

Apache JMeter Sonuç Metrikleri

MetrikAçıklamaDeğer
summaryToplam İstek6247
total timeToplam Süre (167 sn)167 sn
Ortalama İstek/SaniyeOrtalama İstek/Saniye (381.3 istek)381.3 istek/dk
OrtalamaOrtalama Yanıt Süresi (749 ms)749 ms
MinEn Düşük Yanıt Süresi (101 ms)101 ms
MaxEn Yüksek Yanıt Süresi (4281 ms)4281 ms
ErrHata Sayısı (0)0
Hata YüzdesiHata Yüzdesi (%0.00)%0.00
AktifAktif İstek Sayısı (172)172
BaşlatılanBaşlatılan İstek Sayısı (1365)1365
TamamlananTamamlanan İstek Sayısı (1193)1193


Bu çıktılar ışığında API veya API sağlayıcı servisiniz için yapılması gereken geliştirmeleri planlayabilirsiniz.

Ayrıca JMeter arayüzünde aşağıdaki görselde bulunan sonuç tablosu gibi detaylı çıktılar elde edebilirsiniz.


JMeter Sonuç Tablosu


Windows, Mac ve Linux da JMeter'i kullanmak için https://www.simplilearn.com/tutorials/jmeter-tutorial/jmeter-installation adresini ziyaret ediniz.

JMeter ve K6 Performans Testi Sonuçlarının Karşılaştırılması

Performans testi, bir sistem veya uygulamanın belirli koşullar altında nasıl performans gösterdiğini değerlendirmek için kullanılan önemli bir süreçtir. Bu testler, farklı araçlar kullanılarak gerçekleştirilebilir. Bu yazıda, JMeter ve K6 olmak üzere iki farklı performans test aracının sonuçlarını karşılaştıracağız. Karşılaştırma ölçütleri test ortamı, test süresi, hedef kullanıcılar, istatistikler, ortalama yanıt süresi, en yüksek yanıt süresi ve hız şeklindedir.


Grafana k6 ve Apache JMeter Test Sonuçları Karşılaştırması

ÖzelliklerJMeterk6
Test OrtamıBağımsız test olarak çalıştırıldı.Yerel ortamda çalıştırıldı.
Test SüresiToplam 2 dakika 41 saniye çalıştı.Toplam 3 dakika çalıştı.
Hedef KullanıcılarMaksimum 500 eşzamanlı kullanıcı.500 eşzamanlı kullanıcıya kadar yükselme yapıldı.
Toplam İstek Sayısı25.000 istek gerçekleştirildi.180.077 istek gerçekleştirildi.
Ortalama Yanıt Süresi11.441 milisaniye.242.36 milisaniye.
En Yüksek Yanıt Süresi21.153 milisaniye.33.68 saniye.
Hız169.6 istek/saniye.857.45 istek/saniye.

Sonuçlar

JMeter ve k6 performans test sonuçlarını incelediğimizde, her iki aracın da farklı güçlü yönleri olduğunu görebiliriz.

JMeter, daha düşük bir istek hızına sahip olmasına rağmen, yüksek eşzamanlı kullanıcı sayılarını destekleyebilir. Bu özelliği, büyük ölçekli uygulamaların test edilmesi için idealdir. Öte yandan, k6 daha yüksek bir istek hızına sahiptir ve başarısız istek oranını minimize etmiştir. Bu da özellikle hızlı yanıt gerektiren uygulamalar için tercih edilebilir.

Hangi aracın kullanılacağı, test gereksinimlerine, hedeflenen metriklere ve uygulamanın yapısına bağlı olacaktır. Örneğin, eğer yüksek eşzamanlı kullanıcı sayılarıyla test yapılacaksa JMeter tercih edilebilir; ancak hız ve başarısız istek oranı kritikse, k6 daha uygun olabilir. Her iki araç da farklı senaryolara uygun olarak kullanılabilir ve performans testlerinde değerli bilgiler sağlayabilir.

Bu yazıda k6 ile JMeter'in performans test araçları olarak nasıl kullanılabileceğinden bahsettik. Ayrıca, her iki araçla örnek bir yük testi senaryosu gerçekleştirip sonuçlarını karşılaştırdık.

Siz de bu araçlarla yük testleri gerçekleştirebilir ve uygulamalarınızın performansını değerlendirebilirsiniz.