Otomasyon QAQA Automation Engineer

Otomatik UI testlerinde beklemelerin ve senkronizasyonun doğru şekilde nasıl gerçekleştirileceği?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

Otomatik UI testinin başında, en büyük zorluk, elemanların görünme gecikmeleri ve ayrıca sayfadaki asenkron eylemleri beklemek zorunda kalınması nedeniyle testlerin istikrarsızlığıydı. Önceleri test uzmanları sıkça katı bekleme süreleri (sleep) kullanıyorlardı ki bu da testlerin uzun sürmesine ve düşük istikrara yol açıyordu.

Sorun, web uygulamalarının giderek daha dinamik hale gelmesidir. Elemanlar asenkron olarak ortaya çıkıyor ve kayboluyor; ön yüz ve arka yüzün eş zamanlı çalışması, testlerin UI durumunu yanlış bekleme nedeniyle hata ile sonuçlanmasına sebep olabilecek durumlar yaratabiliyor. Thread.sleep(1000) gibi statik duraklamalar, sadece test sürelerini artırır ve testin başarılı bir şekilde geçeceğini garanti etmez.

Çözüm, açık ve kapalı beklemeleri (explicit/implicit waits) kullanmaktır ki bu da eylemleri arayüzün mevcut durumu ile daha esnek ve etkili bir şekilde senkronize etmeyi sağlar. Örneğin, Selenium veya benzeri çerçevelerde gerekli elemanların belirli bir koşula göre görünürlüğünü kontrol etmek için WebDriverWait veya benzerleri kullanılır:

from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC wait = WebDriverWait(driver, 10) element = wait.until(EC.presence_of_element_located((By.ID, "myElem")))

Ana özellikler:

  • Testlerin daha az bekleme süresi: testler koşul gerçekleştiği an devam eder.
  • UI dinamiğinden kaynaklanan yanlış tetikleme oranının (flaky-testler) azaltılması.
  • Daha yüksek soyutlama seviyesi (örneğin, metin değerinin değişimi veya elemanların kaybolması gibi karmaşık koşullarda bekleme).

Zor Sorular.

Neden yalnızca kapalı beklemeleri (implicit waits) kullanmak daha iyidir?

Kapalı beklemeler, sürücünün tamamına uygulanır ve beklenmedik gecikmelere veya açık beklemelerle çelişmelere yol açabilir ki bu da genellikle "TimeoutException" hatalarına sebep olur.

UI testlerinde beklemek için Thread.sleep kullanmalı mıyız?

Thread.sleep kullanımı kesinlikle önerilmez: bu, aşırı gecikmelere ve testlerin istikrarsızlığına neden olur. Daha iyi olanı açık beklemeler ve koşulları kullanmaktır.

Eğer eleman bir animasyon ile beliriyorsa ne yapılmalı?

Sadece elemanın görünmesini beklemekle kalmayıp, aynı zamanda onun durumunu (örneğin, görünürlük veya tıklanabilirlik) beklemelisiniz ve visibility_of_element_located gibi özel koşulları kullanmalısınız.

Yaygın Hatalar ve Antipatternler

  • Koşullar yerine sabit zaman aşım süreleri (sleep) kullanmak.
  • Açık ve kapalı beklemelerin çelişmesi.
  • Elemanın varlığını beklemek, oysa görünürlüğü veya etkileşime hazır olmasını beklemek gerekirken.

Hayattan Bir Örnek

Olumsuz Durum

Projede açılır pencerenin görünmesini beklemek, Thread.sleep(3000) ile gerçekleştirildi. Bazen pencere daha hızlı, bazen daha yavaş açılıyordu. Scriptler yavaş çalıştı ve yük artışı sırasında testler bazen başarısız oluyordu.

Artılar:

  • Uygulama kolaylığı.
  • Senkronizasyona dalmadan hızlı bir şekilde gerçekleştirildi.

Eksiler:

  • Testlerin istikrarsızlığı.
  • Tüm ortamlardaki otomatik testlerin süresinin artması.
  • UI düzenlemelerinde bakım zorluğu.

Olumlu Durum

Mantık yeniden yapılandırıldı — tüm UI ile yapılan işlemler, elemanların görünürlük ve aktivite durumları ile açık beklemelere sarılmış fonksiyonlar içine alındı, her şey hızlandı ve istikrar %98’e yükseldi.

Artılar:

  • İstikrarlı ve hızlı testler.
  • Senaryoların kolay ölçeklenmesi ve bakımı.

Eksiler:

  • Uygulama aşamasında senkronizasyondaki tüm ayrıntıları anlamak için zaman alındı.