Ana içeriğe geç

Yapılandırma Referansı

TestFly framework'ünün tüm çalışma davranışı testfly.yml dosyası ile yönetilir. Bu belge; framework tarafından desteklenen her bir üst düzey bölümün, iç içe geçmiş yapılandırma özelliklerinin, varsayılan değerlerin, ortam değişkeni çözünürlüğünün ve profil geçersiz kılmalarının kapsamlı referansıdır.


Dosya Çözümleme Öncelik Sırası​

TestFly test paketi başlatılırken yapılandırma dosyasını şu öncelik sırasına göre arar:

  1. Sistem Özelliği (System Property) — -Dtestfly.config=/path/to/custom.yml (en yüksek öncelik)
  2. Classpath Kaynağı — src/test/resources/testfly.yml
  3. Çalışma Dizini (Working Directory) — ./testfly.yml (yedek konum)

Bu konumlardan hiçbirinde geçerli bir yapılandırma dosyası bulunamazsa, test paketi başlatması açıklayıcı bir IllegalStateException ile derhal durdurulur.


Ortam Değişkenleri ve Dinamik Değer Atama​

Yer Tutucu Sözdizimi (${VAR_NAME})​

testfly.yml içindeki tüm metin (string) değerler (metin liste öğeleri ve map değerleri dahil) ortam değişkenlerine veya Java sistem özelliklerine başvurabilir:

execution:
baseUrl: ${BASE_URL}
browserstack:
username: ${BS_USER}
accessKey: ${BS_KEY}

api:
auth:
admin:
type: bearer
token: ${API_TOKEN}

Çözümleme sırası: proje kökündeki .env, shell ortam değişkeni, Java sistem özelliği (-DVAR_NAME=value) ve ${VAR_NAME:-default} varsayılanıdır. Kaynak bulunamazsa yer tutucu korunur; gerekli değerleri çalıştırmadan önce sağlayın.

Yer tutucular YAML ayrıştırıldıktan sonra çözüldüğü için boolean ve sayısal alanlar (örneğin browser.headless, execution.threadCount) bunları kullanamaz — headless: ${HEADLESS:-true} açılışta ConstructorException ile başarısız olur. Bu değerler için bir profil dosyası (-Dtestfly.profile=ci) kullanın.

Ortam Profilleri (-Dtestfly.profile)​

Farklı ortamlar için testfly-<profil>.yml adlandırmasıyla geçersiz kılma dosyaları oluşturabilirsiniz:

testfly.yml            # Temel yapılandırma (ortak varsayılanlar)
testfly-staging.yml # Staging ortamına özel ayarlar
testfly-prod.yml # Canlı (Production) ortama özel ayarlar
testfly-ci.yml # CI/CD hattına özel ayarlar

Bir profili Maven veya Gradle ile etkinleştirebilirsiniz:

mvn test -Dtestfly.profile=staging
Profil seçimi

Her profil dosyası tam bir yapılandırmadır. TestFly seçilen dosyayı testfly.yml ile birleştirmeden yükler. Belirtilmeyen isteğe bağlı alanlar framework varsayılanlarını kullanır; zorunlu ayarlar profil dosyasında bulunmalıdır.


Ana testfly.yml Şablonu​

Aşağıdaki açıklamalı şablon, framework'ün desteklediği tüm yapılandırma bloklarını ve önerilen varsayılanları içerir:

# ── Özellik Panosu (Feature Switchboard) ─────────────────────────────────────
# Her modülün kendi ayarlarının ÜZERİNDE duran ana aç/kapa paneli.
# Bir anahtarı hiç yazmazsanız o modülün kendi ayarları geçerli olur;
# true/false yazarsanız onun üzerine yazılır. Aşağıdaki değerler çalışan, önerilen bir profildir; tamamı alan varsayılanı değildir.
features:
ai: true # tüm AI/agentic yüzeyler: act(), aiAssert(), hata analizi, AI healing
recording: false # tarayıcı çalışmasının MP4/GIF video kaydı
tracing: false # adım adım ekran görüntüleri + çalıştırma zaman çizelgesi (target/traces/)
network: false # CDP ağ yakalama, route mocking, URL engelleme listeleri
healing: false # locator self-healing (AI yedeği dahil)
visual: true # görsel regresyon karşılaştırması
performance: false # Core Web Vitals toplama
flakiness: true # flakiness geçmiş skorlaması
quarantine: true # karantinadaki testlerin otomatik atlanması
testManagement: false # TestRail / Xray sonuç gönderimi
notifications: true # Slack / Teams çalıştırma bildirimleri
consoleErrors: false # tarayıcı konsol (JS) hatalarının toplanması
loadtest: false # loadtest.enabled değerine işlenir; açık çağrılar henüz bu bayrakla engellenmez

# ── Browser (Tarayıcı) ────────────────────────────────────────────────────────
browser:
name: chrome # chrome | firefox | edge | safari
headless: false # CI ortamı algılandığında otomatik true yapılır
lifecycle: per-test # per-test (her teste temiz oturum) | per-suite (thread başına oturum koruma)
downloadDir: ./target/downloads # indirilen dosyaların kaydedileceği dizin
captureConsoleErrors: false # tarayıcı console.error loglarını topla
failOnConsoleErrors: false # SEVERE konsol hatası varsa testi başarısız say
device: # isteğe bağlı mobil emülasyon profili (örn: "iPhone 14")
matrix: [] # çoklu tarayıcı matrisi (örn: [chrome, firefox])
arguments: # tarayıcı çalıştırılabilirine iletilecek ek bayraklar
- --start-maximized
- --disable-notifications
- --remote-allow-origins=*
capabilities: # doğrudan WebDriver capability geçersiz kılmaları
acceptInsecureCerts: true
pageLoadStrategy: eager

