API'niz tek bir kullanıcı için sorunsuz çalışıyor ancak yoğun trafik altında çöküyorsa, yük testi yapmanız gerekir ve k6 bunu yapmanın en temiz yollarından biridir. Bu kılavuz, k6'nın ne olduğunu, nasıl kurulacağını, ilk betiğinizi nasıl yazacağınızı ve sonuçları nasıl okuyacağınızı kapsar; böylece yük testini normal API performans testi rutininizin bir parçası olarak ele alabilirsiniz. Ayrıca, detayların önemli olduğu resmi k6 belgelerinden yararlanarak k6'nın CI'daki fonksiyonel testlerle nasıl uyum sağladığına da bakacağız.
k6 Nedir?
k6, şu anda Grafana tarafından sürdürülen açık kaynaklı bir yük testi aracıdır. Testinizi bir JavaScript dosyası olarak yazarsınız, k6 onu hızlı bir Go motoruyla çalıştırır ve API uç noktalarınızı simüle edilmiş trafikle zorlar. Bu ayrım kasıtlıdır: Testleri çoğu geliştiricinin zaten bildiği bir dilde yazarsınız, ancak yük üretecinin kendisi derlenmiş Go olarak çalıştığı için, tek bir makine boğulmadan çok sayıda sanal kullanıcıyı yönetebilir.

