TestFly Bölüm 9: Java ile K6 ve Gatling Yük Testi — Sıfır Bağlam Değişimi
TestFly 1.1.0 ile gelen dahili Gatling ve K6 yük testi motorunu, @LoadTest deklaratif anotasyonunu ve P95 SLO kalite kapılarını keşfedin.
Özet: TestFly 1.1.0 sürümü, Gatling ve Java sanal iş parçacıkları (virtual threads) ile güçlendirilmiş dahili yük ve performans testi yeteneklerini sunar. SDET'ler artık harici araçlara ihtiyaç duymadan doğrudan standart TestNG veya JUnit 5 test sınıfları içerisinde yüksek eşzamanlı yük senaryoları yazabilir, parametrelendirebilir ve doğrulayabilir.
Fonksiyonel Testler ile Yük Testleri Neden Aynı Çatıda Olmalı?
Geleneksel yazılım geliştirme süreçlerinde performans testleri hep son aşamaya bırakılır ya da JMeter gibi ayrı kullanıcı arayüzlü araçlara hapsedilir. Bu ayrım şu sorunları doğurur:
- Fonksiyonel testlerde kullanılan test verileri ve auth mekanizmaları yük testleri için sıfırdan tekrar yazılır.
- Performans testleri sadece canlıya çıkış öncesi nadiren koşulur (Shift-Left ilkesine aykırıdır).
- CI/CD hatlarında farklı araçların çıktılarını birleştirmek ve kalite kapıları kurmak zorlaşır.
TestFly bu engeli ortadan kaldırarak mühendislerin aynı BaseTest altyapısı, testfly.yml ayarları ve assertion kütüphanesiyle yük testleri yazmasını sağlar.
TestFly ile Yük Testi Nasıl Yazılır?
TestFly iki farklı yazım yaklaşımı sunar:
1. @LoadTest ile Deklaratif Yaklaşım
Herhangi bir test metodunu @LoadTest anotasyonu ile işaretleyerek eşzamanlı sanal kullanıcıları ve artış (ramp-up) sürelerini belirleyin:
package io.testfly.examples.loadtest;
import io.testfly.loadtest.LoadTest;
import io.testfly.test.BaseTest;
import org.testng.annotations.Test;
public class BasitYukTesti extends BaseTest {
@Test
@LoadTest(users = 100, rampUpSeconds = 15, durationSeconds = 60)
public void yukAltindaOdemeHizmetiTesti() {
apiClient().post("/api/checkout")
.body("{\"cartId\": 1024}")
.send()
.assertStatus(200);
}
}2. LoadScenario ile Akıcı (Fluent) DSL Yaklaşımı
Çok adımlı kullanıcı gezintilerini ve dinamik veri besleyicilerini (feeder) kodlamak için akıcı DSL kullanılır:
package io.testfly.examples.loadtest;
import io.testfly.loadtest.LoadScenario;
import io.testfly.loadtest.LoadTestFeeder;
import io.testfly.test.BaseTest;
import org.testng.annotations.Test;
public class GelismisGezintiTesti extends BaseTest {
@Test
public void kullaniciAlisverisGezintisi() {
LoadTestFeeder kullanicilar = LoadTestFeeder.csv("testdata/users.csv");
LoadScenario.scenario("Katalog Arama ve Sepete Ekleme")
.feed(kullanicilar)
.step("Katalog Arama", client -> client.get("/products?q=ayakkabi").send().assertStatus(200))
.pause(1000)
.step("Sepete Ekle", client -> client.post("/cart/items").body("{\"id\": 42}").send().assertStatus(201))
.users(500)
.rampUp(20)
.run();
}
}Performans Kalite Kapıları (SLO) Nasıl Denetlenir?
Ölçümlenen veriler otomatik olarak P50, P90, P95 ve P99 yüzdeliklerine dönüştürülür:
| Yüzdelik (Percentile) | Anlamı | Tipik Hedef (SLO) |
|---|---|---|
| P50 (Medyan) | İsteklerin %50'sinin tamamlanma süresi | < 150 ms |
| P90 | İsteklerin %90'ının tamamlanma süresi | < 350 ms |
| P95 | İsteklerin %95'inin tamamlanma süresi | < 500 ms |
| P99 | En yavaş %1'lik kuyruk gecikmesi | < 1200 ms |
Sözleşmelerinizi kod üzerinden doğrulayarak performans gerilemelerinde (regression) CI derlemesini otomatik kırabilirsiniz:
import static io.testfly.loadtest.LoadTestAssert.*;
assertP95Below(Duration.ofMillis(450));
assertErrorRateBelow(0.01); // %1'den az hata oranıSSS
TestFly yük testi için JMeter veya harici bir kuruluma ihtiyaç duyar mı?
Hayır. TestFly, Gatling motorunu ve Java sanal iş parçacıklarını dahili olarak çalıştırır; harici hiçbir binary kurulumu gerekmez.
TestFly yük testleri CI/CD pipeline'ında çalıştırılabilir mi?
Evet. GitHub Actions, Jenkins ve Bitbucket Pipelines üzerinde headless olarak çalışır. Yüksek hacimli yükler için Docker ve Kubernetes podları ile yatayda ölçeklenebilir.
API yetkilendirme (Bearer token) yük testlerine dahil edilebilir mi?
Evet. ApiClient üzerinden alınan token veya oturum çerezleri yük testi senaryosundaki tüm adımlara otomatik enjekte edilir.