# ── Execution (Çalıştırma Modu) ───────────────────────────────────────────────
execution:
mode: local # local | remote | browserstack | saucelabs
baseUrl: https://example.com # open("/") çağrılarında kullanılan temel web URL'i
gridUrl: http://localhost:4444 # Selenium Grid hub URL'i (mode: remote iken)
parallel: none # none | methods | classes | tests | instances
threadCount: 1 # parallel etkin olduğunda eşzamanlı çalışan iş parçacığı sayısı
maxActiveSessions: 5 # eşzamanlı aktif tarayıcı sayısını sınırlayan semafor
sessionWaitSeconds: 300 # testin boş tarayıcı yuvası için bekleyeceği süre, sn (0 = beklemeden hata ver)

# ── CI Sharding (Parçalama)
sharding:
enabled: false # testleri CI worker'ları arasında bölüştür
total: 1 # toplam worker (shard) sayısı
index: 0 # bu worker'ın indeksi (0-tabanlı)
strategy: lpt # lpt (en uzun önce) | round-robin
metricsFile: target/testfly-metrics.json

# ── BrowserStack (mode: browserstack)
browserstack:
username: ${BS_USER}
accessKey: ${BS_KEY}
os: Windows # Windows | OS X
osVersion: "11"
browser: chrome # chrome | firefox | edge | safari
browserVersion: latest
device: # gerçek mobil cihaz adı (örn: "iPhone 14")
realMobile: true
capabilities: # ek bstack:options geçersiz kılmaları
debug: false

# ── Sauce Labs (mode: saucelabs)
saucelabs:
username: ${SAUCE_USER}
accessKey: ${SAUCE_KEY}
region: us-west-1 # us-west-1 | eu-central | apac-southeast
platformName: "Windows 11"
browser: chrome
browserVersion: latest
capabilities: # ek sauce:options geçersiz kılmaları
recordVideo: true

# ── Timeouts (Zaman Aşımları) ────────────────────────────────────────────────
timeouts:
explicit: 10 # saniye — WaitEngine, Locator ve assertThat bekleme süresi
pageLoad: 30 # saniye — WebDriver sayfa yükleme zaman aşımı

# ── Retry (Yeniden Deneme) ───────────────────────────────────────────────────
retry:
enabled: true # global otomatik yeniden deneme anahtarı
maxAttempts: 2 # test başına toplam deneme sayısı (1 = tekrar yok, 2 = 1 asıl + 1 tekrar)

# ── Locators (Seçiciler ve İyileştirme) ───────────────────────────────────────
locators:
selfHealing: false # zaman aşımına uğrayan seçicileri alternatif stratejilerle otomatik onar
aiHealing: false # statik sezgiseller yetersiz kaldığında LLM ile seçici onarımı
maxDomTokens: 8000 # AI seçici onarımı için DOM budama belirteç (token) limiti
testIdAttribute: data-testid # getByTestId() tarafından sorgulanacak HTML özniteliği

# ── AI Failure Analysis (AI Hata Analizi) ────────────────────────────────────
ai:
enabled: true # TÜM AI yüzeyleri için ana anahtar (features.ai ile de ayarlanabilir)
failureAnalysis: false # test başarısız olduğunda AI ile kök neden analizi üret
generatePatch: false # test başarısız olduğunda target/remediations/ altında git diff .patch üret
actionCache: true # act() eylemlerini .testfly/action-cache.json içinde önbelleğe al
provider: gemini # gemini | claude | openai-compatible
apiKey: ${AI_API_KEY} # sağlayıcı API anahtarı
model: # isteğe bağlı — varsayılan: gemini-2.5-flash veya claude-haiku-4-5-20251001
language: tr # üretilecek analiz dili: tr, en, de, fr vb.
timeoutSeconds: 20 # AI sağlayıcısından yanıt bekleme zaman aşımı
baseUrl: # isteğe bağlı — özel uç nokta (openai-compatible için zorunludur)

# ── CI Kalite Kapıları ───────────────────────────────────────────────────────
ci:
failOnPassRateBelow: 0 # 0 = devre dışı. Örnek: 85 (başarı oranı %85 altındaysa build'i kır)
maxFlakyTests: -1 # -1 = devre dışı. Tekrar denemeyle geçen test sayısı aşılırsa build'i kır
captureMetadata: true # raporlara Git dalı, commit, build URL bilgilerini otomatik ekle

# ── Bildirimler (Notifications) ──────────────────────────────────────────────
notifications:
slack:
webhookUrl: ${SLACK_WEBHOOK}
notifyOnFailureOnly: false
teams:
webhookUrl: ${TEAMS_WEBHOOK}
notifyOnFailureOnly: false

# ── Reporting (Raporlama) ────────────────────────────────────────────────────
reporting:
mergeRuns: false # ardışık test koşumlarını sıfırlamak yerine kümülatif olarak birleştir (-Dtestfly.merge=true)
historyRuns: 10 # rapor geçmişi seçicisinde saklanacak geçmiş koşum sayısı
allure:
enabled: false # target/allure-results/ dizinine Allure 2 rapor çıktıları üret
reportportal:
enabled: false
endpoint: http://localhost:8080
apiKey: ${RP_API_KEY}
project: testfly_project
launch: "Regression Suite"
description: "Otomatik test koşumu"
attributes: "env:staging;team:qa"
type: auto # auto (Web vs API otomatik algıla) | web | api
mode: default # default | step

# ── Ekran Kaydı (Screen Recording) ───────────────────────────────────────────
recording:
enabled: false # tarayıcı oturumunu MP4 video olarak kaydet
mode: retain-on-failure # retain-on-failure | on | off
format: mp4 # mp4 (varsayılan, saf Java H.264) | gif
fps: 5 # saniyedeki kare sayısı (1-10 önerilir)
maxDurationSeconds: 60 # test başına maksimum video uzunluğu (saniye)
cdp: true # Chromium üzerinde Chrome DevTools Protocol screencast kullan

