🗂️ Test Organizasyonu & Fixtures
Test Organizasyonu & Fixtures: Playwright fixture'ları, Java'daki @BeforeEach metodunun bağımlılık enjeksiyonu (dependency injection) ile güçlendirilmiş halidir: @BeforeEach bir
Playwright fixture'ları, Java'daki @BeforeEach metodunun bağımlılık enjeksiyonu (dependency injection) ile güçlendirilmiş halidir: @BeforeEach bir sınıf içindeki her test için aynı hazırlığı yapar ama o hazırlık sonucunu başka bir sınıfa doğrudan geçiremez. Fixture ise bir fabrika pipeline'ındaki modüler istasyon gibi çalışır — "loggedInPage" dediğinde Playwright önce browser'ı açar, giriş işlemini yapar, cookie'leri set eder ve sana hazır bir sayfa nesnesi teslim eder; test sona erince teardown otomatik çalışır. Peki neden fixture tercih edilsin, beforeEach yetmez mi? Birden fazla test dosyasında aynı "admin kullanıcısı olarak giriş" state'ini paylaşman gerektiğinde, beforeEach her dosyaya tekrar kopyalanır ve bir gün login adımları değişirse her dosyayı ayrı ayrı güncellermen gerekir; fixture tek bir yerde tanımlanır, tüm testler import eder. QA gerçeği: 200 testli bir suite'de her test kendi login adımını çalıştırırsa süite süresi gereksiz yere uzar; storageState ile birleştirilmiş fixture'lar login işlemini bir kez yapar ve session'ı tüm paralel worker'larla paylaşır — bu, CI pipeline süresinde ciddi bir optimizasyon demektir.
Test organizasyonu iki ana parçadan oluşur: (1) testleri test.describe() ile mantıklı gruplara ayırmak ve beforeEach/afterEach gibi hook'larla ortak hazırlık/temizlik kodu yazmak, (2) fixture'lar ile bu hazırlık kodunu "dependency injection" şeklinde testlere otomatik enjekte etmek. İkisi birlikte, yüzlerce testte tekrar eden kodu sıfıra indirir.
test.describe() bir JUnit @Nested test class'ı gibidir. test.beforeEach() / afterEach() → JUnit @BeforeEach / @AfterEach. test.beforeAll() / afterAll() → @BeforeAll / @AfterAll (ama bunlar { browser } alır, { page } almaz — page testler arası paylaşılmaz). Fixture'lar ise Spring'in @Autowired dependency injection'ına benzer: ihtiyacın olan şeyi parametre olarak istersin, çerçeve onu sana hazır verir — new LoginPage(driver) diye manuel oluşturmazsın.
Testin Anatomisi — Arrange / Act / Assert
Micro Lab: Playwright — Fixture ve Setup
TODO satirini beklenen cozumdeki kritik satirla degistir. Bu gercek runtime degil; amac dogru yapinin yazilmasini kontrollu olarak pekistirmek.
Bu Test Aslında 3 Fazda mı Çalışır: Arrange → Act → Assert?
Arrange fazı: page.goto('/login')…
Arrange fazı: page.goto('/login') sadece URL değiştirmekle kalmaz, sayfa "load" event'ini fırlatana kadar bekler — bu yüzden bir sonraki satırda formu ARAMAK güvenlidir.
Act fazı: fill() ve click() sırayla…
Act fazı: fill() ve click() sırayla ve her biri kendi actionability kontrolünü bekleyerek çalışır — email yazılmadan şifre alanına geçilmez, buton disabled'sa click BEKLER.
Assert fazı: expect(page).toHaveURL('/dashboard')…
Assert fazı: expect(page).toHaveURL('/dashboard') TEK SEFERLİK bir kontrol değildir — varsayılan 5 saniye boyunca URL'nin değişmesini POLL eder (auto-retrying assertion), Selenium'daki manuel WebDriverWait'in yerini alır.
5 saniye içinde URL değişmezse…