Artillery, basit bir YAML betiğinden API'nize yüksek eşzamanlılıkta trafik sağlayan açık kaynaklı bir Node.js yük testi araç setidir. Yük aşamalarını ve istek akışlarını tanımlar, artillery run script.yml komutunu çalıştırır ve gecikme yüzdeliklerini, istek oranlarını ve hata sayılarını geri okursunuz. Bu kılavuz, Artillery v2'yi kurma, gerçek bir test betiği yazma, çalıştırma, mevcut v2 yöntemine göre sonuçları yakalama ve bunu CI'ya bağlama konularında size yol gösterecektir.
Artillery Nedir ve Ne Zaman Kullanılmalıdır?
Artillery, uç noktalarınıza vuran sanal kullanıcılar (VU'lar) oluşturur ve sistemin sürekli trafik altında nasıl performans gösterdiğini ölçer. Sanal kullanıcı, tıpkı gerçek bir arayan gibi, bir senaryoyu birbiri ardına isteklerle çalıştıran simüle edilmiş bir istemcidir.
Ölçeklendirme sorularına yanıt aradığınızda Artillery'ye başvurursunuz. Saniyede 50 istekle p95 gecikmesi nasıl davranır? Hatalar hangi varış oranında görünmeye başlar? API, beş dakikalık sürekli yük altında kararlı kalır mı, yoksa bozulur mu?
Artillery bu konuda iyidir çünkü test bildirimseldir. Eşzamanlılık döngüsünü elle kodlamak yerine yük şeklini YAML'de tanımlarsınız. Node.js'nin çalıştığı her yerde çalışır, bu nedenle aynı betik dizüstü bilgisayarınızda ve CI'da çalışır.
Artillery, bu alandaki birkaç seçenekten biridir. Hala araçları karşılaştırıyorsanız, en iyi yük testi araçları özeti ve bu yük testi yazılımı karşılaştırması k6, JMeter, Gatling ve diğerleri arasındaki denge noktalarını ele almaktadır.
Artillery Kurulumu (v2)
Paket adı tam olarak artillery'dir ve mevcut ana sürüm v2'dir. npm ile küresel olarak kurun, ardından sürümü doğrulayın.
npm install -g artillery@latest
artillery version
Node.js'nin güncel bir LTS sürümüne ihtiyacınız var. Artillery Windows, macOS ve Linux üzerinde çalışır.
Hiçbir şeyi küresel olarak kurmak istemiyorsanız, npx ile isteğe bağlı olarak çalıştırın.
npx artillery@latest run script.yml
Artillery Test Betiği Yazma
Bir Artillery testi, iki üst düzey bölümden oluşan bir YAML dosyasıdır. config bölümü hedefi ve yük profilini tanımlar. scenarios bölümü, her sanal kullanıcının ne yapacağını tanımlar.
İşte ısınan, zirveye çıkan ve ardından sürekli bir yükü sürdüren eksiksiz bir betik.
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
# Inline variables (or use a CSV via config.payload)
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ünü anlama
config.target, her isteğin karşı çalıştığı temel ana bilgisayardır. Bir senaryodaki her adım, url'sini bu temele ekler.
config.phases, sırayla çalışan yük aşamalarından oluşan bir dizidir. En çok kullanacağınız anahtarlar:
duration: aşamanın ne kadar sürdüğü, saniye cinsinden veya"5m"gibi okunabilir bir dize olarak.arrivalRate: her saniye kaç yeni sanal kullanıcının başladığı.rampTo: varış oranınıarrivalRate'ten bu değere kadar aşama boyunca doğrusal olarak artırır.arrivalCount: saniye başına bir oran yerine, aşama boyunca dağıtılmış sabit sayıda VU.maxVusers: aynı anda çalışabilecek sanal kullanıcı sayısına ilişkin bir üst sınır.name: çıktıda görünen bir etiket.
Bir ayrıntı insanları yanıltır. Bir aşamanın duration'ı, Artillery'nin sanal kullanıcıları ne kadar süreyle oluşturmaya devam edeceğini kontrol eder, testin toplam gerçek zamanını değil. Eğer bir VU bir aşamanın sonuna yakın başlar ve senaryosu biraz zaman alırsa, çalıştırma o kullanıcı bitene kadar devam eder.
Senaryolar bölümünü anlama
scenarios bir dizidir. Her senaryonun, bir sanal kullanıcının çalıştırdığı sıralı adımlar listesi olan bir flow'u vardır. İsteğe bağlı anahtarlar arasında name ve weight bulunur; burada weight, Artillery'nin belirli bir VU için bu senaryoyu seçme göreceli olasılığını belirler.
Akış adımları HTTP-fiil anahtarlarını kullanır: get, post, put, delete ve patch. Her biri bir url alır ve istek gövdeleri json altına yerleştirilir. Çift kıvrımlı parantez sözdizimi, {{ productId }}, bir değişkeni çeker.
İstekleri bir CSV dosyasından sürme
Değerleri manuel olarak kodlamak bir duman testi için uygundur. Gerçekçi yük için, config.payload ile bir CSV'den veri besleyin. Her sanal kullanıcı bir satır seçer ve sütun adları değişken olur.
config:
target: "https://api.example.com"
payload:
path: "./users.csv"
fields:
- "email"
- "password"
phases:
- duration: 120
arrivalRate: 20
scenarios:
- flow:
- post:
url: "/login"
json:
email: "{{ email }}"
password: "{{ password }}"
Testi Çalıştırma
Temel komut Artillery'yi betiğinize yönlendirir.
artillery run script.yml
# Override target without editing the script:
artillery run --target https://staging.example.com script.yml
# Pass variables as JSON:
artillery run -v '{ "productId": ["1001","1002"] }' script.yml
Birkaç bayrağı bilmekte fayda var. --target (veya -t) config.target'ı geçersiz kılar, böylece aynı betiği hazırlık veya üretim ortamına yönlendirebilirsiniz. --environment (veya -e) config.environments altında adlandırılmış bir bloğu seçer. --config (veya -c) yapılandırmayı ayrı bir dosyadan yükler. --insecure (veya -k) test ortamlarındaki kendinden imzalı sertifikalar için TLS doğrulamasını atlar.
Sonuçları Okuma
Test çalışırken, Artillery yaklaşık her 10 saniyede bir toplu metrikler basar. Bittikten sonra özet bir rapor alırsınız. En önemli rakamlar:
- İstek oranı: çalıştırmanın fiilen elde ettiği saniye başına istek sayısı.
- Gecikme yüzdelikleri: p50 (medyan), p95 ve p99 yanıt süreleri. p95, isteklerin en yavaş %5'inin deneyimini gösterir, ki bu genellikle sorunların ilk ortaya çıktığı yerdir.
- Hata sayıları: başarısız istekler, zaman aşımı ve 2xx olmayan yanıtlar, türe göre gruplandırılmış.
Sadece ortalamayı değil, kuyruk gecikmelerini de izleyin. Ortalama sağlıklı görünebilirken p99 sessizce çok saniyeli aralıklara tırmanabilir. Hatalar yalnızca sürekli aşama sırasında görünüyorsa, muhtemelen araştırmaya değer bir doyma noktası bulmuşsunuzdur. Hangi metriklerin neden izleneceğine dair daha derinlemesine bir inceleme için bu API performans testi kılavuzuna bakın.
Artillery v2'de Rapor Oluşturma
Raporlama Artillery sürümleri arasında değişti, bu yüzden güncel olmayan eğitimler sizi yanıltabilir. Daha eski kılavuzlar, bir HTML dosyası oluşturmak için artillery run --output report.json ve ardından artillery report report.json çalıştırmanızı söyler. İlk yarısı hala çalışıyor. İkinci yarısı çalışmıyor.
--output bayrağı hala makine tarafından okunabilir bir JSON sonuç dosyası yazar.
# Write machine-readable JSON results (still supported):
artillery run --output report.json script.yml
JSON'dan HTML'e dönüştürücü olan artillery report komutu Artillery CLI'dan kaldırılmıştır. Resmi belgeler, "artık desteklenmediğini ve Artillery CLI'dan kaldırıldığını" belirtir. HTML raporlama kodu bakımsız kaldı, kullanımdan kaldırıldı ve sonra geri getirilme planı olmaksızın bırakıldı. artillery report report.json yazmayın; mevcut v2'de çalışmayacaktır.
Bunun yerine üç güncel seçeneğiniz var.
İlk olarak, JSON'ı kendiniz ayrıştırın. Bu, bir eşiğe göre doğrulama yapmak istediğiniz CI için idealdir. Toplu p95 gecikmesini jq ile çekin:
jq '.aggregate.summaries["http.response_time"].p95' report.json
İkincisi, barındırılan bir gösterge paneli için Artillery Cloud'u kullanın. Bu, eski HTML raporunun resmi yerine geçmesidir. API anahtarınızla birlikte --record parametresini geçirin.
artillery run --record --key $ARTILLERY_CLOUD_API_KEY script.yml
Üçüncüsü, publish-metrics eklentisi veya OpenTelemetry ile metrikleri kendi izleme yığınınızla gönderin, böylece gecikme ve hata oranları üretim için zaten kullandığınız aynı gösterge panellerinde görünür.
Artillery'yi CI'da Çalıştırma
Artillery sadece bir Node.js CLI olduğundan, herhangi bir işlem hattına uyar. İşte Artillery'yi kuran, testi çalıştıran ve JSON raporunu bir derleme yapıtı olarak yükleyen bir GitHub Actions iş akışı.
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 tetiklemeyle çalışır. Yoğun yük testleri genellikle her taahhütte değil, isteğe bağlı veya programlanmış olarak tetiklenir, çünkü dakikalar sürer ve gerçek bant genişliği tüketir. JSON raporu oluşturulduktan sonra, p95 bütçenizi aşarsa işi başarısız kılan bir jq adımı ekleyebilirsiniz.
Apidog Nereye Uyar: Fonksiyonel Test ve CI Engelleyici
Artillery, "API bu kadar trafiğe dayanabilir mi?" sorusunu yanıtlar. Bu, yük ve performans testidir. Bununla birlikte farklı bir soru daha vardır: "Bu kod değişikliğinden sonra API hala doğru yanıtları döndürüyor mu?" Bu, fonksiyonel ve regresyon testidir ve Apidog'un devreye girdiği yer burasıdır.
Apidog, tasarım, hata ayıklama, taklit etme, dokümantasyon ve otomatik test için hepsi bir arada bir API platformudur. Test senaryoları, uç noktaları if, for ve foreach gibi koşullarla mantıksal adımlara gruplandırır, böylece yanıt gövdelerini, durum kodlarını ve sözleşmeleri doğrulayabilirsiniz. Kod değişikliklerinden sonra birleştirmeleri engellemek için bu senaryoları Apidog CLI ile CI'da çalıştırırsınız.
Sınırı netleştirin. Apidog bir performans testi özelliği içerir, ancak bu, 100 sanal kullanıcı ile sınırlıdır. Bu, bariz regresyonları tespit etmek için yeterlidir ve yüksek eşzamanlılıkta Artillery'nin yerini tutmaz. Büyük ölçekte dağıtılmış, kod modellenmiş yük için Artillery doğru araçtır. Bu aynı dürüst çerçeve, Python olmadan API'leri yük testi hakkındaki yazımızda ve Apidog'un 100-VU özelliğinin mekaniği Apidog'da API performans testi makalesinde ele alınmaktadır.
Bu yüzden ikisini de kullanın. Ölçek için Artillery ile yük testi yapın. Kırık davranışları yayınlanmadan önce yakalamak için Apidog CLI ile CI'da fonksiyonel ve regresyon kontrolleri çalıştırın.
Apidog CLI, npm'den yüklenir ve apidog run yalnızca bayraklarla çalışır.
# Apidog CLI: functional/regression run in CI (flag-only, no positional file)
npm install -g apidog-cli
apidog run \
--access-token $APIDOG_ACCESS_TOKEN \
-t <TEST_SCENARIO_ID> \
-e <ENVIRONMENT_ID> \
-r cli,junit \
--out-dir ./apidog-reports
-t bayrağı test senaryosu kimliğidir, -e gerekli ortam kimliğidir ve -r cli,junit hem konsol çıktısı hem de CI sistemlerinin okuyabileceği bir JUnit XML raporu üretir. Adım adım bir anlatım için Apidog CLI eğitimine, işlem hattı tasarım kalıpları için ise bu API testi için CI/CD en iyi uygulamalarına bakın.
Artillery yük çalıştırmalarınızla birlikte CI'ınızı engelleyen fonksiyonel ve sözleşme testleri mi istiyorsunuz? Apidog'u ücretsiz indirin ve ilk test senaryonuzu oluşturun.
Sıkça Sorulan Sorular
Artillery yük testi nedir?
Artillery yük testi, API'nize vuran birçok eşzamanlı sanal kullanıcıyı simüle etmek için açık kaynaklı Artillery araç setini kullanma uygulamasıdır. Yük şeklini ve istek akışını bir YAML betiğinde tanımlar, çalıştırır ve sisteminizin 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ılmaktadır. Ayrıca, sonuçlar için bir gösterge paneli sağlayan ücretli bir barındırılan hizmet olan Artillery Cloud da bulunmaktadır, ancak tam yük testlerini yerel olarak ve CI'da onsuz da çalıştırabilirsiniz.
Bir Artillery yük testi nasıl çalıştırılır?
npm install -g artillery@latest ile kurun, bir config bloğu (hedef ve aşamalar) ve bir scenarios bloğu (istek akışı) içeren bir YAML betiği yazın, ardından artillery run script.yml komutunu çalıştırın. Artillery her 10 saniyede bir canlı metrikler ve sonunda bir özet basar.
Bir Artillery raporu nasıl oluşturulur?
Bir JSON sonuç dosyası yazmak için artillery run --output report.json script.yml komutunu çalıştırın. HTML üreten eski artillery report komutu CLI'dan kaldırılmıştır. Bunun yerine, JSON'ı jq gibi bir araçla ayrıştırın, --record --key aracılığıyla Artillery Cloud'u kullanın veya publish-metrics veya OpenTelemetry eklentisiyle metrikleri dışarı aktarın.
Artillery mi, k6 mı yoksa JMeter mı: hangisini kullanmalısınız?
Üçü de yüksek ölçekli yükü yönetir. Artillery, bildirimsel YAML ve Node.js kullanır, bu da JavaScript ekosisteminde zaten bulunan ekiplere uyar. k6, kod öncelikli bir modelle JavaScript'te betikler yazar. JMeter, GUI odaklı ve uzun bir eklenti geçmişine sahip Java tabanlıdır. Gatling ve JMeter karşılaştırması denge noktalarını daha derinlemesine ele alır. Betik modeli ekibinize uyanı seçin, ardından tam kapsama için fonksiyonel CI testleriyle eşleştirin.