# ── Yürütme İzleme (Execution Tracing) ───────────────────────────────────────
tracing:
enabled: false # adım adım ekran görüntüleri ve zaman tüneli içeren HTML izleme dosyası üret
captureOnPass: false # başarılı testler için de izleme kaydet

# ── Görsel Karşılaştırma (Visual Regression) ─────────────────────────────────
visual:
baselineDir: src/test/resources/baselines # onaylanmış referans görseller dizini
diffDir: target/visual-diffs # görsel uyuşmazlık çıktılarının yazılacağı dizin
defaultTolerance: 0.01 # izin verilen piksel fark oranı (0.0 ile 1.0 arası)
updateBaselines: false # true ise geçerli ekran görüntülerini referans olarak kaydeder

# ── Çoklu Oturum İzolasyonu (Sessions) ───────────────────────────────────────
sessions:
maxPerTest: 2 # test başına izin verilen izole tarayıcı sayısı (örn: çok kullanıcılı sohbet)

# ── Performans (Core Web Vitals) ─────────────────────────────────────────────
performance:
captureOnEveryTest: false # geçen her tarayıcı testinden sonra metrikleri topla
lcpWarnMs: 2500 # Largest Contentful Paint uyarı eşiği (ms, 0 = devre dışı)
fcpWarnMs: 1800 # First Contentful Paint uyarı eşiği (ms)
ttfbWarnMs: 800 # Time to First Byte uyarı eşiği (ms)
clsWarn: 0.1 # Cumulative Layout Shift eşiği

# ── Karantina (Quarantine) ───────────────────────────────────────────────────
quarantine:
enabled: true # testfly-quarantine.yml veya Cucumber etiketli testleri otomatik atla
cucumberTag: quarantine # karantinaya alınmış senaryoları belirten etiket adı (@ olmadan)

# ── Kararsızlık Takibi (Flakiness) ───────────────────────────────────────────
flakiness:
historyRuns: 20 # kararlılık skoru için incelenecek geçmiş koşum sayısı
highRiskThreshold: 33.0 # yüksek risk sayılacak kararsızlık hata yüzdesi
failOnHighFlakiness: false # yüksek riskli kararsız test tespit edilirse build'i kır

# ── Zaman Simülasyonu (Clock Mocking) ────────────────────────────────────────
clock:
injectHeader: false # HTTP isteklerine simüle edilmiş tarih başlığı ekle
headerName: X-Mock-Date # backend ile zaman senkronizasyonu için özel başlık adı

# ── Ağ Araya Girme (Network Interception) ────────────────────────────────────
network:
interceptEnabled: false # CDP üzerinden ağ trafiğine müdahale ve yanıt mock'lamayı etkinleştir
blockUrls: # global engellenecek URL kalıpları (izleyiciler, reklamlar vb.)
- "*google-analytics.com*"
- "*doubleclick.net*"

# ── E-posta Doğrulama (Email Verification) ───────────────────────────────────
email:
provider: mailhog # mailhog | mailtrap | outlook | imap
timeoutSeconds: 30 # beklenen e-postanın gelmesi için maksimum bekleme süresi
pollIntervalMs: 1000 # gelen kutusunu sorgulama aralığı (ms)
autoClear: false # her testten önce gelen kutusunu otomatik temizle
mailhog:
host: localhost
port: 8025
mailtrap:
apiToken: ${MAILTRAP_TOKEN}
accountId: ${MAILTRAP_ACCOUNT}
inboxId: ${MAILTRAP_INBOX}
outlook:
tenantId: ${AZURE_TENANT_ID}
clientId: ${AZURE_CLIENT_ID}
clientSecret: ${AZURE_CLIENT_SECRET}
mailbox: test@example.com
imap:
host: imap.example.com
port: 993
ssl: true
username: ${EMAIL_USER}
password: ${EMAIL_PASS}
folder: INBOX

# ── Veritabanı Doğrulamaları (Database) ───────────────────────────────────────
database:
url: jdbc:postgresql://localhost:5432/maindb
username: ${DB_USER}
password: ${DB_PASS}
driver: org.postgresql.Driver
datasources:
analytics:
url: jdbc:postgresql://localhost:5432/analytics
username: ${ANALYTICS_USER}
password: ${ANALYTICS_PASS}

# ── API Testi (API Testing) ──────────────────────────────────────────────────
api:
baseUrl: https://api.example.com # ApiClient için varsayılan HTTP adresi
timeoutSeconds: 30 # istek başına zaman aşımı (saniye)
connectTimeoutSeconds: 30 # TCP/TLS bağlantı zaman aşımı; > 0 olmalı
maxConcurrentRequests: 0 # eşzamanlı gerçek HTTP gönderim tavanı; 0 = sınırsız
ssl:
trustAll: false # tüm sertifika zincirlerine güven (hostname yine doğrulanır)
# trustStore: # özel güven deposu — trustAll ile birlikte kullanılamaz
# path: certs/truststore.p12 # trustStore bloğu yazıldığında zorunludur
# type: PKCS12 # PKCS12 (varsayılan) veya JKS
# password: ${TESTFLY_TRUSTSTORE_PASSWORD}
logBody: false # istek ve yanıt gövdelerini HTML adım günlüğüne ekle
logContext: true # sorgu parametrelerini ve başlıkları günlüğe kaydet
prettyLog: false # JSON yanıtlarını biçimlendirilmiş (girintili) yaz
logCurl: false # başarısız isteklerde eşdeğer curl komutunu yazdır
truncationLimit: 300 # yanıt gövdelerinin günlüğe yazılacak maksimum karakter sınırı
maskedHeaders: # günlüklere yazılırken maskelenecek başlıklar
- Authorization
- Cookie
- X-Api-Key
retry:
enabled: false # geçici HTTP hatalarında otomatik yeniden dene
maxAttempts: 3
backoffMs: 500
retryOnStatus: [502, 503, 504]
retryOnException: true
auth:
adminBearer:
type: bearer
token: ${ADMIN_TOKEN}
basicAuth:
type: basic
username: apiuser
password: ${API_PASS}
oauthClient:
type: oauth2
tokenUrl: https://auth.example.com/oauth/token
clientId: ${CLIENT_ID}
clientSecret: ${CLIENT_SECRET}

