Skip to content

테스트 ​

TDD로 진행한다. 테스트는 vitest로 돌리고 Turborepo가 패키지별로 묶는다.

bash
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에도 값이 없으면 테스트가 시작 자체를 거부한다.

ts
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만 사용한다.

bash
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에서 확인한다.

  1. 관리자 로그인
  2. 용어와 별칭 등록
  3. 별칭으로 검색해 같은 용어 상세에 도달
  4. 문서 점검에서 미등록 후보 수집
  5. 정의 수정 후 이전 리비전으로 되돌리기

E2E 서버는 3200번 포트에서 별도로 뜨고 DATABASE_URL_TEST만 사용한다. 실행 중인 개발 서버를 재사용하지 않으며, 테스트가 만든 사용자·용어·후보는 테스트 전후에 정리한다.

사내망 온프레미스 배포를 전제로 만든 Apache-2.0 프로젝트입니다.