id, title, category, status, source_trust_level, verification_status, created_at, updated_at, tags, tech_stack, applied_in, aliases
| id |
title |
category |
status |
source_trust_level |
verification_status |
created_at |
updated_at |
tags |
tech_stack |
applied_in |
aliases |
| testing-test-pyramid |
Test Pyramid — 어디에 얼마나 투자할까 |
Coding |
draft |
B |
conceptual |
2026-05-09 |
2026-05-09 |
| testing |
| test-pyramid |
| vibe-coding |
|
| language |
applicable_to |
| Any |
|
|
|
| unit |
| integration |
| e2e |
| testing strategy |
| ice cream cone |
|
Test Pyramid
Unit (많이) → Integration (중간) → E2E (적게) 가 표준. 거꾸로 ice-cream cone (E2E 만 잔뜩) 은 느림 + 깨짐 + 디버깅 지옥. 단 modern 환경에서는 integration 비중이 더 큼.
📖 핵심 개념
- Unit: 한 함수 / 한 컴포넌트. ms 단위. 모킹 많음.
- Integration: DB / API / 다른 모듈 결합. 초 단위. 진짜 의존성.
- E2E: 브라우저 / 디바이스 전체 시나리오. 분 단위. flaky 가능.
- Contract: 다른 서비스와의 API 약속.
비율 가이드 (출발점):
- Unit: 60-70%
- Integration: 20-30%
- E2E: 5-10%
💻 코드 패턴
Unit (Jest / Vitest)
Integration — 진짜 DB
testcontainers / Docker compose 로 진짜 Postgres 띄우는 게 표준.
E2E (Playwright)
Component test — 중간 zone
🤔 의사결정 기준
| 코드 |
어디서 테스트 |
| 순수 함수 (계산, 포매팅) |
Unit |
| Repository / DAO |
Integration (testcontainers) |
| API endpoint |
Integration (supertest) |
| React 컴포넌트 (단일) |
Component (RTL + jsdom) |
| 복잡 form / 인증 / 결제 흐름 |
E2E (Playwright) |
| 다른 서비스 약속 |
Contract test (Pact) |
| Performance |
benchmark 별도 |
❌ 안티패턴
- 모든 것 E2E: 느림 + flaky. 빠른 피드백 못 받음.
- unit test 가 모킹 천국: 모킹된 인터페이스는 실제와 다를 수 있음 → 통합 시 사고. integration 도 필수.
- DB 모킹 (Jest mock): 실제 SQL 검증 안 됨. testcontainers 권장.
it.skip 누적: dead test. 청소.
- flaky test 무시: 한 번 무시하면 영구 무시. 즉시 fix 또는 quarantine.
- 테스트가 production 환경 의존: 다른 dev 가 못 돌림. self-contained.
- snapshot test 무지성 update: 의미 없어짐. diff 검토 후만 update.
- coverage 100% 강제: 의미 없는 테스트 양산. critical path 우선.
🤖 LLM 활용 힌트
- 새 함수: unit test + edge case 같이 생성 요청.
- API: supertest + testcontainers 패턴.
- E2E 는 critical journey 만.
🔗 관련 문서