🧪 Gerçek Senaryo — Ürün Arama & Sepete Ekleme
Gerçek Senaryo — Ürün Arama & Sepete: Bir E2E mobil akışı yazmak, bir kuryeye adres tarif etmek gibidir: "Caddeden sağa dön" dersen kurye yolu bulur, ama "45.
Bir E2E mobil akışı yazmak, bir kuryeye adres tarif etmek gibidir: "Caddeden sağa dön" dersen kurye yolu bulur, ama "45. metreden sağa dön" dersen kaldırım bir gün değiştiğinde kurye kaybolur. Uygulama başlat → Ürün ara → Detaya git → Sepete ekle → Sepeti doğrula akışında her adımda locator seçerken tam olarak bu kararı verirsin: anlamlı bir işaret mi (accessibility id), yoksa kırılgan bir koordinat mı (XPath index)? Peki madem test yeşil yanıyor, hangi locator ile yazdığın neden bu kadar önemli? Java (JUnit 5 + Appium) tarafında bir `WebElement`'i Selenium'daki gibi düşünebilirsin — ama Selenium'un aksine burada ekran DÖNEBİLİR, klavye elementin ÜSTÜNÜ KAPATABİLİR ve aynı ekran farklı cihazda farklı yerleşir; TypeScript (WebdriverIO) tarafında da aynı fark geçerlidir. QA açısından karşılığı nettir: index tabanlı locator'larla yazılmış bir sepet testi, uygulamaya tek bir yeni banner eklendiğinde gece build'inde patlar ve ekip sabah gerçek bir bug'ı değil, kendi testinin bakımını konuşur.
Test Senaryosu & Proje Yapısı
BasePage ortak wait, scroll, screenshot metodlarını içerir. Test sınıfları sadece iş mantığına odaklanır.
Java — BaseTest (Driver Setup)
BaseTest.java — JUnit 5 ile Appium Driver Yönetimi
Micro Lab: Kod yazma
TODO satirini beklenen cozumdeki kritik satirla degistir. Bu gercek runtime degil; amac dogru yapinin yazilmasini kontrollu olarak pekistirmek.
@BeforeAll/@AfterAll Neden Test Sınıfı Başına Sadece Bir Kez Çalışır?
protected static AndroidDriver driver…
`protected static AndroidDriver driver` — `static` alan, tıpkı REST Assured'daki `spec` gibi, driver'ı TÜM test metotları arasında PAYLAŞILIR hale getirir; her test YENİDEN driver AÇMAZ.
@BeforeAll static void setUp()…
`@BeforeAll static void setUp()` UYGULAMAYI ve emülatör bağlantısını SADECE BİR KEZ, sınıftaki İLK test çalışmadan ÖNCE kurar — bunu her `@Test`'te tekrarlamak, HER testi çok daha YAVAŞLATIRDI.
`driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10))` TÜM `findElement` çağrıları için VARSAYILAN bir bekleme kurar — bu OLMASAYDI, henüz yüklenmemiş bir elemanı arayan HER çağrı anında BAŞARISIZ olurdu.
@AfterAll static void tearDown()…