Playwright로 불안정한 테스트 방지

발행: (2026년 1월 9일 오후 10:55 GMT+9)
3 min read
원문: Dev.to

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 – 모든 시도에서 실패

플레이키 테스트를 무시하기 위해 재시도를 사용하지 마세요 ❌.
플레이키 테스트를 표시하고 수정하세요 ✅.

Back to Blog

관련 글

더 보기 »