동적 대기 작업은 UI 자동화 분야에서 시급한 과제입니다. 특히 콘텐츠가 자주 나타나고 즉시 변경되지 않는 현대 웹 애플리케이션의 경우 더욱 그렇습니다.
문제의 역사
조기 자동화 버전에서는 테스트를 너무 느리거나 애플리케이션이 평소보다 느리게 로드될 경우 쉽게 실패하는 경향이 있는 강제 대기(sleep)가 사용되었습니다. 이는 SPA 및 무거운 JS의 시대에 더욱 중요해졌습니다.
문제 정적 지연을 사용하면 불안정한 테스트와 시간 낭비가 발생합니다: 자동 테스트는 느려지거나 우연히 실패할 수 있습니다. 또한 테스트의 확장성 및 유지 관리에 영향을 미칩니다.
해결책
동적(명시적) 대기를 사용하십시오: 예를 들어, Selenium의 WebDriverWait, Cypress 및 Playwright 프레임워크의 waitFor 함수.
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) # 최대 대기 시간 10초 wait.until(EC.visibility_of_element_located((By.ID, 'my-element')))
주요 특징:
동적 대기가 있는데 sleep이 왜 필요합니까?
time.sleep() 사용은 디버깅이나 극단적인 경우에만 정당화됩니다. 실제 자동 테스트에서는 항상 명시적 대기를 하는 것이 좋습니다.
대기 사용이 플래이크를 완전히 제거할 수 있습니까?
아니오, 대기 조건이 부적절하게 설명된 경우(예: 속성을 대기하고 있으며 데이터가 완전히 로드되는 것이 아님) 플래이크는 남아 있습니다.
모든 테스트에 대해 하나의 글로벌 대기를 만들 수 있습니까?
아니오 — 요소가 나타나는 조건은 다릅니다. 대기는 필요할 때만 적용해야 합니다.
sleep 사용모든 자동 테스트는 "클릭"과 검사 사이에 sleep(2)를 사용하여 작성되었습니다. 페이지가 업데이트된 후 사용자는 지연을 보고했으며, 느린 인터넷 때문에 테스트가 때때로 실패했습니다.
장점:
단점:
필요한 요소가 나타난 후 클릭이 가능하도록 블록 로드에 대한 명시적 대기를 배치했습니다. sleep을 제거했더니 모든 테스트가 안정적이고 빠르게 통과합니다.
장점:
단점: