DEV Community

Cover image for Artillery Yük Testi: API'ler İçin Pratik Kılavuz
Tobias Hoffmann
Tobias Hoffmann

Posted on • Originally published at apidog.com

Artillery Yük Testi: API'ler İçin Pratik Kılavuz

Artillery, basit bir YAML dosyasıyla API’nize yüksek eşzamanlı trafik gönderen açık kaynaklı bir Node.js yük testi aracıdır. Yük aşamalarını, sanal kullanıcı akışlarını ve istekleri tanımlarsınız; ardından artillery run script.yml çalıştırıp gecikme yüzdeliklerini, istek oranlarını ve hata sayılarını incelersiniz. Bu rehberde Artillery v2 kurulumu, gerçekçi test betiği yazımı, sonuçların alınması ve CI entegrasyonu adım adım ele alınır.

Apidog'u bugün deneyin

Artillery Nedir ve Ne Zaman Kullanılır?

Artillery, API uç noktalarınıza istek gönderen sanal kullanıcılar üretir. Her sanal kullanıcı, gerçek bir istemci gibi tanımlı senaryoyu sırayla çalıştırır.

Artillery özellikle şu sorular için kullanışlıdır:

  • 50 RPS altında p95 gecikmesi nasıl değişiyor?
  • Hatalar hangi trafik seviyesinde başlıyor?
  • API beş dakikalık sürekli yük altında stabil kalıyor mu?
  • Kuyruk gecikmeleri p99 seviyesinde kabul edilebilir mi?

Artillery’nin avantajı, testlerin bildirimsel olmasıdır. Eşzamanlılık döngülerini elle kodlamak yerine yük profilini YAML içinde tanımlarsınız. Node.js çalışan her ortamda çalıştığı için aynı betiği yerelde ve CI’da kullanabilirsiniz.

Araç seçimi yapıyorsanız en iyi yük testi araçları özeti ve yük testi yazılımı karşılaştırması k6, JMeter, Gatling ve diğer seçenekleri karşılaştırır.

Artillery Kurulumu v2

Artillery’nin npm paket adı artillery’dir. Güncel ana sürüm v2’dir.

npm install -g artillery@latest
artillery version
Enter fullscreen mode Exit fullscreen mode

Güncel bir Node.js LTS sürümü kullanın. Artillery Windows, macOS ve Linux üzerinde çalışır.

Global kurulum istemiyorsanız npx ile çalıştırabilirsiniz:

npx artillery@latest run script.yml
Enter fullscreen mode Exit fullscreen mode

İlk Artillery Test Betiğini Yazma

Bir Artillery betiği temel olarak iki bölümden oluşur:

  • config: hedef API, yük profili ve veri kaynakları
  • scenarios: her sanal kullanıcının çalıştıracağı istek akışı

Aşağıdaki örnek üç aşamalı bir test çalıştırır: ısınma, zirveye yükselme ve sürekli yük.

config:
  target: "https://api.example.com"
  phases:
    - name: "Warm up"
      duration: 60
      arrivalRate: 5
    - name: "Ramp to peak"
      duration: 120
      arrivalRate: 5
      rampTo: 50
    - name: "Sustained load"
      duration: 300
      arrivalRate: 50
      maxVusers: 500
  variables:
    productId:
      - "1001"
      - "1002"

scenarios:
  - name: "Browse and create order"
    flow:
      - get:
          url: "/v1/products/{{ productId }}"
      - post:
          url: "/v1/orders"
          json:
            productId: "{{ productId }}"
            quantity: 2
Enter fullscreen mode Exit fullscreen mode

config Bölümü Nasıl Çalışır?

config.target, tüm istekler için temel URL’dir. Senaryodaki url değerleri bu hedefe eklenir.

Örneğin:

target: "https://api.example.com"
Enter fullscreen mode Exit fullscreen mode

ve şu istek:

url: "/v1/products/1001"
Enter fullscreen mode Exit fullscreen mode

şu adrese gider:

https://api.example.com/v1/products/1001
Enter fullscreen mode Exit fullscreen mode

Sık kullanılan phases alanları

phases:
  - duration: 60
    arrivalRate: 5
  - duration: 120
    arrivalRate: 5
    rampTo: 50
Enter fullscreen mode Exit fullscreen mode

