Takip et

XPathy: Flaky Testleri Bitiren Fluent API

Web otomasyon testleriniz sürekli “flaky” mi oluyor? Dinamik web sayfalarında elementleri bulmak kabusunuz mu? Geleneksel XPath’in bakımı zor, kırılgan yapısına bir alternatif arıyorsanız, XPathy’nin Fluent API’ı ile tanışın. Bu makale, testlerinizi nasıl daha sağlam, okunabilir ve sürdürülebilir hale getireceğinizi adım adım açıklıyor.

Modern web uygulamaları, sürekli değişen ve gelişen yapılarıyla test otomasyon mühendisleri için ciddi zorluklar sunar. Tek sayfa uygulamaları (SPA’lar) ve dinamik olarak yüklenen içerikler, elementlerin DOM’daki konumunu sürekli değiştirebilir veya görünürlüklerini anlık olarak etkileyebilir. Bu durum, otomasyon testlerimizin en büyük düşmanı olan “flaky test” olgusunu ortaya çıkarır. Flaky testler, aynı kod ve aynı ortamda bazen geçerken bazen başarısız olan, güvenilmez testlerdir. Bir testin bir kez başarılı olup, sonraki çalıştırmada rastgele bir nedenden başarısız olması, otomasyon sistemlerine duyulan güveni temelden sarsar.

Geleneksel olarak, web elementlerini hedeflemek için XPath ve CSS Selector’lar kullanılır. XPath, esnekliği sayesinde çoğu senaryoda işimizi görse de, karmaşık ve dinamik web sayfalarında yazımı zorlaşır, okunabilirliği düşer ve en önemlisi son derece kırılgan hale gelir. Küçük bir UI değişikliği, hatta bir div etiketinin araya girmesi bile tüm XPath ifadesini geçersiz kılabilir. Bu durum, test senaryolarının sürekli bakımını gerektirir ve geliştirme süreçlerini yavaşlatır.

Peki, bu kırılganlığı nasıl aşabiliriz? Test otomasyonunun temel amacı, yazılımın kalitesini güvence altına almak ve geliştirme sürecini hızlandırmaktır. Ancak, flaky testler bu hedeflerin tam tersini yapar; geliştiricilerin zamanını hata ayıklama ve sürekli test düzeltmeleriyle boşa harcamalarına neden olur. Güvenilir olmayan test sonuçları, gerçek hataların gözden kaçmasına veya gereksiz yere düzeltmeler yapılmasına yol açabilir. Bu döngü, sonunda otomasyon çabalarına olan inancı azaltır ve manuel testlere geri dönüş eğilimini tetikler. İşte tam da bu noktada, geleneksel XPath yaklaşımlarının yetersiz kaldığı ve daha modern, daha sağlam çözümlere ihtiyaç duyulduğu açıkça ortaya çıkar. Artık sadece elementleri bulmak yeterli değil; onları dinamik ortamlara adapte olabilen, kolayca okunabilen ve bakımı yapılabilir bir şekilde bulmamız gerekiyor. Bu ihtiyaç, XPathy gibi Fluent API’ların yükselişini tetikleyen ana faktörlerden biridir. Bu tür araçlar, testlerin yazılma ve sürdürülme şeklini kökten değiştirerek, geliştiricilere daha sağlam ve güvenilir otomasyon testleri oluşturma gücü verir.

Raw XPath Neden “Öldü”? Geleneksel Yaklaşımın Eksiklikleri Nelerdi?

