Otomasyon QAOtomasyon QA Mühendisi

Modern tek sayfa uygulamalarında asenkron DOM güncellemeleri nedeniyle oluşan belirsizlikleri ortadan kaldırarak CI/CD boru hatları için alt saniye yürütme hızını koruyan bir test otomasyon çerçevesi nasıl mimarlarsınız?

Hintsage yapay zeka asistanı ile mülakatları geçin
  • Sorunun cevabı.

Web uygulamalarının statik HTML sayfalarından, React, Angular ve Vue ile inşa edilmiş dinamik tek sayfa uygulamalarına evrilmesi, test otomasyonu ve tarayıcı arasındaki senkronizasyon modelini temelden değiştirmiştir. Erken otomasyon çerçeveleri, bir sayfanın yüklendikten sonra tüm öğelerin etkileşime hazır olduğu varsayımıyla, doğal senkronizasyon noktaları olarak sayfa yükleme olaylarına dayanıyordu. Modern SPA'lar, geleneksel sayfa yükleme olaylarını tetiklemeksizin öğelerin görünmesini, güncellenmesini veya yer değiştirmesini sağlayan sanal DOM karşılaştırması ve asenkron veri alma işlemleri kullanmaktadır ve bu durum, belirli uygulama hazır olma durumlarını kontrol etmek için akıllı bekleme mekanizmalarının geliştirilmesini zorunlu kılmıştır.

Temel zorluk, test yürütme hızı ile DOM kararlılığı arasında bir yarış durumu olarak ortaya çıkmaktadır; otomatik betikler, geçici durumlarda etkileşime girmeye çalışır. Bu belirsizlik, ilk render işleminden sonra öğe özniteliklerini değiştiren AJAX çağrıları, öğe eklenmesinden sonra asenkron olarak takılan JavaScript olay dinleyicileri ve öğelerin etkileşimli hale gelmeden önce görsel olarak görünmesini sağlayan CSS geçişleri gibi çoklu kaynaklardan kaynaklanmaktadır. Geleneksel sabit bekleme süreleri, CI/CD bağlamlarında, etkileşim başına biriken bekleme süreleri beş ila on saniye olabileceğinden, test paketlerinin dakikalarca uzamasına neden olurken, yetersiz beklemeler otomasyon setine güveni erozyona uğratan yanlış negatif sonuçlar üretiyor ve sürüm sürelerini geciktiriyordu.

Dayanıklı bir çerçeve, yalnızca varlık yerine anlamsal hazır olma durumlarını doğrulayan özel beklemeler ile birleştirilmiş çok katmanlı bir senkronizasyon stratejisi uygulanır. Temel, bloklama işlemi yapmadan sürekli koşulları değerlendirmek için 100-300 milisaniye yapılandırılabilir anket aralıkları ile WebDriverWait'i kullanmaktadır ve öğe etkileşimlerini, değişiklikleri ele almak için tekrar deneme mantığında sarar. Yükleme simgelerinin yokluğuna, veri ile ilişkili özniteliklerin varlığına veya JavaScript ile döndürülen hazır olma bayraklarına kontrol eden özel Beklenen Koşullar uygulamak, etkileşimlerin yalnızca iş mantığı tamamlandığında gerçekleşmesini sağlar. Performans optimizasyonu için çerçeve, ThreadLocal WebDriver yönetimi ve headless tarayıcı yapılandırmaları aracılığıyla paralel yürütmeden yararlanmalı ve senkronizasyon katmanını korumalı, böylece akıllı beklemenin yürütme hızını tehlikeye atmadığından emin olmalıdır.

import org.openqa.selenium.*; import org.openqa.selenium.support.ui.*; import java.time.Duration; import java.util.function.Function; public class SynchronizationLayer { private WebDriver driver; private WebDriverWait wait; public SynchronizationLayer(WebDriver driver) { this.driver = driver; this.wait = new WebDriverWait(driver, Duration.ofSeconds(10), Duration.ofMillis(200)); } public WebElement waitForElementReady(By locator) { return wait.until(new Function<WebDriver, WebElement>() { public WebElement apply(WebDriver driver) { try { WebElement element = driver.findElement(locator); if (element.isDisplayed() && element.isEnabled()) { boolean noOverlay = driver.findElements(By.className("loading-overlay")).isEmpty(); if (noOverlay) return element; } return null; } catch (StaleElementReferenceException e) { return null; } } }); } public void resilientClick(By locator) { WebElement element = waitForElementReady(locator); try { element.click(); } catch (StaleElementReferenceException e) { waitForElementReady(locator).click(); } } }
  • Hayattan bir durum

Bir finans teknolojisi girişimi, piyasadaki veri güncellemelerini arayüze her birkaç milisaniyede iten WebSocket bağlantıları ile React kullanarak gerçek zamanlı bir ticaret panosu geliştirdi. Kalite güvence ekibi, yerel geliştirme sırasında güvenilir çalışan ancak sürekli entegrasyon ortamında, daha yavaş kapsüllenmiş altyapı nedeniyle sürekli başarısız olan sabit Thread.sleep aralıkları ile temel Selenium WebDriver çağrılarını kullanarak bir test paketi oluşturmuştu. Belirsizlik, zaman aşımı istisnaları veya eski öğe referansları nedeniyle inşa edilenlerin yüzde sekseninin başarısız olduğu kritik seviyelere ulaştı ve bu durum geliştiricilerin otomasyon sonuçlarını göz ardı etmeye ve kalite kontrol aşamalarından bağımsız olarak özellikleri yayımlamaya başladığı bir kriz yarattı.

Mühendislik ekibi, bu senkronizasyon krizini çözmek için çeşitli mimari yaklaşımları değerlendirdi. Bir öneri, tüm uyku sürelerini test paketinde on saniyeye çıkarmayı önerdi, bu kesinlikle belirsizliği azaltacaktı ancak yürütme süresini on iki dakikadan iki saatten fazla bir süreye uzatacaktı; bu da on beş dakikalık geri bildirim döngüsü gereksinimini ihlal ediyordu. Diğer bir yaklaşım, sayfaların ne zaman stabilize olduğunu belirlemek için ekran görüntüsü karşılaştırmasına dayanan görsel test araçlarını kullanmayı düşündü, ancak bu, görüntü işleme nedeniyle önemli bir yük oluşturdu ve ekran görüntüsü arasında değişen hızlı güncellenen finansal verilerle çalışırken güvenilmez olduğunu ortaya koydu. Ekip ayrıca, oturum testleri ile çalışan iş parçacıları birden fazla test sınıfı veya paketi arasında devam ettikçe gerçek öğe yokluğu hatalarını sonsuza dek takılma sorunlarına yol açarak uzun süreli test paketlerinde ThreadLocal<WebDriver> uygulamak için kullanılan bir yaklaşımı değerlendirdi. Seçilen çözüm, çerçevenin, StaleElementReferenceException'ı otomatik tekrar deneme mantığı ile ele alan uygulama özel hazır olma göstergeleri ile birlikte açık beklemeleri kullanacak şekilde yeniden yapılandırılmasını içeriyordu. Ekip, yükleme simgelerinin yokluğu ve React'in çizimi tamamladığını belirtmek için geliştirici ekibi tarafından eklenen veri-kararlı özniteliklerin varlığını kontrol eden özel Beklenen Koşulları uyguladı. Tüm öğe etkileşimlerini, eski öğe istisnalarını yakalayan ve orijinal By locatörü kullanarak otomatik olarak öğeleri yeniden konumlandıran bir senkronizasyon katmanında sararak, testlerin WebSocket güncellemelerinin neden olduğu DOM yenilemelerine karşı dayanıklı hale gelmesini sağladı. Bu mimari ayrıca, asenkron işlemlerin tamamlandığını belirtmek için JavaScript olay kuyrukları ile uygulama ile entegre oldu, JavaScriptExecutor kullanarak veri yükleme tamamlanma bayraklarını takip etmek için anket alınmasını sağladı.