# ── Test Yönetim Sistemleri (Test Management) ────────────────────────────────
testmanagement:
testrail:
enabled: false
url: https://myorg.testrail.io
username: ${TR_USER}
apiKey: ${TR_KEY}
projectId: 1
suiteId: 10
runName: "Otomatik Test Koşumu"
autoCreateRun: true
xray:
enabled: false
mode: cloud # cloud | server
clientId: ${XRAY_ID}
clientSecret: ${XRAY_SECRET}
projectKey: PROJ
testPlanKey: PROJ-100

# ── Yük Testi (Load Testing) ──────────────────────────────────────────────────
loadtest:
enabled: false # ayrılmış bayrak; açık LoadTestRunner.run() çağrılarını engellemez
baseUrl: https://api.example.com # yük testi hedef temel adresi
engine: auto # auto (varsa Gatling, yoksa JDK) | gatling | jdk
users: 10 # eşzamanlı sanal kullanıcı sayısı
rampUp: 10s # kullanıcı sayısına kademeli artış süresi (örn: 10s, 1m)
hold: 30s # zirve kullanıcı yükünün korunacağı süre (örn: 30s, 5m)
cooldown: 5s # kademeli soğuma süresi (örn: 5s)
maxUsers: 1000 # izin verilen tavan kullanıcı sayısı
resultsDir: target/loadtest # yük testi çıktı ve rapor dizini
reportEnabled: true # bağımsız HTML yük testi raporu oluştur
requestTimeoutSeconds: 30 # HTTP istek zaman aşımı (saniye)

Detaylı Bölüm Rehberi​

Özellik Panosu (Features)​

Tüm isteğe bağlı framework modülleri için tek bir aç/kapa paneli. Her modülün kendi ayarlarının üzerinde durur; böylece bir alt sistemi kapatmak için hangi anahtarın onu yönettiğini aramanız veya modülün detaylı yapılandırmasını silmeniz gerekmez.

features:
ai: false # çalıştırma boyunca hiçbir AI çağrısı yapılmasın
recording: true # recording.enabled false olsa bile videoyu zorla aç
healing: false # locator self-healing kapalı

Çözümleme​

Her anahtar üç durumludur:

DeğerEtkisi
yazılmamış (veya null)Modülün kendi ayarları karar verir. features: bloğunu hiç yazmamak, 1.0.5 öncesi davranışı birebir korur.
trueModülün birincil enabled bayrağı zorla açık yapılır. Alt ayarlara (recording.mode, recording.fps, …) dokunulmaz.
falseModül kendi ayarları ne derse desin zorla kapalı yapılır.

Desteklenen anahtarlar​

AnahtarÜzerine yazdığı ayarVarsayılan
aiai.enabled — act(), aiAssert(), hata analizi, patch üretimi ve AI locator healing'i kapsartrue
recordingrecording.enabledfalse
tracingtracing.enabled — adım adım ekran görüntüleri ve zaman tüneli içeren HTML izleme dosyası (target/traces/) üretirfalse
networknetwork.interceptEnabledfalse
healinglocators.selfHealing ve locators.aiHealingfalse
visualmodül bayrağı yok — kapatılmadığı sürece görsel regresyon kullanılabilirtrue
performanceperformance.captureOnEveryTestfalse
flakinessmodül bayrağı yok — kapatılmadığı sürece flakiness analizi çalışırtrue
quarantinequarantine.enabledtrue
testManagementtestManagement.testrail.enabled ve testManagement.xray.enabledfalse
notificationsmodül bayrağı yok — kapatılmadığı sürece Slack/Teams adapter'ları kaydolurtrue
consoleErrorsbrowser.captureConsoleErrorsfalse
loadtestAyrıştırılan loadtest.enabled değerini geçersiz kılar; açık LoadTestRunner.run() çağrıları henüz bu değeri okumazfalse

Bir test özelliği açıkça istediğinde "kapalı" ne demek?​

Arka planda çalışan davranışlar (recording, tracing, performance toplama, flakiness analizi, bildirimler, TestRail/Xray gönderimi) hiç çalışmaz.

Bir testin açıkça çağırdığı özellikler ise asla sessizce geçmez — çünkü sessizce atlanan bir doğrulama, sahte bir yeşildir:

ÇağrıÖzellik kapalıyken
act("...")IllegalStateException: AI features are disabled via ai.enabled=false or features.ai=false in testfly.yml
aiAssert(...)doğrulama şu gerekçeyle başarısız olur: AI features are disabled via ai.enabled=false or features.ai=false
VisualAssert.assertScreenshot(...)TestNG SkipException — test atlandı olarak raporlanır, geçmiş sayılmaz

Tanılama​

FrameworkBootstrap, suite başlangıcında aktif override'ları yazdırır:

[TestFly] features: ai=OFF, recording=ON, healing=OFF

Eklentiler kendi davranışlarını özel bir özellik adıyla yönetebilir. Tanınmayan adlar kabul edilir (bir eklentiye ait olabilir) ancak bir kez raporlanır; böylece bir yazım hatası sessizce yutulmak yerine görünür olur:

[TestFly] Unknown feature name in testfly.yml: 'features.recordng' — ignored. Known features: [...]

Programatik erişim io.testfly.config.FeatureGate üzerinden sağlanır:

FeatureGate.enabled(FeatureGate.AI);                            // yalnızca panel, varsayılan açık
FeatureGate.enabled(FeatureGate.RECORDING, rec.isEnabled()); // panel, modül bayrağının üzerine yazıyor
FeatureGate.override(FeatureGate.VISUAL); // ham üç-durum, ayarlanmamışsa null
Bilinmeyen anahtarlar artık suite'i düşürmüyor

