본문으로 건너뛰기
SDETRole
SDETRole

용어집 · UI 자동화

테스트 격리

영어: Test isolation

다른 이름: 테스트 독립성, isolated tests, independent tests

정의

각 테스트가 자신의 상태를 직접 준비해 단독으로, 어떤 순서로든, 병렬로도 통과하며 다른 테스트에 의존하거나 영향을 주지 않는 성질입니다.

격리된 테스트는 필요한 것을 모두 스스로 만들고, 다른 테스트가 남겨 둔 것에 의존하지 않으며, 다른 테스트의 결과를 바꿀 만한 것을 남기지 않습니다. 어떤 테스트든 단독으로 실행하거나, 전체 스위트를 역순으로 실행하거나, 8개의 병렬 워커로 나눠 실행해도 같은 결과가 나온다면 그 스위트는 격리되어 있는 것입니다. 병렬 실행과 샤딩을 안전하게 만들어 주는 것이 바로 격리입니다.

예시

격리되지 않은 경우: 두 번째 테스트가 첫 번째 테스트에 의존합니다.

test('creates a project', async ({ page }) => {
  await page.goto('/projects/new');
  await page.getByLabel('Name').fill('Apollo');
  await page.getByRole('button', { name: 'Create' }).click();
});

test('renames the project', async ({ page }) => {
  await page.goto('/projects/apollo'); // fails if run alone or first
});

격리된 경우: 각 테스트가 API를 통해 고유한 이름으로 자신의 데이터를 생성합니다.

test('renames a project', async ({ page, request }) => {
  const name = `proj-${crypto.randomUUID()}`;
  const res = await request.post('/api/projects', { data: { name } });
  const { id } = await res.json();

  await page.goto(`/projects/${id}`);
  // ...rename and assert
});

Playwright는 브라우저 레벨에서 격리를 돕습니다. 테스트마다 새로운 BrowserContext가 주어지므로 쿠키, 로컬 스토리지, 세션이 테스트 사이에 새어 나가지 않습니다.

상태가 새어 나가는 원인

  • 테스트가 수정하는 공유 계정과 레코드. 예를 들어 모든 테스트가 설정을 바꾸는 단 하나의 “테스트 사용자”가 있습니다.
  • 테스트 코드 안의 static 또는 전역 상태. 싱글턴 드라이버나 클래스 레벨 변수 등입니다.
  • 정리되지 않은 데이터베이스 행. 또는 다른 테스트도 쓰기를 하는 테이블의 행 수를 어설션하는 테스트입니다.
  • 외부 상태. 피처 플래그, 이메일 수신함, 시간, 캐시 등입니다.

확인 방법

테스트를 무작위 순서로 실행합니다. JUnit 5는 @TestMethodOrder(MethodOrderer.Random.class)를 지원하며, junit-platform.properties에서 모든 클래스의 기본 순서를 무작위로 설정할 수 있습니다. 테스트를 하나씩 단독으로 실행해 봅니다. 평소보다 많은 워커로 스위트를 실행해 봅니다. 결과가 달라지는 테스트가 있다면 그 테스트는 격리되어 있지 않은 것입니다.

완전한 격리에는 비용이 따르며, 특히 준비 작업이 느릴 때 그렇습니다. 흔히 쓰는 절충안은 비용이 크고 읽기 전용인 데이터는 워커 단위로 공유하고, 테스트가 쓰기를 하는 데이터는 모두 그 테스트 고유의 것으로 유지하는 방식입니다.

SDETRole 전체에서 검색할 내용을 입력하세요.

Pagefind 전문 검색 · 브라우저에서 실행됩니다 검색 페이지 열기 →