Geleneksel XPath, web elementlerini DOM (Belge Nesne Modeli) ağacındaki konumlarına göre hedeflemek için güçlü bir araçtır. Ancak bu gücün beraberinde getirdiği bazı ciddi zayıflıklar vardır. Bir elementin tam yolunu belirten mutlak XPath’ler (/html/body/div[1]/section/ul/li[2]/a gibi) son derece kırılgan olmalarıyla bilinirler. Sayfaya küçük bir element eklenmesi veya çıkarılması bile bu yolu geçersiz kılabilir. Göreceli XPath’ler (//div[@id='sidebar']/a[contains(text(),'Hizmetlerimiz')] gibi) biraz daha esnek olsa da, yine de büyük bir bakım yükü oluştururlar.

Düşünün ki, bir e-ticaret sitesindeki bir ürün kartını hedeflemek istiyorsunuz. Geleneksel bir XPath şöyle görünebilir:


    //div[@class='product-list']/div[3]/div[@class='product-card']/a[@data-product-id='12345']/h3
  

Bu ifade, üçüncü ürünü seçen, belirli bir ID'ye sahip ürün kartının içindeki başlığı hedefliyor. Eğer üçüncü sıradaki ürünün yeri değişirse veya araya yeni bir element girerse, bu XPath anında bozulur. Ayrıca, bu ifadeyi okumak ve neyi hedeflediğini anlamak için HTML yapısını iyi bilmek gerekir. Özellikle karmaşık XPath'ler, okunabilirlik açısından bir labirente dönüşebilir.

Geleneksel XPath'in bu karmaşık yapısı, test otomasyonu ekipleri için zamanla ciddi bir maliyet oluşturur. Testler başarısız olduğunda, öncelikle XPath ifadelerinin kontrol edilmesi gerekir ki bu da ciddi bir zaman kaybıdır.

Bir diğer önemli sorun, dinamik web siteleridir. JavaScript ile sürekli güncellenen veya tamamen yeniden çizilen sayfalar, elementlerin ID'lerini, class'larını veya diğer niteliklerini değiştirebilir. Örneğin, bir form gönderimi sonrası dinamik olarak oluşturulan bir başarı mesajını hedeflemek, bazen imkansız hale gelebilir çünkü mesajın tam XPath'i her zaman farklı olabilir veya sadece belirli bir zaman diliminde var olabilir. Geleneksel XPath, bu tür dinamik değişimlere karşı çok dirençli değildir. starts-with() veya contains() gibi fonksiyonlarla bir nebze esneklik sağlansa da, genel çözüm sunmaktan uzaktır.

Ayrıca, geleneksel XPath'in en büyük handikaplarından biri de "insan odaklı" olmamasıdır. Bir geliştirici veya test mühendisi, bir UI elementini düşünürken "Sayfadaki 'Kaydet' düğmesini bul" veya "Ürün listesindeki 'Sepete Ekle' yazan butonu bul" gibi ifadelerle düşünür. Ancak, geleneksel XPath yazarken bu doğal düşünce tarzından uzaklaşarak, elementin DOM içindeki hiyerarşik ve teknik konumuna odaklanmak zorunda kalırız. Bu da düşünce yapısıyla kodlama arasındaki mesafeyi açar ve hataya açık bir ortam yaratır. Bu nedenlerle, test otomasyonunun giderek daha önemli hale geldiği modern geliştirme döngülerinde, "Raw XPath" yaklaşımı artık yetersiz kalmakta ve "ölü" olarak nitelendirilmektedir. Daha sezgisel, daha sağlam ve daha bakımı kolay bir yaklaşıma ihtiyaç duyulmaktadır.

XPathy Nedir ve Fluent API Ne Anlama Gelir?

XPathy, web otomasyon testlerinizdeki element bulma sürecini devrim niteliğinde değiştirmeyi hedefleyen, XPath ifadeleri oluşturmak için tasarlanmış bir Fluent API yaklaşımıdır. "Fluent API", bir API tasarım desenidir ve zincirleme metot çağrıları kullanarak kodun daha okunabilir ve doğal bir dil gibi akmasını sağlar. Amaç, karmaşık işlemleri bile adım adım, anlaşılır bir sırayla ifade etmektir. XPathy'nin temel felsefesi, karmaşık ve kırılgan XPath ifadelerini, insan diline yakın, anlaşılır ve sürdürülebilir bir yapıya dönüştürmektir.

Geleneksel XPath yazarken karşılaşılan zorluklar göz önüne alındığında, XPathy'nin Fluent API'ı, element hedefleme sürecini basit, anlaşılır adımlara böler. Örneğin, bir "Kaydet" butonunu bulmak için artık //button[text()='Kaydet'] gibi bir ifade yazmak yerine, XPathy ile XPathy().button().with_text("Kaydet") şeklinde ifade edersiniz. Bu, sadece bir söz dizimi değişikliği değil, aynı zamanda elementin ne olduğunu ve neden seçildiğini anlatan bir ifade biçimidir. Kodun okuyucusu, elementin hangi özelliklere sahip olduğunu ve ne anlama geldiğini kolayca kavrayabilir, bu da bakım maliyetlerini önemli ölçüde düşürür.

Uzman İpucu: Fluent API, kodunuzu doğal dil gibi okumanızı sağlayarak karmaşıklığı azaltır ve hataları daha kolay tespit etmenize olanak tanır.

XPathy'nin Fluent API'ı, bir dizi metodu birbirine zincirleyerek karmaşık XPath'leri oluşturur. Bu metotlar, HTML elementinin etiket adı (div(), button(), input() gibi), içerdiği metin (with_text(), contains_text() gibi), sahip olduğu nitelikler (with_id(), with_class(), has_attribute() gibi) veya DOM içindeki ilişkileri (parent(), has_child() gibi) baz alabilir. Bu yaklaşım, XPath ifadelerini daha modüler hale getirir. Her bir metot, belirli bir koşulu veya özelliği temsil eder ve bir araya geldiklerinde güçlü ve spesifik bir element seçici oluştururlar.

Sürdürülebilirlik açısından da XPathy önemli avantajlar sunar. Bir UI değişikliği olduğunda, geleneksel XPath'i baştan sona yeniden yazmak yerine, XPathy ifadesindeki ilgili metot çağrısını güncellemek genellikle yeterlidir. Örneğin, bir elementin metni değişirse sadece with_text() metodundaki değeri güncellemek yeterli olurken, DOM yapısındaki bir değişiklik sadece div() yerine span() gibi etiket adını değiştirmeyi gerektirebilir. Bu modüler yapı, testlerin bakımını hızlandırır ve hatalı XPath'lerin neden olduğu "flaky test" sayısını azaltır. Sonuç olarak, XPathy, test otomasyonunu sadece daha kolay değil, aynı zamanda daha güvenilir ve verimli hale getiren bir yaklaşımdır.

XPathy'nin Temel Prensipleri ve Felsefesi Nelerdir?

XPathy'nin arkasında yatan temel prensipler, modern test otomasyonunun ihtiyaçlarına cevap vermek ve geleneksel XPath'in zayıflıklarını gidermek üzerine kuruludur. Bu prensipler, geliştiricilere daha iyi, daha sağlam ve daha keyifli bir test yazma deneyimi sunmayı hedefler:

  • Okunabilirlik (Readability): En önemli prensiplerden biridir. XPathy, kodun doğal bir dil gibi okunmasını sağlar. XPathy().div().with_text("Kullanıcı Adı") ifadesi, "İçerisinde 'Kullanıcı Adı' metni olan bir div bul" anlamına gelir ve bir test mühendisi veya geliştiricinin anadilinde düşündüğü şekle çok yakındır. Bu sayede, kodun ne yaptığını anlamak için DOM yapısını detaylıca incelemeye gerek kalmaz.
  • Sürdürülebilirlik (Maintainability): Web uygulamaları sürekli değişir. XPathy, bu değişikliklere karşı daha dirençli ifadeler oluşturmaya odaklanır. Bir UI değişikliği olduğunda, tüm XPath'i yeniden yazmak yerine, ilgili metot çağrısını güncellemek yeterli olur. Bu, testlerin bakım süresini ve maliyetini önemli ölçüde azaltır.
  • Sağlamlık (Robustness): Dinamik element ID'leri, değişen class'lar veya DOM'daki hiyerarşik değişiklikler flaky testlere neden olabilir. XPathy, starts_with(), contains_text(), has_attribute() gibi metotlarla bu dinamik değişimlere karşı daha dayanıklı element seçicileri oluşturmayı teşvik eder. Bu sayede testler, küçük UI değişikliklerinden daha az etkilenir.
  • Dinamik İçeriğe Adaptasyon (Adaptability to Dynamic Content): AJAX çağrıları veya JavaScript manipülasyonları ile yüklenen içerik, elementlerin anlık olarak var olup olmadığını etkileyebilir. XPathy, bu tür dinamik içerikleri hedeflemek için daha esnek yöntemler sunar ve testlerin daha güvenilir olmasını sağlar. Örneğin, bir elementin sadece belirli bir metin içerdiğini bilmek yeterliyken, tam metnini bilme zorunluluğunu ortadan kaldırır.
  • Modülerlik (Modularity): Her bir XPathy metodu, XPath ifadesinin belirli bir parçasını temsil eder. Bu modüler yapı, karmaşık seçicilerin daha küçük, yönetilebilir parçalar halinde inşa edilmesini sağlar. Aynı zamanda, belirli element seçici desenlerinin yeniden kullanılabilirliğini artırır.

Bu prensipler, XPathy'nin sadece bir araç olmaktan öte, test otomasyonuna daha stratejik ve verimli bir yaklaşım sunan bir felsefe olduğunu gösterir. Geliştiricilerin "flaky test" sendromundan kurtulmalarına ve gerçekten güvenilir test otomasyonu oluşturmalarına yardımcı olur.

XPathy ile Element Bulma Nasıl Yapılır? Adım Adım Uygulama

XPathy'nin Fluent API'ını kullanarak element bulma süreci oldukça sezgisel ve basittir. Geleneksel XPath'in karmaşıklığından uzaklaşarak, kodunuzu daha okunabilir ve yönetilebilir hale getirebilirsiniz. Şimdi, adım adım XPathy ile nasıl element bulacağımıza dair örnekler üzerinde duracağız. Bu örneklerde, Python için hipotetik bir xpathy kütüphanesi kullanıldığını varsayacağız, ancak buradaki prensipler çoğu dilde benzer Fluent API yaklaşımlarına uyarlanabilir.

İlk olarak, en basit senaryo ile başlayalım: bir etiket adına ve içerdiği metne göre element bulma. Diyelim ki, sayfanızda "Giriş Yap" metnine sahip bir düğme (

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.