testfly.yml hoşgörülü biçimde ayrıştırılır: karşılığı olmayan bir anahtar, çalışmayı ConstructorException ile çökertmek yerine atlanır ve stderr'e raporlanır ([TestFly] Unknown config key 'headles' on Browser — ignored).


Tarayıcı (Browser)​

Tarayıcı sağlama, çalıştırma modu, yetenekler ve süreç argümanlarını yönetir.

ÖzellikTipVarsayılanAçıklama
namestringzorunluBaşlatılacak tarayıcı. Geçerli değerler: chrome, firefox, edge, safari. Yalnızca browser.matrix boş değilse atlanabilir.
headlessbooleanfalseTarayıcıyı görsel bir pencere olmadan arka planda çalıştırır. CI ortamında otomatik true yapılır.
lifecyclestringper-testWebDriver yaşam döngüsü: per-test (her testten sonra kapatır) veya per-suite (thread başına oturumu testler boyunca açık tutar).
downloadDirstring./target/downloadsİndirilen dosyaların kaydedileceği yerel dizin.
captureConsoleErrorsbooleanfalsetrue ise yürütme sırasında tarayıcı console.error loglarını yakalar.
failOnConsoleErrorsbooleanfalsetrue ise test sırasında SEVERE düzeyinde konsol hatası oluştuğunda testi başarısız sayar.
devicestringnullMobil emülasyon profili adı (örn: "iPhone 14", "Pixel 7").
matrixlist<string>[]Çoklu tarayıcı test koşumu için tarayıcı listesi (örn: [chrome, firefox]).
argumentslist<string>[]Tarayıcı ikili dosyasına aktarılan komut satırı bayrakları (örn: --incognito, --no-sandbox).
capabilitiesmap{}WebDriver seçeneklerine eklenen ham yetenekler (örn: acceptInsecureCerts, pageLoadStrategy).

Çalıştırma (Execution)​

Test dağıtımı, temel adresler, eşzamanlılık ve bulut ızgara (grid) sağlayıcılarını kontrol eder.

ÖzellikTipVarsayılanAçıklama
modestringzorunluÇalıştırma ortamı: local, remote, browserstack veya saucelabs.
baseUrlstringnullWeb testleri için temel URL. open("/home") çağrıldığında bu adresin ardına eklenir.
gridUrlstringnullUzak Selenium Grid adresi (mode: remote iken zorunludur). Örnek: http://localhost:4444.
parallelstringnoneTestNG paralel dağıtım modu: none, methods, classes, tests, instances.
threadCountint1Paralel mod aktifken çalışacak iş parçacığı (worker thread) sayısı.
maxActiveSessionsint5Eşzamanlı aktif tarayıcı oturumlarını sınırlayan semafor. Ekstra thread'ler yuva boşalana kadar kuyrukta bekler (bkz. sessionWaitSeconds). MultiSessionManager ile açılan adlandırılmış oturumlar da aynı sınıra sayılır.
sessionWaitSecondsint300Bir thread'in boş oturum yuvası için, zaman aşımı hatası vermeden önce bekleyeceği süre (saniye). 0 değeri, boş yuva yoksa beklemeden hata verir. >= 0 olmalıdır. Önceki sürümlerde sabit 30 saniyeydi.
sharding.enabledbooleanfalseCI ortamlarında testleri paralel worker'lar arasında bölüştürür.
sharding.totalint1Toplam paralel CI worker (shard) sayısı.
sharding.indexint0Bu worker'ın sıfır-tabanlı indeksi (0 ile total-1 arası).
sharding.strategystringlptBölüştürme stratejisi: lpt (en uzun test önce) veya round-robin.
sharding.metricsFilestringtarget/testfly-metrics.jsonLPT stratejisi için geçmiş süre metriklerinin okunduğu dosya.

Boyutlandırma kuralı: maxActiveSessions değerini en az threadCount kadar yapın (bir test aynı anda ek adlandırılmış oturum açıyorsa her biri için bir yuva daha ekleyin). parallel değeri none değilse ve threadCount, maxActiveSessions değerinden büyükse TestFly başlangıçta uyarı yazar: fazla thread'ler yuva için kuyrukta bekler ve yuva sessionWaitSeconds içinde boşalmazsa zaman aşımı hatasıyla başarısız olur. Çalıştırma reddedilmez.

Bulut Blokları: browserstack & saucelabs​

execution:
mode: browserstack
browserstack:
username: ${BS_USER}
accessKey: ${BS_KEY}
os: Windows
osVersion: "11"
browser: chrome
browserVersion: latest
capabilities:
projectName: "E-Ticaret"
buildName: "Build #104"

Zaman Aşımları (Timeouts)​

Saniye cinsinden merkezi bekleme süreleri.

ÖzellikTipVarsayılanAçıklama
explicitintzorunlu, > 0WaitEngine, Locator ve assertThat() DOM sorgularında kullanılan zaman aşımı (saniye).
pageLoadintzorunlu, > 0WebDriver.Timeouts.pageLoadTimeout() süresi (saniye).

Yeniden Deneme (Retry)​

Başarısız testlerin otomatik olarak yeniden denenmesi.

ÖzellikTipVarsayılanAçıklama
enabledbooleantrueOtomatik test tekrarını küresel olarak açar/kapatır.
maxAttemptsint1Test başına toplam deneme sayısı. 1 = tekrar yok, 2 = 1 asıl koşum + 1 tekrar.
Metot Düzeyinde Geçersiz Kılma

Belli bir test için genel ayarı @Retryable(maxAttempts = 3) anotasyonu ile ezebilirsiniz.


Seçiciler (Locators)​

Akıllı seçici sentezi ve dayanıklılık ayarları.

