테스트
TDD로 진행한다. 테스트는 vitest로 돌리고 Turborepo가 패키지별로 묶는다.
pnpm test # 전체
pnpm --filter @glossary/engine test # 정규화 엔진 (DB 불필요)
pnpm --filter @glossary/db test # DB 통합 (Postgres 필요)
pnpm --filter @glossary/web test # API·화면 (Postgres 필요)
pnpm --filter @glossary/web test:e2e # 실제 Chromium 사용자 흐름테스트 DB는 분리되어 있다
apps/web/tests/setup.ts와 packages/db/tests/setup.ts가 저장소 루트의 .env를 읽은 뒤 DATABASE_URL_TEST를 사용한다. web 테스트는 호환되는 기존 테스트 코드가 DATABASE_URL을 읽어도 테스트 DB를 보도록 그 값도 덮어쓴다. 환경변수가 없고 .env에도 값이 없으면 테스트가 시작 자체를 거부한다.
const testUrl = process.env.DATABASE_URL_TEST;
if (!testUrl) {
throw new Error("DATABASE_URL_TEST가 필요합니다. 테스트는 개발 DB에 붙지 않습니다.");
}
process.env.DATABASE_URL = testUrl;glossary_test DB는 scripts/init-db.sql이 Postgres 초기화 시점에 만든다. DB에 붙는 패키지는 fileParallelism: false다 — 테스트가 같은 테이블을 건드린다.
스키마 변경 뒤 또는 처음 E2E를 실행하기 전에는 테스트 DB에 마이그레이션을 적용하고 프로덕션 빌드를 만든다. 두 명령 모두 운영·개발 DB가 아니라 DATABASE_URL_TEST만 사용한다.
pnpm --filter @glossary/db db:migrate:test
pnpm build
pnpm --filter @glossary/web test:e2e어디에 무게를 싣나
| 계층 | 테스트 성격 |
|---|---|
packages/engine | 순수 함수 단위 테스트. DB 없이 빠르게 돌고, 정확도 회귀가 가장 아픈 곳이다 |
packages/db | 실제 Postgres 통합 테스트 |
apps/web (API) | zod 스키마 기반 계약 테스트. 인증·scope 경계 포함 |
apps/web (화면) | Server Component를 async 함수로 직접 호출해 엘리먼트 트리를 검사 |
구조를 잠그는 테스트들
손으로 유지되는 리터럴이나 규약은 코드 리뷰에 기대지 않고 테스트로 잠근다.
packages/db/tests/normalize-parity.test.ts— 저장된 정규화 컬럼과@glossary/engine의 정규화 함수가 일치하는지 검증한다. 이 둘이 갈라지면 매칭이 에러 없이 조용히 실패하므로, 이 저장소에서 가장 중요한 테스트다.apps/web/tests/openapi.test.ts—app/api/v1/밑의 모든 라우트가 OpenAPI 스펙에 있고 HTTP 메서드까지 일치하는지 검사한다. 라우트를 추가하고 스펙을 안 고치면 깨진다.apps/web/tests/screen-guards.test.ts— 상태를 바꾸는 GET 핸들러가 생기지 않게 막는다. CSRF 방어는 출처 검증과SameSite=Lax쿠키를 함께 사용하므로 이 규칙을 유지해야 한다.
jsdom은 쓰지 않는다
렌더/이벤트 테스트는 하지 않는다. Server Component는 평범한 async 함수라 직접 호출해서 반환된 React 엘리먼트 트리(순수 객체)를 검사한다. JSX 변환은 apps/web/vitest.config.ts의 automatic 런타임 설정을 따른다. classic 변환이면 JSX가 React.createElement 참조 오류를 낼 수 있다.
E2E(Playwright)는 /login 또는 /setup 진입점 스모크와 다음 핵심 사용자 흐름을 실제 Chromium에서 확인한다.
- 관리자 로그인
- 용어와 별칭 등록
- 별칭으로 검색해 같은 용어 상세에 도달
- 문서 점검에서 미등록 후보 수집
- 정의 수정 후 이전 리비전으로 되돌리기
E2E 서버는 3200번 포트에서 별도로 뜨고 DATABASE_URL_TEST만 사용한다. 실행 중인 개발 서버를 재사용하지 않으며, 테스트가 만든 사용자·용어·후보는 테스트 전후에 정리한다.