본문으로 건너뛰기

10.5 Test Pyramid와 Contract 경계

Playwright가 browser와 API를 모두 다룰 수 있다고 해서 모든 검증을 E2E로 만들 필요는 없습니다. 빠르고 좁은 test와 느리지만 통합 범위가 넓은 test를 요구사항 위험에 맞게 배치합니다.

Layer별 책임

Layer검증할 것피할 것
Unitpure logic, validation rulebrowser rendering
Componentstate별 UI rendering, interaction실제 전체 backend
API/contractschema, permission, state transitionpixel layout
Browser integrationfrontend-backend 경계, navigation모든 edge data 조합
E2E핵심 사용자 journey와 배포 confidence세부 구현 branch 전부

같은 요구사항을 나누는 예

“사용자가 CSV를 export한다”는 하나의 문장이지만 다음처럼 분해할 수 있습니다.

  • Unit: filter option을 query parameter로 변환
  • API: export endpoint authorization과 CSV schema
  • Browser: filter를 선택하고 download가 시작되는지
  • E2E: 실제 data가 포함된 파일을 받아 핵심 row를 확인

Mock의 신뢰 비용

await page.route('**/api/orders', route => route.fulfill({
json: [{ id: 'ORDER-1', status: 'paid' }],
}));

빠르고 deterministic하지만 backend schema가 바뀌어도 mock은 그대로 통과할 수 있습니다. Contract test 또는 소수의 real-backend E2E가 이 위험을 보완해야 합니다.

선택 질문

  1. 이 실패가 어느 component의 책임인지 빠르게 알 수 있는가?
  2. 같은 behavior를 더 낮은 layer에서 빠르게 검증할 수 있는가?
  3. Mock과 real implementation 사이 drift를 누가 감지하는가?
  4. 이 test는 PR마다 필요한가, scheduled run이 적합한가?
  5. 실패했을 때 release를 막아야 하는가?

Component testing 주의

Playwright component testing의 지원 상태와 framework integration은 변할 수 있습니다. 도입 전 현재 공식 문서의 안정성, bundler, CI 지원과 upgrade cost를 확인합니다. Product가 이미 Storybook 같은 component harness를 사용한다면 기존 ecosystem과 비교합니다.

Suite budget

각 test group에 latency, flake rate, ownership, artifact cost budget을 둡니다. Test 수가 아니라 release confidence 대비 운영 비용을 봅니다.

실습

  1. Todo Lab 요구사항 10개를 test layer에 배치합니다.
  2. Network mock test와 real server test를 한 쌍으로 만듭니다.
  3. E2E에서 과도한 data 조합을 API parameterized test로 이동합니다.
  4. Smoke suite의 최대 실행 시간과 허용 flake rate를 문서화합니다.

참고: API testing, Mock APIs, Component testing