Sonuç, sürekli entegrasyon boru hattını güvenilir on iki dakikalık bir kumar yerine, stabil sekiz dakikalık bir kalite kapısına dönüştürdü. Test belirsizliği, uygulama sonrası iki hafta içinde yüzde seksenden yüzde ikiye düştü ve başarısızlık tespit süre ortalaması yüzde altmış oranında iyileşti. Geliştirme ekibi, otomasyon setine yeniden güven kazandı ve haftalık yayımlardan, günde birden fazla üretim dağıtımı ile sürekli dağıtım modeline geçebildi. Çerçevenin mimarisi, akıllı senkronizasyon stratejilerinin modern reaktif web uygulamalarının karmaşıklığını yürütme performansını tehlikeye atmadan ele alabileceğini göstererek organizasyon genelinde referans bir uygulama haline geldi.

  • Adayların genellikle kaçırdığı şeyler

ThreadLocal kullanan WebDriver örneklerinin paralel test yürütmelerinde neden uzun süreli test paketlerinde bazen bellek sızıntılarına yol açtığını ve bunun uygun yaşam döngüsü yönetimi ile WebDriver havuzu kullanmaktan nasıl farklılık gösterdiğini açıklayın.

Birçok otomasyon mühendisi, ThreadLocal<WebDriver> kurarak paralel test yürütmelerinde mükemmel iş parçacığı ayrımı sağladığını düşünürken, genellikle ThreadLocal değişkenlerinin, açık bir şekilde kaldırılmadıkça veya iş parçacığı sona erene kadar WebDriver nesnelerine güçlü referanslar koruduğunu göz ardı etmektedir. İş parçacığı havuzlarını kullanan uzun süreli test paketlerinde, iş parçacığı işçilerinin birden fazla test sınıfı veya paketi arasında sürdüğü durumlarda, test tamamlandıktan sonra bile ThreadLocal depolamasında WebDriver örnekleri birikir; bu da bellek tükenmesine ve nihayetinde kesintisiz entegrasyon ortamını çökerten bayi süreçlerine yol açar. Kritik ayrım, bir nesne havuzu kullanan bir WebDriver havuzunun, bölümleme yöntemleri aracılığıyla örnek oluşturma, ödünç alma ve yok etme işlemlerini açıkça kontrol etmesindedir. bu süreçler, sürücülerin test tamamlandıktan hemen sonra terkedilmesini ve yok edilmesini sağlamak için fabrikasyon yöntemleri kullanarak yapılır. Doğru uygulama, ThreadLocal.remove()’ı açıkça çağırmak için TestNG'nin AfterMethod veya JUnit'in AfterEach metodunu geçersiz kılmayı veya WebDriver yaşam döngüsünü açıkça yönetmek için PicoContainer veya Guice gibi bir bağımlılık enjeksiyon çerçevesi benimsemeyi gerektirir; bu çerçeveler, atık toplama tetikleri olmadan kalan iş parçacığına bağlı örtük depolama yerine açık bir biçimde yönetir.

Selenium WebDriver'daki örtülü bekleme mekanizması, açık bekleme sorgulama aralığı ile nasıl etkileşime girer ve asenkron web uygulamalarında her ikisi de çelişkili zaman aşımı değerleri ile yapılandırıldığında hangi spesifik yarış durumu ortaya çıkar?

