Ana içeriğe atla
Bu yazı, tecrübe gerektirmeden API’ler üzerinde yük testi yapmanın nasıl mümkün olduğunu açık kaynaklı k6 ve JMeter araçlarıyla anlatır.
  • API: Yazılımlar arası iletişimi sağlayan arayüz.
  • Yük Testi: Bir uygulamanın belirli bir yük altında performansını değerlendirmek için yapılan testler; dayanıklılık, hız ve genel performansı ölçer.
  • k6: Açık kaynaklı yük testi aracı; JavaScript tabanlı script, konsol tabanlı. Gerçekçi API trafiği simüle edip sistemin yük altındaki tepkisini ölçer.
  • JMeter: Açık kaynaklı, Java tabanlı yük testi aracı; GUI veya XML ile senaryo tanımlanır. Gerçekçi kullanıcı davranışları simüle edilir.
Aynı testleri hem k6 hem JMeter ile gerçekleştirip karşılaştıracağız.

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

ÖzellikJMeterk6
Dil ve yazım stiliJavaJavaScript
Kurulum ve başlatmaJRE, GUI tabanlıNode.js, konsol tabanlı
Performans ve ölçeklenebilirlikBüyük yük testleri, kaynak tüketimi yüksekHafif, ölçeklenebilir
Senaryo tanımlamaXML, GUI veya manuelJavaScript ile kodlama
Dağıtık testKapsamlı destekk6 Cloud veya özel ortamlar
RaporlamaGUI, grafikler, Grafana/InfluxDBKonsol, k6 Cloud, entegrasyonlar
ToplulukGeniş kullanıcı topluluğuHızla büyüyen topluluk
JMeter arayüzü grafik raporları, Backend listener, Grafana ve InfluxDB ile görselleştirme sunar. k6 konsol tabanlı olmakla birlikte birçok veri görselleştirme sistemi ve Grafana entegrasyonu ile kullanılabilir.

k6 temel test senaryoları

API endpoint’leri için yük testi, dayanıklılık testi, stres testi ve performans optimizasyonu senaryolarına ait örnekler aşağıdadır.

Yük testi

Aynı anda yüksek sayıda kullanıcı bağlantısını simüle eder.
import http from 'k6/http';
import { sleep } from 'k6';
export default function () {
  const numberOfUsers = 100;
  Array.from({ length: numberOfUsers }, (_, index) => {
    http.get(`https://example.com/page${index}`);
    sleep(1);
  });
}

Dayanıklılık testi

Belirli süre boyunca sabit yük altında uygulamanın stabil çalışmasını simüle eder.
import http from 'k6/http';
import { sleep } from 'k6';
export default function () {
  while (1) {
    http.get('https://example.com');
    sleep(1);
  }
}

Stres testi

Ani trafik artışları veya kullanıcı sayısındaki hızlı değişimleri simüle eder.
import http from 'k6/http';
import { sleep } from 'k6';
export default function () {
  const numberOfUsers = __VU * 10;
  Array.from({ length: numberOfUsers }, (_, index) => {
    http.get(`https://example.com/page${index}`);
    sleep(0.1);
  });
}

Örnek k6 senaryosu (aşamalı yük)

import http from 'k6/http';
import { check, sleep } from 'k6';
export let options = {
  stages: [
    { duration: '30s', target: 500 },
    { duration: '1m', target: 50 },
    { duration: '30s', target: 0 },
  ],
};
export default function () {
  let methods = ['GET', 'POST', 'PUT', 'DELETE'];
  let method = methods[Math.floor(Math.random() * methods.length)];
  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)];
  let res = http.request(method, endpoint);
  check(res, { 'is status 200': (r) => r.status === 200 });
}
Çalıştırma: k6 run k6_load_test.js k6 sonuç metrikleri (özet): http_reqs (toplam istek), http_req_duration (yanıt süresi), http_req_failed, iterations, vus/vus_max, checks, data_received/data_sent, p(90)/p(95) (yüzdelik dilimler). Bu metrikler API’nizin yük altındaki performansını ve darboğazları değerlendirmenize yardımcı olur. k6, Prometheus ve Grafana ile sistem metrikleriyle birlikte görselleştirilebilir. Kurulum: k6 kurulum rehberi (Windows, Mac, Linux).

JMeter temel test senaryoları

JMeter’da Threads (istemci sayısı), Loop (döngü sayısı) ve Ramp-up Period (yükleme süresi) değerleri girilir. API performans testi: Threads = API’ye eşzamanlı istek sayısı (örn. 500); Loop = her istemcinin tekrarlama sayısı; Ramp-up = tüm istemcilerin başlatılma süresi. Ek senaryolar: (1) İstek sayısını artırarak yük simülasyonu, (2) Maksimum yük testi, (3) Uzun süreli yük testi, (4) Farklı istek türleri (GET, POST, PUT, DELETE), (5) Ortalama yanıt süresi testi, (6) Hata yönetimi testi, (7) Zamanlayıcı ile periyodik testler. JMeter hem GUI’den RUN hem de terminalden çalıştırılabilir; sonuçlar CSV’ye yazılabilir:
jmeter -n -t /path/to/TEST_NAME.jmx -l /path/to/RECORD_NAME.csv
JMeter sonuç metrikleri (özet): summary (toplam istek), total time, ortalama istek/saniye, ortalama/min/max yanıt süresi, hata sayısı ve yüzdesi, aktif/başlatılan/tamamlanan istek sayıları. Kurulum: JMeter kurulum rehberi (Windows, Mac, Linux).

JMeter ve k6 performans testi sonuçlarının karşılaştırılması

ÖzellikJMeterk6
Test ortamıBağımsız testYerel ortam
Test süresiÖrn. 2 dk 41 snÖrn. 3 dk
Hedef kullanıcılarMaks. 500 eşzamanlı500’e kadar yükselme
Toplam istekÖrn. 25.000Örn. 180.077
Ortalama yanıt süresiÖrn. 11,44 snÖrn. 242 ms
En yüksek yanıt süresiÖrn. 21,15 snÖrn. 33,68 sn
HızÖrn. 169,6 istek/snÖrn. 857,45 istek/sn
Not: Değerler örnek test ortamına göre değişir.

Sonuçlar

JMeter, daha düşük istek hızına rağmen yüksek eşzamanlı kullanıcı sayılarını destekler; büyük ölçekli uygulamalar için uygundur. k6 daha yüksek istek hızı sunar ve başarısız istek oranını minimize etmeye elverişlidir; hızlı yanıt gerektiren senaryolar için tercih edilebilir. Hangi aracın kullanılacağı test gereksinimlerine, hedeflenen metrikler ve uygulama yapısına bağlıdır. Her iki araç da farklı senaryolara uygun olarak kullanılabilir ve performans testlerinde değerli bilgiler sağlar. Bu araçlarla kendi yük testlerinizi yaparak uygulamalarınızın performansını değerlendirebilirsiniz.