k6, tek bir iş için inşa edilmiştir ve bunu iyi yapar: sürekli, tekrarlanabilir yük üretmek ve sisteminizin nasıl yanıt verdiğini ölçmek. Gecikme yüzdeliklerini, istek oranlarını, hata oranlarını raporlar ve bu sayılar üzerinde geçme/kalma kuralları belirlemenizi sağlar. Bu odak noktası budur. k6 bir API istemcisi, bir dokümantasyon aracı veya fonksiyonel bir test çerçevesi değildir. O bir yük motorudur.
Sürekli karşılaşacağınız birkaç terim:
- Sanal kullanıcı (VU): Betiğinizi döngü içinde çalıştıran simüle edilmiş bir kullanıcı. Daha fazla VU, daha fazla eş zamanlı yük anlamına gelir.
- İterasyon: Test fonksiyonunuzun tam bir geçişi. Bir VU, iterasyonları art arda çalıştırır.
- Aşama (Stage): Bir yük profilindeki bir adım, zaman içinde VU'ları artırmak veya azaltmak için kullanılır.
- Eşik (Threshold): Bir metrik üzerinde geçme/kalma kuralı, örneğin "95. yüzdelik gecikme 500ms'nin altında kalmalı."
- Kontrol (Check): Bir yanıta ilişkin ölümcül olmayan bir iddia, örneğin "durum 200 idi." Başarısız kontroller sayılır, ancak test çalışmaya devam eder.
k6 Kurulumu
k6 tek bir ikili dosya olarak gelir, bu yüzden kurulumu kısadır. Homebrew ile macOS'ta:
brew install k6
Chocolatey ile Windows'ta:
choco install k6
Debian veya Ubuntu'da, Grafana apt deposunu ekleyin ve kurun:
sudo gpg -k
sudo gpg --no-default-keyring --keyring /usr/share/keyrings/k6-archive-keyring.gpg \
--keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C5AD17C747E3415A3642D57D77C6C491D6AC1D69
echo "deb [signed-by=/usr/share/keyrings/k6-archive-keyring.gpg] https://dl.k6.io/deb stable main" \
| sudo tee /etc/apt/sources.list.d/k6.list
sudo apt-get update
sudo apt-get install k6
Çalıştığını doğrulayın:
k6 version
Yerel olarak hiçbir şey kurmak istemiyorsanız bir Docker görüntüsü de mevcuttur. Paket detayları zamanla değişebileceğinden, güncel komutlar için belgelerdeki kurulum sayfasına bakın.
İlk k6 Betiğiniz
Bir k6 testi, varsayılan bir fonksiyona sahip bir JavaScript modülüdür. k6, bu fonksiyonu her iterasyon ve her VU için bir kez çağırır. İşte bir API uç noktasına istek gönderen ve yanıtı kontrol eden minimalist bir betik:
import http from 'k6/http';
import { check, sleep } from 'k6';
export default function () {
const res = http.get('https://test-api.example.com/users');
check(res, {
'status is 200': (r) => r.status === 200,
'body is not empty': (r) => r.body.length > 0,
});
sleep(1);
}
Bunu script.js olarak kaydedin ve çalıştırın:
k6 run script.js
Varsayılan olarak k6, bir VU'yu tek bir iterasyon için çalıştırır. Bu sleep(1), iterasyonlar arasında bir saniyelik bir duraklama ekler, bu da gerçek bir kullanıcının eylemler arasında duraklamasını taklit eder. Duraklama olmadan, her VU ağın izin verdiği kadar hızlı döngü yapar, bu da ham verimlilik testleri için faydalıdır ancak kullanıcı davranış simülasyonu için gerçekçi değildir.
check() çağrıları yumuşak onaylamalardır. Başarısız bir kontrol özette görünür ancak çalışmayı durdurmaz. Bu kasıtlıdır. Yoğun yük altında bazı başarısızlıklar beklersiniz ve testin ne kadar kötüleştiğini görebilmek için ölçmeye devam etmesini istersiniz.
VUs, Aşamalarda ve Eşiklerde
İlk betik tek bir kullanıcıyı bir kez çalıştırır. Gerçek yük testi, API'nize kaç kullanıcının ve ne kadar süreyle erişeceğini kontrol etmekle ilgilidir. Bunu dışa aktarılmış bir options nesnesiyle yapılandırırsınız.
En basit form, sabit sayıda VU ve bir süre belirler:
export const options = {
vus: 50,
duration: '30s',
};
Bu, 50 sanal kullanıcıyı 30 saniye boyunca çalıştırır. Daha kullanışlı olanı, trafik yükselişini, tutulmasını ve düşüşünü simüle etmenize olanak tanıyan aşamalardan oluşan bir yükseliş profilidir:
export const options = {
stages: [
{ duration: '1m', target: 100 }, // 100 VU'ya yüksel
{ duration: '3m', target: 100 }, // 100 VU'da tut
{ duration: '1m', target: 0 }, // 0 VU'ya düş
],
thresholds: {
http_req_duration: ['p(95)<500'], // isteklerin %95'i 500ms'nin altında
http_req_failed: ['rate<0.01'], // %1'den az hata
},
};
Eşikler, k6'nın CI'da yerini kazandığı yerdir. Bir eşik başarısız olursa, k6 sıfırdan farklı bir kodla çıkar. Bu, bir boru hattı adımının, gecikme veya hata oranları belirlediğiniz bir çizgiyi aştığında derlemeyi başarısız edebileceği anlamına gelir. Performans bütçesini, tıpkı fonksiyonel bir onaylamayı kodladığınız gibi kod olarak tanımlarsınız.
Yaygın yük profillerinin ve her birinin yanıtladığı sorunun hızlı bir haritası:
| Profil | Amaç | Size neyi söyler |
|---|---|---|
| Duman (Smoke) | Çok küçük yük, betiğin çalıştığını doğrula | Testin kendisi doğru |
| Yük (Load) | Beklenen normal trafik | API günlük olarak ayakta kalıyor mu |
| Stres (Stress) | Beklenen zirveyi aş | Nerede bozulmaya başlar |
| Sıçrama (Spike) | VU'larda ani keskin artış | Trafik artışından sağ çıkabilir mi |
| Islatma (Soak) | Saatlerce orta düzeyde yük | Bellek sızıntıları, yavaş bozulma |
Hepsine ihtiyacınız yok. Duman ve yük ile başlayın. Normal sayılarınızı öğrendikten sonra stres ve sıçrama ekleyin. Yaklaşımların ve arkalarındaki metriklerin daha geniş bir araştırması için performans testi temelleri, sadece k6 için değil, her araçta geçerlidir.
k6 Sonuçlarını Okuma
Bir çalışma bittiğinde, k6 terminale bir özet yazdırır. En önemli satırlar:
- http_req_duration: ortalama, min, maks, medyan, p90 ve p95 olarak gösterilen toplam istek süresi. p95 ve p99 yüzdelikleri, en yavaş kullanıcılarınızın gerçekte ne deneyimlediğini size söyler. Ortalamalar acıyı gizler; yüzdelikler ortaya çıkarır.
- http_req_failed: başarısız olan isteklerin oranı. VU'lar arttıkça bunun nasıl değiştiğini izleyin.
- http_reqs: toplam istekler ve saniyedeki istekler. Bu sizin verimliliğinizdir.
- iterations: tamamlanan tam geçiş sayısı ve oranı.
- vus ve vus_max: aktif ve en yüksek sanal kullanıcılar.
- checks:
check()onaylamalarınızdaki geçiş oranı.
Ortalamaları değil, yüzdelikleri okuyun. Ortalama 200ms'lik bir yanıt süresi, p99'un 4 saniye olduğunu görene kadar iyi gelir, bu da yüz kullanıcıdan birinin dört saniye beklediği anlamına gelir. Bu kuyruk, kullanıcıların terk ettiği yerdir.
Terminali gözle kontrol etmenin ötesinde her şey için, k6 sonuçları harici çıktılara aktarabilir. JSON veya CSV yazar ve bir çalıştırma sırasında canlı, görsel analiz için Grafana panoları ve Prometheus ile entegre olur. Bu eşleştirme, k6 ve Grafana, aracın neden sıklıkla "grafana k6" olarak adlandırıldığının nedenidir. Tek seferlik bir test için terminal özeti yeterlidir; sürekli izleme için metrikleri çizebileceğiniz bir yere gönderin.
k6 Nereye, Apidog Nereye Uyar?
k6 bir yük motorudur. "Sistemim sürekli trafik altında nasıl davranıyor?" sorusunu yanıtlar. API'nizin doğru verileri döndürüp döndürmediğini, sözleşmesine uyup uymadığını veya her uç noktada kimlik doğrulamasını doğru şekilde ele alıp almadığını kontrol etmez. Bunlar fonksiyonel ve sözleşme testi sorularıdır ve farklı bir araca ihtiyaç duyarlar.
Bu, net tutulması gereken ayrımdır. Boru hattınızda her iki test türünü de istersiniz ve bunlar birbiriyle rekabet etmez:
| İlgili Konu | En iyi şekilde tarafından ele alınır | Neyi yanıtlar |
|---|---|---|
| Sürekli ağır yük, ölçekli yüzdelikler | k6 | Trafik altında hızlı kalır mı |
| Fonksiyonel doğruluk, sözleşme, kimlik doğrulama | Apidog | Doğru şeyi döndürüyor mu |
| Her commit'te CI'da regresyon | Apidog (apidog run) |
Bu değişiklik bir uç noktayı bozdu mu |
| CI'da performans bütçeleri | k6 eşikleri | Gecikme veya hatalar bir sınırı aştı mı |
Apidog doğruluk tarafını ele alır. API'nizi tasarlar veya içe aktarırsınız, görsel onaylamalarla test senaryoları oluşturursunuz ve apidog run ile bunları CI'da çalıştırırsınız, tıpkı bir k6 betiğini çalıştıracağınız gibi. Apidog CLI kılavuzu, bu fonksiyonel testleri bir boru hattına nasıl bağlayacağınızı gösterir. Apidog ayrıca hızlı kontroller için daha hafif performans testi özellikleri de içerir, bu da Apidog'da API performans testi kılavuzunda ele alınmıştır, ancak bir k6 sınıfı yük üreteci değildir ve olmaya da çalışmaz.
Pratik bir iş akışı şöyle görünür: Her commit'te Apidog, API'nin hala yapması gerekeni yaptığını doğrulamak için fonksiyonel ve sözleşme testlerinizi çalıştırır. Bir programa göre veya bir sürümden önce k6, API'nin trafik altında hızlı kaldığını doğrulamak için bir hazırlık ortamına karşı bir yük profili çalıştırır. Doğruluk kapısı ve performans kapısı, her biri için inşa edilmiş araçla.
Taahhüt etmeden önce motorları karşılaştırıyorsanız, k6 JMeter, Gatling ve Locust'un yanındadır. Yük testi araçları özeti ve bu Locust alternatifi karşılaştırması, betik dili veya ölçek seçiminizi değiştirirse avantajları ve dezavantajları ortaya koyar.
Sıkça Sorulan Sorular
k6 ücretsiz mi?
Evet. k6, AGPL lisansı altında açık kaynaklıdır ve ikili dosya, kendi donanımınızın ötesinde sanal kullanıcı sayısı sınırı olmaksızın yerel olarak ücretsiz çalıştırılabilir. Grafana ayrıca, büyük dağıtılmış testleri çalıştırmak ve sonuçları saklamak için ücretli bir hizmet olan k6 Cloud'u da sunar, ancak bunu asla kullanmak zorunda değilsiniz. Temel araç çoğu ekibin ihtiyacını karşılar. Önce diğer ücretsiz seçenekleri taramak isterseniz, yük testi araçları genel bakışı her birinin neler sunduğunu listeler.
k6 kullanmak için JavaScript bilmem gerekiyor mu?
Temel JavaScript bilgisine ihtiyacınız var, derin uzmanlığa değil. Çoğu k6 betiği varsayılan bir fonksiyondan, bazı http.get veya http.post çağrılarından, birkaç kontrolden ve bir options nesnesinden oluşur. Bu kılavuzdaki örnekleri okuyabiliyorsanız, çalışan bir test yazabilirsiniz. Öğrenecek bir derleme adımı veya çerçeve yok, sadece k6 API'si var.
Performans testi için k6 ve Apidog arasındaki fark nedir?
k6, sürekli yoğun trafik sağlamak ve ölçekli yüzdelikleri raporlamak için tasarlanmış özel bir yük üretecisidir. Apidog ise, daha hafif performans testi özellikleriyle hızlı kontroller için tasarım, fonksiyonel test ve sözleşme testine odaklanmış bir API platformudur. Gerçek yüke ve CI performans bütçelerine ihtiyacınız olduğunda k6'yı kullanın. Doğruluk, sözleşme doğrulaması ve her commit'te fonksiyonel testleri çalıştırmak için Apidog'u kullanın. Farklı sorunları çözerler ve birlikte iyi çalışırlar.
k6'yı CI/CD'de çalıştırabilir miyim?
Evet ve bu yaygın bir kurulumdur. Bir eşik başarısız olduğunda k6 sıfırdan farklı bir kodla çıkar, böylece herhangi bir CI sistemi bir performans regresyonunda derlemeyi başarısız edebilir. Bir boru hattı adımı olarak k6 run script.js komutunu çalıştırın, bunu bir hazırlık ortamına yönlendirin ve p95 gecikme ve hata oranı için eşikler belirleyin. Her commit'in hem doğruluk kontrolü hem de yük kontrolü alması için bunu apidog run'dan gelen fonksiyonel testlerle eşleştirin.
Sonuç
k6, API'nize gerçek yük bindirmenin ve ne olduğunu ölçmenin temiz, betiklenebilir bir yolunu sunar. İkili dosyayı kurun, kısa bir JavaScript dosyası yazın, VU'ları ve aşamaları ayarlayın, eşikler ekleyin ve yüzdelikleri okuyun. Döngünün tamamı budur. Yük testini fonksiyonel testten ayrı tutun, çünkü her biri farklı bir soruyu yanıtlar ve hiçbir şeyin gözden kaçmaması için her ikisini de CI'da çalıştırın.
Bu ayrımın doğruluk tarafı için, Apidog API'nizi tek bir yerde tasarlamanıza, test etmenize, taklit etmenize ve belgelemenize, ardından apidog run ile CI'da fonksiyonel testleri çalıştırmanıza olanak tanır. Sözleşme düzeyindeki güveni k6 yük çalışmalarınızla birleştirmek için Apidog'u indirin.