En sık kullanacağınız alanlar:

  • duration: aşama süresi. Saniye veya "5m" gibi okunabilir değer alabilir.
  • arrivalRate: saniyede başlatılacak yeni sanal kullanıcı sayısı.
  • rampTo: arrivalRate değerini aşama boyunca hedef değere doğrusal olarak artırır.
  • arrivalCount: saniye başına oran yerine aşama boyunca toplam VU sayısı verir.
  • maxVusers: aynı anda çalışabilecek maksimum sanal kullanıcı sayısı.
  • name: çıktıda görünen aşama etiketi.

Dikkat edilmesi gereken nokta: duration, Artillery’nin yeni sanal kullanıcı üretmeye devam edeceği süreyi belirtir. Testin gerçek bitiş süresi daha uzun olabilir. Bir sanal kullanıcı aşamanın sonuna yakın başlarsa, kendi senaryosu tamamlanana kadar test devam eder.

scenarios Bölümü Nasıl Çalışır?

scenarios, sanal kullanıcıların çalıştıracağı akışları tanımlar.

scenarios:
  - name: "Browse and create order"
    flow:
      - get:
          url: "/v1/products/{{ productId }}"
      - post:
          url: "/v1/orders"
          json:
            productId: "{{ productId }}"
            quantity: 2
Enter fullscreen mode Exit fullscreen mode

Her senaryoda genellikle şu alanlar bulunur:

  • name: senaryo adı
  • flow: sıralı istek adımları
  • weight: birden fazla senaryo varsa seçilme olasılığını belirler

HTTP adımları şu anahtarları kullanır:

  • get
  • post
  • put
  • delete
  • patch

İstek gövdesi için json kullanılır. Değişkenler çift süslü parantez ile çağrılır:

productId: "{{ productId }}"
Enter fullscreen mode Exit fullscreen mode

CSV Dosyasından Test Verisi Kullanma

Basit testlerde değişkenleri YAML içinde tanımlamak yeterlidir. Daha gerçekçi yük testlerinde kullanıcı, ürün veya oturum verilerini CSV’den beslemek daha uygundur.

Örnek users.csv:

email,password
user1@example.com,secret1
user2@example.com,secret2
Enter fullscreen mode Exit fullscreen mode

Artillery betiği:

config:
  target: "https://api.example.com"
  payload:
    path: "./users.csv"
    fields:
      - "email"
      - "password"
  phases:
    - duration: 120
      arrivalRate: 20

scenarios:
  - name: "Login"
    flow:
      - post:
          url: "/login"
          json:
            email: "{{ email }}"
            password: "{{ password }}"
Enter fullscreen mode Exit fullscreen mode

Her sanal kullanıcı CSV’den bir satır alır. fields altında tanımlanan sütunlar değişken olarak kullanılabilir.

Testi Çalıştırma

Temel komut:

artillery run script.yml
Enter fullscreen mode Exit fullscreen mode

Hedef ortamı betiği değiştirmeden geçersiz kılmak için:

artillery run --target https://staging.example.com script.yml
Enter fullscreen mode Exit fullscreen mode

Değişkenleri komut satırından geçirmek için:

artillery run -v '{ "productId": ["1001","1002"] }' script.yml
Enter fullscreen mode Exit fullscreen mode

Sık kullanılan bayraklar:

Bayrak Açıklama
--target, -t config.target değerini geçersiz kılar
--environment, -e config.environments altındaki ortamı seçer
--config, -c Yapılandırmayı ayrı dosyadan yükler
--insecure, -k TLS doğrulamasını atlar; test ortamlarındaki self-signed sertifikalar için kullanılır

Sonuçları Okuma

Artillery test sırasında yaklaşık her 10 saniyede bir metrik basar. Test sonunda özet rapor üretir.

Takip etmeniz gereken ana metrikler:

  • İstek oranı: Testin fiilen ulaştığı saniye başına istek sayısı.
  • p50 gecikmesi: Medyan yanıt süresi.
  • p95 gecikmesi: İsteklerin en yavaş %5’lik kısmını gösterir.
  • p99 gecikmesi: Kuyruk gecikmesini izlemek için kritiktir.
  • Hata sayıları: Başarısız istekler, timeout’lar ve 2xx olmayan yanıtlar.

Sadece ortalamaya bakmayın. Ortalama sağlıklı görünürken p95 veya p99 çok saniyeli değerlere çıkabilir. Hatalar özellikle sürekli yük aşamasında oluşuyorsa sistemin doyum noktasına yaklaşmış olabilirsiniz.

Daha fazla metrik yorumu için API performans testi kılavuzuna bakabilirsiniz.

Artillery v2’de Rapor Oluşturma

Artillery raporlama davranışı sürümler arasında değişti. Eski rehberlerde şu akışı görebilirsiniz:

artillery run --output report.json script.yml
artillery report report.json
Enter fullscreen mode Exit fullscreen mode

İlk komut hâlâ geçerlidir. İkinci komut Artillery v2’de artık çalışmaz.

JSON sonuç dosyası üretmek için:

artillery run --output report.json script.yml
Enter fullscreen mode Exit fullscreen mode

artillery report komutu CLI’dan kaldırılmıştır. HTML raporlama kodu bakımsız kaldığı için kullanımdan kaldırıldı ve geri getirilmesi planlanmıyor.

Bunun yerine üç pratik seçeneğiniz var.

1. JSON çıktısını CI içinde ayrıştırın

Örneğin p95 değerini jq ile alabilirsiniz:

jq '.aggregate.summaries["http.response_time"].p95' report.json
Enter fullscreen mode Exit fullscreen mode

CI’da bu değeri eşik kontrolü için kullanabilirsiniz:

P95=$(jq '.aggregate.summaries["http.response_time"].p95' report.json)

if (( $(echo "$P95 > 500" | bc -l) )); then
  echo "p95 latency too high: $P95 ms"
  exit 1
fi
Enter fullscreen mode Exit fullscreen mode

2. Artillery Cloud kullanın

Barındırılan gösterge paneli için --record ve API anahtarı kullanılır:

artillery run --record --key $ARTILLERY_CLOUD_API_KEY script.yml
Enter fullscreen mode Exit fullscreen mode

3. Metrikleri kendi izleme sisteminize gönderin

publish-metrics eklentisi veya OpenTelemetry ile metrikleri mevcut gözlemlenebilirlik yığınınıza aktarabilirsiniz. Böylece yük testi gecikme ve hata oranlarını üretim panellerinizle birlikte izleyebilirsiniz.

Artillery’yi CI’da Çalıştırma

Artillery bir Node.js CLI olduğu için GitHub Actions, GitLab CI, Jenkins veya benzeri sistemlerde kolayca çalışır.

Aşağıdaki GitHub Actions örneği:

  1. Kodu checkout eder
  2. Node.js kurar
  3. Artillery’yi yükler
  4. Testi çalıştırır
  5. JSON raporunu artifact olarak saklar
name: Load test

on: [workflow_dispatch]

jobs:
  artillery:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-node@v4
        with:
          node-version: "lts/*"

      - run: npm install -g artillery@latest

      - run: artillery run --output report.json script.yml

      - uses: actions/upload-artifact@v4
        with:
          name: artillery-report
          path: report.json
Enter fullscreen mode Exit fullscreen mode

Bu örnek manuel tetiklenir. Yoğun yük testlerini her commit’te çalıştırmak genellikle iyi fikir değildir; süre, maliyet ve gerçek bant genişliği tüketir. Daha pratik seçenekler:

  • Manuel tetikleme
  • Gecelik zamanlanmış test
  • Release öncesi test
  • Staging ortamında kontrollü yük testi

JSON raporu üretildikten sonra p95, hata oranı veya timeout sayısı için eşik kontrolü ekleyebilirsiniz.

Apidog Nerede Kullanılır?

Artillery şu soruyu yanıtlar:

API bu trafik seviyesine dayanabiliyor mu?

Bu yük ve performans testidir.

Ayrı bir soru daha vardır:

Bu kod değişikliğinden sonra API hâlâ doğru yanıtları döndürüyor mu?

Bu ise fonksiyonel ve regresyon testidir. Burada Apidog devreye girer.

Apidog; API tasarımı, hata ayıklama, mock, dokümantasyon ve otomatik test için hepsi bir arada bir platformdur. Test senaryolarında uç noktaları koşullu adımlarla gruplayabilir, yanıt gövdelerini, durum kodlarını ve sözleşmeleri doğrulayabilirsiniz.

Apidog CLI ile bu senaryoları CI’da çalıştırarak hatalı değişikliklerin merge edilmesini engelleyebilirsiniz.

Sınır net olmalıdır: Apidog’da performans testi özelliği vardır, ancak 100 sanal kullanıcı ile sınırlıdır. Bu, bariz regresyonları yakalamak için uygundur; yüksek eşzamanlılıkta Artillery’nin yerini tutmaz. Büyük ölçekli ve kodla modellenmiş yük için Artillery doğru araçtır.

Bu ayrım Python olmadan API’leri yük testi yazısında, Apidog’un 100-VU performans testi mekanikleri ise Apidog’da API performans testi makalesinde ele alınır.

Pratik yaklaşım:

  • Ölçek ve dayanıklılık için Artillery kullanın.
  • Fonksiyonel doğrulama ve regresyon engeli için Apidog CLI kullanın.

Apidog CLI ile CI’da Fonksiyonel Test Çalıştırma

Apidog CLI npm üzerinden kurulur:

npm install -g apidog-cli
Enter fullscreen mode Exit fullscreen mode

CI içinde örnek kullanım:

apidog run \
  --access-token $APIDOG_ACCESS_TOKEN \
  -t <TEST_SCENARIO_ID> \
  -e <ENVIRONMENT_ID> \
  -r cli,junit \
  --out-dir ./apidog-reports
Enter fullscreen mode Exit fullscreen mode

Parametreler:

  • --access-token: Apidog erişim token’ı
  • -t: test senaryosu kimliği
  • -e: ortam kimliği
  • -r cli,junit: konsol çıktısı ve JUnit XML raporu üretir
  • --out-dir: raporların yazılacağı dizin

Daha ayrıntılı kullanım için Apidog CLI eğitimine, işlem hattı tasarımı için API testi için CI/CD en iyi uygulamalarına bakabilirsiniz.

Artillery ile yük testlerini çalıştırırken, Apidog ile CI’da fonksiyonel ve sözleşme testlerini de engelleyici kontrol olarak çalıştırabilirsiniz.

Sıkça Sorulan Sorular

Artillery yük testi nedir?

Artillery yük testi, API’nize çok sayıda eşzamanlı sanal kullanıcı göndermek için açık kaynaklı Artillery aracını kullanmaktır. Yük profilini ve istek akışını YAML dosyasında tanımlar, testi çalıştırır ve sistemin stres altında nasıl davrandığını görmek için gecikme yüzdeliklerini, istek oranlarını ve hataları ölçersiniz.

Artillery ücretsiz ve açık kaynak mı?

Evet. Temel Artillery CLI ücretsiz ve açık kaynaklıdır. npm’de artillery paketi olarak dağıtılır. Ayrıca sonuçlar için barındırılan gösterge paneli sunan ücretli Artillery Cloud hizmeti de vardır. Ancak yerel ortamda ve CI’da Artillery Cloud olmadan da yük testi çalıştırabilirsiniz.

Artillery yük testi nasıl çalıştırılır?

Özet akış:

npm install -g artillery@latest
artillery run script.yml
Enter fullscreen mode Exit fullscreen mode

Önce config bloğunda hedefi ve aşamaları, scenarios bloğunda istek akışını tanımlarsınız. Ardından artillery run script.yml komutuyla testi çalıştırırsınız. Artillery test sırasında canlı metrikler, sonunda da özet rapor basar.

Artillery raporu nasıl oluşturulur?

JSON sonuç dosyası için:

artillery run --output report.json script.yml
Enter fullscreen mode Exit fullscreen mode

Eski artillery report komutu Artillery v2 CLI’dan kaldırılmıştır. Bunun yerine JSON çıktısını jq gibi araçlarla ayrıştırabilir, --record --key ile Artillery Cloud kullanabilir veya publish-metrics / OpenTelemetry ile metrikleri dışarı aktarabilirsiniz.

Artillery, k6 veya JMeter: hangisini kullanmalısınız?

Üçü de yüksek ölçekli yük testi için kullanılabilir.

  • Artillery: YAML tabanlıdır ve Node.js ekosistemine uygundur.
  • k6: JavaScript ile kod öncelikli test modeli sunar.
  • JMeter: Java tabanlıdır, GUI odaklıdır ve geniş eklenti geçmişine sahiptir.

Daha derin karşılaştırma için Gatling ve JMeter karşılaştırması yazısına bakabilirsiniz. Ekibinizin betik modeline ve mevcut araç zincirine en uygun aracı seçin; ardından kapsamı tamamlamak için fonksiyonel CI testleriyle birlikte kullanın.

Top comments (0)