ÖzellikTipVarsayılanAçıklama
selfHealingbooleanfalseAçıldığında, waitForVisible sırasında zaman aşımına uğrayan seçiciler alternatif stratejilerle (id, test-id, text, placeholder) otomatik onarılır ve target/healed-locators.json dosyasına yazılır.
aiHealingbooleanfalseStandart sezgiseller yetersiz kaldığında LLM ile seçici sentezlemeyi açar.
maxDomTokensint8000AI seçici onarımında modele gönderilecek budanmış DOM token bütçesi.
testIdAttributestringdata-testidgetByTestId("submit-btn") çağrısının hedeflediği HTML niteliği (data-qa, data-test vb. olarak değiştirilebilir).

AI Hata Analizi​

Yapay zeka destekli hata sınıflandırma ve öneri motoru.

ÖzellikTipVarsayılanAçıklama
enabledbooleantrueTüm AI yüzeyleri için ana anahtar: act(), aiAssert(), hata analizi, patch üretimi ve AI locator healing. Aşağıdaki ayrıntılı anahtarlar hangilerinin çalışacağını seçer; bu false iken hiçbiri çalışamaz. features.ai üzerinden de ayarlanabilir.
failureAnalysisbooleanfalsetrue ise test çöktüğünde hata yığını, adım günlüğü ve DOM durumunu LLM modeline gönderir.
generatePatchbooleanfalsetrue ise test başarısız olduğunda target/remediations/ dizininde otomatik Git diff .patch dosyası üretir.
actionCachebooleantruetrue ise derlenmiş act() planlarını .testfly/action-cache.json dosyasında saklar; önbellek isabeti yeni bir LLM isteğini önler, ancak önbellek okuma ve tarayıcı yürütme süresi devam eder.
providerstringclaudeAI arka ucu: gemini, claude veya openai-compatible.
apiKeystringnullSeçilen sağlayıcı için yetkilendirme anahtarı.
modelstringnullHedef model adı. Boş bırakıldığında Gemini için gemini-2.5-flash, Claude için claude-haiku-4-5-20251001 varsayılandır.
baseUrlstringnullÖzel API adresi (openai-compatible sağlayıcılar için zorunludur).
languagestringtrÜretilecek analiz raporunun dili (tr, en, de, fr vb.).
timeoutSecondsint20AI yanıtı için maksimum bekleme süresi (saniye).

CI Kalite Kapıları​

CI ortamı algılama ve derleme başarı kriterleri.

ÖzellikTipVarsayılanAçıklama
failOnPassRateBelowdouble0Minimum test başarı yüzdesi (örn: 85.0). Başarı bu oranın altındaysa derleme kırılır. 0 devre dışıdır.
maxFlakyTestsint-1Tekrar denemeyle geçen (flaky) test sayısı bu sınırı aşarsa derleme kırılır. -1 devre dışıdır.
captureMetadatabooleanOtomatikCI ortam bilgilerini (Git dalı, commit SHA, PR no, build URL) raporlara işler.

Raporlama (Reporting)​

Dahili HTML gösterge paneli (dashboard) raporu, koşum geçmişi arşivleme ve üçüncü taraf test portalları ayarları.

ÖzellikTipVarsayılanAçıklama
mergeRunsbooleanfalsetrue yapıldığında, ardışık test koşumları önceki testleri silmek yerine sonuçları kümülatif tek bir raporda birleştirir. Komut satırından da açılabilir: -Dtestfly.merge=true.
historyRunsint10target/reports/ altında saklanacak ve interaktif HTML raporundaki koşum seçici menüsünde listelenecek maksimum geçmiş koşum sayısı.
Koşum Arşivleme ve Geçmiş Seçici

TestFly, ana target/testfly-report.html raporunun yanı sıra her test koşumunu otomatik olarak target/reports/testfly-report-YYYYAAGG-SSddss.html adıyla zaman damgalı olarak arşivler. Raporun üst başlığında bulunan koşum seçici açılır menüsü veya Run History sekmesi üzerinden geçmiş koşumlar, zaman çizelgeleri ve başarı oranları arasında kolayca geçiş yapabilirsiniz.

reportportal​

