Playwright로 불안정한 테스트 방지
Source: Dev.to

플레이키 테스트는 기술 부채입니다.
e2e 테스트에서 루프와 수동 지연을 사용할 때 주의하세요.
루프 .all()
locator.all()을 활용하면 로케이터의 선택자와 일치하는 모든 요소에 대한 Locator 객체 배열을 얻을 수 있습니다. 카운트 확인 및 기타 연관 값을 체크할 때 유용합니다.
단순 for 루프는 피하세요 ❌:
const items = await page.locator('.myselector').all();
for (item in items) { // or for (let i = 0; ... )
// …
}
이러한 루프는 플레키함을 유발하고 비동기 로케이터를 올바르게 처리하지 못할 수 있습니다.
권장 방법 ✅:
allInnerTexts(),allTextContents(),count(),filter()와 같은 일괄 작업 헬퍼를 사용하세요.- 반드시 루프가 필요하다면 다음과 같이 작성합니다:
for (const item of items) {
await item.scrollIntoViewIfNeeded();
await expect(item).toBeVisible();
}
Playwright는 보통 로케이터에 대한 일괄 작업을 제공하므로 명시적인 루프는 불필요한 경우가 많습니다.
타이밍 위반
동적 DOM 변화나 페이지가 아직 준비되지 않은 경우 테스트가 목표를 놓칠 수 있습니다. Playwright가 자동 대기를 제공하지만, 어설션을 명시적으로 작성하는 것이 좋습니다.
암시적 대기에 의존하지 마세요 ❌:
const anchor = await expect(page.locator('#anchor'));
명시적 검사를 선호하세요 ✅:
await expect(page.locator('#target')).toBeVisible();
await page.locator('#target').scrollIntoViewIfNeeded();
Source: Playwright – Auto‑waiting
편리한 구성
Playwright는 플레이키 테스트를 자동으로 재시도할 수 있습니다:
import { defineConfig } from '@playwright/test';
export default defineConfig({
retries: 5,
});
테스트 결과 카테고리
- Passed – 첫 시도에서 성공
- Flaky – 처음에 실패했지만 재시도에서 통과
- Failed – 모든 시도에서 실패
플레이키 테스트를 무시하기 위해 재시도를 사용하지 마세요 ❌.
플레이키 테스트를 표시하고 수정하세요 ✅.