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.
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
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
İ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
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"
ve şu istek:
url: "/v1/products/1001"
şu adrese gider:
https://api.example.com/v1/products/1001
Sık kullanılan phases alanları
phases:
- duration: 60
arrivalRate: 5
- duration: 120
arrivalRate: 5
rampTo: 50
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:arrivalRatedeğ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
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:
getpostputdeletepatch
İstek gövdesi için json kullanılır. Değişkenler çift süslü parantez ile çağrılır:
productId: "{{ productId }}"
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
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 }}"
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
Hedef ortamı betiği değiştirmeden geçersiz kılmak için:
artillery run --target https://staging.example.com script.yml
Değişkenleri komut satırından geçirmek için:
artillery run -v '{ "productId": ["1001","1002"] }' script.yml
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
İ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
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
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
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
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:
- Kodu checkout eder
- Node.js kurar
- Artillery’yi yükler
- Testi çalıştırır
- 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
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
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
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
Ö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
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)