Adaylar genellikle örtülü ve açık beklemelerin, WebDriver spesifikasyonu içinde temelde farklı mekanizmalar vasıtasıyla çalıştığını yanlış anlarlar ve her ikisi de test ortamlarında aynı anda aktifken tahmin edilemez senkronizasyon davranışına yol açar. Kapaklı beklemeler, sürücü örneği üzerinden tüm findElement çağrılarına global olarak uygulanır; sürücü, öğe görünene veya zaman aşımı sona erene kadar DOM'u tekrarlı bir şekilde sorgular; açık beklemeler ise, belirli koşullara yapılandırılabilir aralıklarla sorgulamak için FluentWait kullanır ve örtülü bekleme mekanizmasından bağımsızdır. Tehlikeli yarış durumu, örtülü bekleme otuz saniyeye, açık bekleme ise on saniyeye ve sorgulama aralığı beş yüz milisaniye olarak ayarlandığında ortaya çıkar; burada açık bekleme, içeride findElement çağıran bir koşulu kontrol eder; bu durumda ilk başarısızlıkta otuz saniye takılmaktadır, bu da açık bekleme zaman aşımını anlamsız hale getirir ve testlerin, amaçlanan açık zaman aşımından çok daha uzun sürede takılmasına neden olur. Çözüm, açık beklemeleri kullanmadan önce örtülü beklemeyi sıfıra ayarlamak veya en iyisi, modern otomasyon çerçevelerinde tamamen örtülü beklemeleri kaçınmak; bunun yerine, öğe konumlandırma ve hazır olma durumu doğrulaması için açık senkronizasyon kullanmaktır ve bu durum, örtülü bekleme mekanizmasını tetiklemekten kaçınmaya odaklanır.

Ekran senaryosu ile Sayfa Nesne Modeli arasındaki mimari avantaj, çoklu kullanıcı rolleri ve çaprazsayfa etkileşimleri içeren karmaşık iş akışlarını otomatikleştirmede ne sağlar ve neden Ekran senaryosunun uygulanması genellikle mikro hizmet mimarilerinde test bakım maliyetlerini yüzde kırk oranında azaltır?

Çoğu aday, Sayfa Nesne Modeli'nin sayfa ile ilgili öğeleri ve yöntemleri kapsadığını tekrarlayabilirken, genellikle bu yapının, test mantığını fiziksel sayfa yapısına sıkı bir şekilde bağladığını, bu durumun, iş akışları çoklu sayfalarda yayıldığında veya farklı sayfalarda aynı eylemler görünse bile farklı uygulamalarla ortaya çıkmasında bakım kabusları yarattığını anlamazlar. Ekran senaryosu, aynı zamanda Yolculuk modeli olarak da bilinir; testlerin yapıdan ziyade kullanıcı yetenekleri ve görevleri etrafında modellenmesini sağlar, burada Aktörler, Etkileşimlerden oluşan Görevleri gerçekleştirmek için Yetkinliklere sahiptir ve bu durum, iş süreçlerini yansıtacak şekilde bir alan özel dili oluşturur ve UI uygulama detaylarından bağımsızdır. Mikro hizmet mimarilerinde, ön yüz bileşenleri birbirinden ayrılmış olup, farklı kullanıcı yolculuklarında ve aygıtlarda sıkça yeniden kullanıldığından, Ekran senaryosunun bileşim modeli, aynı Soru veya Görevin, herhangi bir değişiklik olmaksızın farklı iş akışlarında yeniden kullanılmasına olanak tanırken, Sayfa Nesne Modeli, farklı ödeme akışlarında bir ödeme bileşeni gibi paylaşılan bir bileşen ortaya çıktığında birden fazla sayfa sınıfını güncelleyerek gerektirecektir. Yüzde kırklık bakım maliyeti düşüşü, giriş formunun özel bir sayfadan bir modal pencereye geçmesi veya navigasyonun bir başlıktan bir hamburger menüsüne geçişi gibi durumlarda Ekran senaryosunun yalnızca belirli Görev uygulamasını güncelleyerek yeterli olması ve o Görevi kullanan tüm testlerin değişmeden kalmasıyla ilgilidir. Halihazırda Sayfa Nesne Modeli, eski LoginPage sınıfını referans gösteren her bir testin güncellenmesini zorlar; bu durum, yapı merkezi modellin, dağıtılmış mikro hizmet ortamlarındaki yapı değişikliklerine karşı daha üstün dayanıklılık sağladığını göstermektedir.