ÖzellikTipVarsayılanAçıklama
enabledbooleanfalseSonuçları ReportPortal'a aktarmayı açar.
endpointstringnullReportPortal sunucu adresi (örn: http://reportportal.sirketim.com:8080).
apiKeystringnullKullanıcı API Erişim Belirteci.
projectstringsuperadmin_personalProje adı.
launchstringTestFly SuiteReportPortal'da açılacak test koşumunun adı.
typestringautoKoşum zenginleştirme tipi: auto (Web vs API otomatik algılar), web veya api.
modestringdefaultDinleyici modu: default veya step.
attributesstring""Koşuma eklenecek etiketler (örn: "env:ci;takim:qa").

allure​

ÖzellikTipVarsayılanAçıklama
enabledbooleanfalsetarget/allure-results/ dizinine Allure 2 çıktıları üretir.

Bildirimler (Notifications)​

Test koşumu tamamlandığında webhook üzerinden özet bildirim gönderimi.

ÖzellikTipVarsayılanAçıklama
slack.webhookUrlstringnullSlack Incoming Webhook URL'i.
slack.notifyOnFailureOnlybooleanfalseYalnızca başarısız test varsa bildirim gönder.
teams.webhookUrlstringnullMicrosoft Teams Connector Webhook URL'i.
teams.notifyOnFailureOnlybooleanfalseYalnızca başarısız test varsa bildirim gönder.

API Testi (API Testing)​

Yerleşik REST istemcisi (ApiClient & BaseApiTest) yapılandırması.

ÖzellikTipVarsayılanAçıklama
baseUrlstringnullAPI testleri için varsayılan HTTP adresi (tanımsızsa execution.baseUrl kullanılır).
baseUrlsmap<string,string>{}ApiClient.toService(name) / apiToService(name) için adlandırılmış servis adresleri. Eksik servis api.baseUrl değerine düşer; ikisi de yoksa çağrı başarısız olur.
timeoutSecondsint30İstek zaman aşımı (saniye).
logBodybooleanfalseİstek ve yanıt gövdelerini HTML adım raporuna ekle.
logContextbooleantrueBaşlıkları, sorgu parametrelerini ve HTTP metotlarını günlüğe yaz.
prettyLogbooleanfalseJSON gövdelerini biçimlendirerek yaz.
logCurlbooleanfalseBaşarısız isteklerde eşdeğer curl komutunu yazdır.
truncationLimitint300Yanıt gövdelerinin günlüğe yazılacağı maksimum karakter sayısı.
maskedHeaderslist<string>["Authorization", "Cookie", "X-Api-Key"]Günlüklerde maskelenecek başlıklar.

SSL ve transport ayarları​

AlanTipVarsayılanAnlamı
api.connectTimeoutSecondsint30Alttaki JDK HttpClient bağlantı zaman aşımı. > 0 olmalıdır; aksi halde ilk istek IllegalArgumentException ile başarısız olur.
api.maxConcurrentRequestsint0Runtime genelinde eşzamanlı gerçek HTTP gönderim tavanı (adil semafor); 0 sınırsızdır, negatif değerler reddedilir. Mock yanıtlar permit tüketmez. Test kapsamları aktifken değer değiştirilemez.
api.ssl.trustAllbooleanfalseHer sertifika zincirine güvenir, HTTPS hostname doğrulamasını korur; kapsam başına bir kez WARN adımı loglar.
api.ssl.trustStore.pathstring—Özel güven deposunun dosya yolu; bu profil için varsayılan JDK deposunun yerini alır. trustStore bloğu yazıldığında zorunludur.
api.ssl.trustStore.typestringPKCS12PKCS12 veya JKS; başka değerler reddedilir.
api.ssl.trustStore.passwordstringnullParolayı ${TESTFLY_TRUSTSTORE_PASSWORD} ile sağlayın; asla commit'lemeyin.

trustAll: true ile birlikte bir trustStore bloğu tanımlamak Conflicting SSL selection hatası verir. İstek üzerindeki .trustStore(...) veya .trustAllCerts() o istek için YAML SSL seçiminin tamamını geçersiz kılar. .requestTimeout(Duration) veya mevcut .timeout(int) istek başına zaman aşımını değiştirir; son çağrı kazanır. Bu bir socket read-idle timeout değildir. Batch limiti mantıksal çağrıları, global limit gerçek gönderimleri sınırlar.

SSL yapılandırması ve Timeouts & Performance sayfalarına bakın.

api.retry​

Geçici sunucu hatalarında (örn: 502, 503, 504) HTTP düzeyinde yeniden deneme politikası:

api:
retry:
enabled: true
maxAttempts: 3
backoffMs: 500
retryOnStatus: [502, 503, 504]
retryOnException: true

api.auth​

Testlerde @UseAuth("ad") veya apiClient().withAuth("ad") ile çağrılan adlandırılmış kimlik doğrulama profilleri:

api:
auth:
adminBearer:
type: bearer
token: ${SECRET_TOKEN}
gatewayUser:
type: basic
username: testuser
password: ${USER_PASS}
keyAuth:
type: apiKey
headerName: X-API-Token
apiKey: ${API_KEY}
oauth2Service:
type: oauth2
tokenUrl: https://auth.sirketim.com/oauth/token
clientId: ${CLIENT_ID}
clientSecret: ${CLIENT_SECRET}

Veritabanı (Database)​

db() yardımcısı ile veritabanı durumu doğrulama ve veri tohumlama bağlantısı.

ÖzellikTipVarsayılanAçıklama
urlstringnullVarsayılan veri kaynağı için JDBC bağlantı dizesi.
usernamestringnullVeritabanı kullanıcısı.
passwordstringnullVeritabanı parolası.
driverstringnullJDBC sürücü sınıfı (çoğu popüler veritabanında URL'den otomatik algılanır).
datasourcesmap{}db("ad") ile erişilen adlandırılmış veri kaynakları.

E-posta Doğrulama (Email)​

Gelen kutusu test entegrasyonları (Mailhog, Mailtrap, Outlook Graph, IMAP).

ÖzellikTipVarsayılanAçıklama
providerstringmailhogAktif sağlayıcı: mailhog, mailtrap, outlook, imap.
timeoutSecondsint30E-postanın gelmesi için bekleme süresi (saniye).
pollIntervalMsint1000Gelen kutusunu kontrol etme aralığı (ms).
autoClearbooleanfalseHer test metodundan önce gelen kutusunu temizle.

Performans (Performance)​

Web testlerinde Google Core Web Vitals metriklerini otomatik toplama ve doğrulama.

ÖzellikTipVarsayılanAçıklama
captureOnEveryTestbooleanfalseGeçen her tarayıcı testinden sonra performans metriklerini bir kez topla. Bir open()/navigasyon hook'u değildir.
lcpWarnMsdouble0Largest Contentful Paint uyarı eşiği (ms, 0 = devre dışı).
fcpWarnMsdouble0First Contentful Paint uyarı eşiği (ms).
ttfbWarnMsdouble0Time to First Byte uyarı eşiği (ms).
clsWarndouble0Cumulative Layout Shift skor eşiği (örn: 0.1).

Görsel Karşılaştırma (Visual)​

Piksel tabanlı ekran görüntüsü karşılaştırması ve referans görsel yönetimi.

ÖzellikTipVarsayılanAçıklama
baselineDirstringsrc/test/resources/baselinesOnaylanmış referans görseller dizini.
diffDirstringtarget/visual-diffsFark tespit edilen görsellerin yazılacağı dizin.
defaultTolerancedouble0İzin verilen piksel fark tolerans oranı (örn: %2 için 0.02).
updateBaselinesbooleanfalseTest koşumundaki güncel ekran görüntülerini referans görsel olarak kaydet.
failOnNewBaselinebooleanfalseReferans görsel yoksa yeni referans oluşturmak yerine testi başarısız yap.

Ekran Kaydı ve İzleme​

Hata ayıklama, kök neden analizi ve denetim uyumluluğu için tarayıcı oturumu yakalama. Detaylar için Video Kaydı Kılavuzu sayfasına bakın.

ÖzellikTipVarsayılanAçıklama
recording.enabledbooleanfalseWeb UI video kaydını açıp kapatan ana anahtar.
recording.modestringretain-on-failureretain-on-failure: Test geçerse kareleri atar, kalırsa video üretir.
on: Tüm testleri kaydeder.
off: Video kaydını kapatır.
recording.formatstringmp4Video formatı: mp4 (saf Java H.264 video, varsayılan) veya gif (hareketli GIF).
recording.fpsint2Saniyede yakalanan kare hızı (önerilen 2–5).
recording.maxDurationSecondsint60Test başına izin verilen maksimum video uzunluğu (saniye).
recording.cdpbooleantrueTrue olduğunda Chrome/Edge üzerinde CDP screencast kullanarak test hızını düşürmeden kayıt alır.
tracing.enabledbooleanfalseZaman tüneli, tıklanabilir adım ekran görüntüleri ve hata anı görseli içeren bağımsız HTML izleme dosyası üretir (target/traces/{Class}/{method}-trace.html).
tracing.captureOnPassbooleanfalseBaşarılı testlerde de izleme kaydeder.

Karantina (Quarantine)​

Kararsız veya bakım altındaki testlerin otomatik yönetimi.

ÖzellikTipVarsayılanAçıklama
enabledbooleantruetestfly-quarantine.yml içinde listelenen veya Cucumber etiketi alan testleri otomatik atlar.
cucumberTagstringquarantineKarantinadaki senaryoları belirten Cucumber etiketi (@ olmadan).

Kararsızlık Takibi (Flakiness)​

Geçmiş test kararlılık skorlaması ve kırılgan test önleme.

ÖzellikTipVarsayılanAçıklama
historyRunsint20Skorlama için incelenecek geçmiş çalıştırma sayısı.
highRiskThresholddouble33.0Yüksek riskli sayılacak hata yüzdesi.
failOnHighFlakinessbooleanfalseYüksek riskli test varsa derlemeyi başarısız sayar.

Test Yönetim Sistemleri​

Test sonuçlarını ve koşum bağlantılarını Jira ve TestRail'e otomatik aktarır.

testmanagement:
testrail:
enabled: true
url: https://sirketim.testrail.io
username: ${TR_USER}
apiKey: ${TR_KEY}
projectId: 1
suiteId: 2
autoCreateRun: true

xray:
enabled: true
mode: cloud # cloud | server
clientId: ${XRAY_ID}
clientSecret: ${XRAY_SECRET}
projectKey: PROJ
testPlanKey: PROJ-12

Saat ve Ağ Müdahalesi​

  • clock.injectHeader: Tarayıcı isteklerine sahte tarih HTTP başlığı ekler (varsayılan false).
  • clock.headerName: Özel başlık adı (varsayılan "X-Mock-Date").
  • network.interceptEnabled: Chrome DevTools Protokolü üzerinden ağ trafiğine müdahale ve stubbing'i açar (varsayılan false).
  • network.blockUrls: Eşleşen URL isteklerini ağ düzeyinde global olarak engeller (örn: reklamlar, izleyiciler) (varsayılan: []).

Yük Testi (Load Testing)​

Gatling ve Java Sanal İş Parçacığı (Virtual Threads) tabanlı eşzamanlı yük testi koşturma motoru ayarları. Detaylı bilgi için Yük Testi Başlangıç Rehberi ve Yük Testi Konfigürasyonu sayfalarına bakın.

ÖzellikTipVarsayılanAçıklama
enabledbooleanfalseAyrılmış etkin bayrak (features.loadtest ile geçersiz kılınabilir); mevcut LoadTestRunner.run() yolu bu değeri uygulamaz.
baseUrlstringnullSenaryo/annotation önceliğinden sonra kullanılan yük testi adresi. Gatling execution.baseUrl değerine düşer; JDK motoru açık bir load/senaryo/annotation adresi gerektirir.
enginestringautoÇalıştırma motoru: auto (varsa Gatling, yoksa JDK), gatling (kesinlikle Gatling gerektirir), jdk (yerel sanal iş parçacıkları / virtual threads).
usersint10Kodda belirtilmediğinde kullanılacak varsayılan eşzamanlı kullanıcı sayısı.
rampUpstring10sZirve kullanıcı sayısına ulaşırken geçecek kademeli artış süresi (örn: 10s, 1m).
holdstring30sZirve kullanıcı yükünün korunacağı süre (örn: 30s, 5m).
cooldownstring5sTest bitimindeki kademeli soğuma süresi (örn: 5s).
maxUsersint1000İzin verilen tavan kullanıcı sayısı (güvenlik sınırı).
resultsDirstringtarget/loadtestYük testi metrik ve rapor dosyalarının yazılacağı dizin.
reportEnabledbooleantrueMüstakil HTML yük testi raporunun ve Gatling bağlantılarının üretilmesini sağlar.
requestTimeoutSecondsint30HTTP bağlantı ve istek zaman aşımı süresi (saniye).

Doğrulama ve Başlatma Tanılaması​

Yapılandırma doğrulaması toplu değil, aşamalı ve ilk hatada duran bir süreçtir:

  • SnakeYAML, eşleşen bir property bulunmayan anahtarları stderr'e yazar ve yok sayar.
  • ConfigurationLoader, tarayıcı adı (veya matrix), execution modu ve pozitif explicit/page-load timeout değerleri ister.
  • Ardından ExecutionValidator paralel modu, thread/session sınırlarını ve ilgili execution kısıtlarını doğrular.
  • Bulut kimlik bilgileri gibi sağlayıcıya özel gereksinimler sağlayıcı oluşturulurken kontrol edilir. Loader bu hataları toplamaz ve daha önce gösterilen biçimde execution.baseUrl doğrulaması yapmaz.