k6'dan geçiş: k6 betiklerini Spitfire testine çevirme
Elinizdeki k6 betiklerini yeniden yazmanız gerekmez. Spitfire bir k6 betiğini (.js, .ts) okuyup Spitfire testine çevirir ve editörde açar: yük modeli, senaryolar, HTTP istekleri, kontroller, yanıttan değişken çıkarma ve eşikler. Betik yalnız okunur, çalıştırılmaz; karşılığı olmayan her şey satırıyla bir raporda listelenir.
Adımlar
- Testler sayfasında Dosyadan aç'a basın ve
.jsdosyasını seçin (en çok 4 MB). Dosya yalnız okunur, hiç çalıştırılmaz. - Editörün üstündeki rapor neyin nasıl çevrildiğini söyler: çevrilmedi (testte yok), kontrol et (yaklaşık çevrildi), not (nasıl çevrildiği). Her satır kaynak dosyadaki yeriyle gelir; hiçbir şey sessizce atlanmaz.
- Adımları, eşikleri ve değişkenleri gözden geçirin; Dene seçili senaryodan tek iterasyon gönderip her isteği ve yanıtı gösterir. Sonra kaydedin.
Neyin nasıl çevrildiği
| k6 | Spitfire |
|---|---|
options.vus / duration / stages | Yük modeli: sabit ya da kademeli VU |
options.scenarios | Her senaryo ayrı senaryo; executor, startTime ve tüm k6 yürütücüleri aynı adla |
options.thresholds | Eşikler, aynı sözdizimiyle (p(95)<500, abortOnFail, etiketle adım/senaryo) |
http.get / post / put / patch / del / request | HTTP adımı: metot, adres, header'lar, body (JSON ya da form) |
check(res, {...}) | Kontroller: durum kodu, body'de metin, JSONPath, süre |
res.json('a.b') · JSON.parse(res.body) · res.headers['X'] | Yanıttan değişken çıkarma (JSONPath ya da header); sonraki isteklerde {{ad}} |
sleep(n) · randomIntBetween | Düşünme süresi (sabit ya da aralık) |
group(name, fn) | Adım adlarının önüne grup adı |
__ENV.BASE || 'https://…' | Değişken, varsayılan değeriyle |
__VU · __ITER | {{__VU}} · {{__ITER}} |
setup() | Döndürdüğü değerler değişken olur; istekleri her VU için bir kez, ilk adımlar olarak koşar (k6'da tüm teste bir kez) |
POST, PUT, PATCH ve DELETE istekleri veri değiştiren adım olarak işaretlenir; böylece koşu başlamadan onay ister. Giriş ya da arama gibi salt okuyan isteklerde işareti editörde kaldırın; rapor bunu da hatırlatır.
Eşik ifadeleri aynı sözdizimiyle gelir (p(95)<500, rate<0.01, abortOnFail) ve spitfire cloud run'ın CI çıkış kodları k6 ile uyumludur (99 eşik kırıldı, 97 eşik koşuyu durdurdu): pipeline'daki kapı aynı kalır, yalnız komut değişir. Ayrıntı: CI/CD'de performans testi.
Örnek: önce ve sonra
Giriş yapıp token alan, token'la ürünleri listeleyen, iki kontrolü ve bir p95 eşiği olan küçük bir betik:
import http from 'k6/http';
import { check, sleep } from 'k6';
export const options = {
stages: [
{ duration: '1m', target: 50 },
{ duration: '5m', target: 50 },
],
thresholds: { http_req_duration: ['p(95)<500'] },
};
const BASE = __ENV.BASE || 'https://shop.example.com';
export default function () {
const login = http.post(`${BASE}/api/login`, JSON.stringify({ user: 'demo', pass: 'demo' }), {
headers: { 'Content-Type': 'application/json' },
});
check(login, { 'login 200': (r) => r.status === 200 });
const token = login.json('token');
const items = http.get(`${BASE}/api/items`, { headers: { Authorization: `Bearer ${token}` } });
check(items, { 'items 200': (r) => r.status === 200 });
sleep(1);
}Dönüştürücünün yazdığı test (genel options bloğu kısaltıldı). __ENV.BASE varsayılan değeriyle bir değişken, login.json('token') bir JSONPath çıkarması, sleep(1) düşünme süresi oldu:
{
"name": "checkout",
"variables": {"BASE": "https://shop.example.com"},
"scenarios": [
{
"name": "default",
"executor": {
"type": "ramping-vus",
"startVUs": 1,
"stages": [{"duration": "1m0s", "target": 50}, {"duration": "5m0s", "target": 50}]
},
"steps": [
{
"id": "post_api_login",
"name": "POST /api/login",
"protocol": "http",
"request": {
"method": "POST",
"url": "{{BASE}}/api/login",
"headers": [{"key": "Content-Type", "value": "application/json"}],
"body": {"type": "json", "content": "{\"user\":\"demo\",\"pass\":\"demo\"}"},
"modifiesData": true
},
"extract": [{"var": "token", "from": "jsonpath", "expr": "$.token"}],
"checks": [{"name": "login 200", "type": "status", "op": "eq", "value": 200}]
},
{
"id": "get_api_items",
"name": "GET /api/items",
"protocol": "http",
"request": {
"method": "GET",
"url": "{{BASE}}/api/items",
"headers": [{"key": "Authorization", "value": "Bearer {{token}}"}],
"body": {"type": "none"}
},
"checks": [{"name": "items 200", "type": "status", "op": "eq", "value": 200}],
"thinkTime": {"min": "1s"}
}
]
}
],
"thresholds": [{"metric": "req_duration", "expr": "p(95)<500"}]
}Çevrilmeyenler
Bunlar raporda satırıyla listelenir; testi kaydetmeden önce Spitfire'daki karşılığıyla elle kurarsınız:
- Döngüler ve koşullar (
for,if): Spitfire adımları sırayla koşar, her iterasyon tüm akıştır. - Veri dosyaları (
SharedArray,open()): CSV'yi Veri dosyaları'na yükleyip teste bağlayın; sütunlar{{kullanicilar.email}}gibi değişken olur. - HTTP dışı istekler (WebSocket, gRPC modülleri): Spitfire bunları yerleşik destekler; adımı editörde ekleyin. Yalnız bunlardan oluşan betikler "çevrilecek isteği yok" diye ayrıca sayılır.
- Özel metrikler ve serbest kod (Trend, Counter, yardımcı işlevler): karşılığı yok; adım başına süreler, kontroller ve eşikler çoğu durumu karşılar.
Bir klasörün tamamı
Dosyadan aç'ta birden çok dosya seçerseniz toplu içe aktarma sayfası her birini çevirir, doğrular ve raporuyla listeler; seçtiklerinizi bir düğmeyle kaydedersiniz. Komut satırında bir klasör tek komutla çevrilir; her betik için bir test dosyası yazılır ve raporun her satırı CSV'ye düşer (dosya, test, satır, düzey, mesaj):
spitfire convert ./tests -o spitfire-tests/ -r report.csvSpitfire tek komutla Docker'a ya da Kubernetes'e kurulur; ücretsiz sürümde bütün test özellikleri ve protokoller açıktır.