✅ Doğru Assertion Yazımı (expect)
Doğru Assertion Yazımı (expect): Playwright'ın expect() fonksiyonu, kalibreli bir kalite kontrol ölçüm cihazı gibi çalışır: ölçüm alır, tolerans aralığını kontrol eder, koşul kar
Playwright'ın expect() fonksiyonu, kalibreli bir kalite kontrol ölçüm cihazı gibi çalışır: ölçüm alır, tolerans aralığını kontrol eder, koşul karşılanana kadar belirlenen aralıklarla yeniden ölçer ve timeout sonunda hâlâ karşılanmamışsa hem beklenen değeri hem elde edilen değeri açık biçimde raporlar. Peki Selenium'daki testNG assertEquals() veya JUnit assertThat()'tan farkı ne? Java'da assertion anında (tek seferlik) değerlendirilir: o milisaniyede koşul sağlanmamışsa test hemen kırmızı yanar ve hata "AssertionError: expected X but was Y" kadar basit — hangi element, sayfa hangi state'deydi, öncesinde ne oldu bunların hiçbiri mesajda yoktur. Playwright'ta expect(page.locator(".toast")).toBeVisible() çağrısı polling ile çalışır: 5000ms boyunca 100ms aralıklarla kontrol eder; başarısız olursa ekran görüntüsü, hata anındaki DOM state'i ve bekleme sürecinin tüm geçmişi ile birlikte raporlanır. QA gerçeği: asenkron UI'larda (SPA, AJAX, WebSocket) tek-seferlik assertion yazmak sessiz yanlış PASS üretir — modal açılmadan önce "görünmüyor" assertion'ı geçer, modal açıldıktan sonra "silinmiş" assertion'ı geçer, ama hiçbiri kullanıcının gördüğü state'i doğrulamaz. expect()'in poll mekanizması bu durumu sistematik olarak engeller.
expect(), Playwright'ın assertion (doğrulama) fonksiyonudur. Ama JUnit'teki assertEquals() veya Selenium projelerinde kullandığın klasik assert'lerden farklı çalışır: bir locator üzerinde çağrılan "web-first" assertion'lar (toBeVisible(), toHaveText() gibi) varsayılan olarak 5 saniye boyunca otomatik tekrar dener (auto-retry). Koşul anında doğru değilse hemen patlamaz, sayfa state'i değişene kadar bekler.
JUnit'te Assert.assertEquals("Beklenen", element.getText()) yazdığında, o satır çalıştığı an element'in text'i o değilse test ANINDA patlar — element'in metni 200ms sonra doğru olacak olsa bile. Playwright'ta await expect(locator).toHaveText("Beklenen") yazarsan, Playwright o metni 5 saniye boyunca tekrar tekrar okur; metin 200ms sonra doğru olursa test geçer. AssertJ'nin await().atMost(5, SECONDS).until(...) (Awaitility) yazdığın senaryoyu built-in olarak düşün.
Web-First Assertion vs Generic Assertion
En sık kullanılan web-first assertion'lar: toBeVisible() / toBeHidden(), toHaveText() / toContainText(), toHaveValue(), toBeChecked(), toBeEnabled() / toBeDisabled(), toHaveAttribute(), toHaveClass(), toHaveCSS(), toHaveCount(), toHaveURL(), toHaveTitle(). Her birinin başına .not. koyarak tersini doğrulayabilirsin: expect(locator).not.toBeVisible().
expect() Nasıl Tekrar Dener (Auto-Retry)
Klasik Assert (JUnit)
assertEquals çalıştığı anki DOM'a bakar. Spinner hâlâ dönüyorsa ya da metin henüz güncellenmediyse test anında FAIL olur.
300ms sonra doğru olacak bir şeyi anında kontrol etmek "flaky test"in en yaygın nedenidir.
Playwright — Kontrol Ediyor
await expect(locator).toHaveText(...) çağrıldığı an Playwright ilk kontrolü yapar. Henüz doğru değilse hata fırlatmaz, polling döngüsüne girer.
Tekrar Deniyor (Polling)
Playwright her ~100ms'de bir koşulu yeniden kontrol eder. Bu, sayfa state'i değişene (spinner kaybolup mesaj görününceye) kadar sessizce devam eder — sen hiçbir ekstra kod yazmazsın.
Koşul 5 saniyeden önce doğru olduğu an assertion anında geçer ve bir sonraki satıra devam edilir. Toplam bekleme süresi sadece gerçekten gereken süre kadar — sabit Thread.sleep(5000) gibi gereksiz bekleme yok.