본문으로 건너뛰기

테스트 가이드

테스트 도구

  • Vitest — 단위 테스트
  • Playwright — E2E 테스트

테스트 파일 위치

단위 테스트는 대상 파일 옆 test/ 폴더에 둡니다.

features/community/model/
├── transformCommunity.ts
└── test/
└── transformCommunity.test.ts

app/api/partners/
├── route.ts
└── test/
└── route.test.ts

테스트 대상

대상테스트 여부
model/ 순수 함수✅ 필수
shared/utils/ 유틸✅ 필수
shared/model/ (오행·간지·만세력)✅ 필수
BFF route.ts✅ 권장
UI 컴포넌트선택 (중요 인터랙션만)

단위 테스트 예시

// features/home/model/test/getGreeting.test.ts
import { describe, it, expect } from 'vitest';
import { getGreeting } from '../getGreeting';

describe('getGreeting', () => {
it('오전이면 아침 인사를 반환한다', () => {
expect(getGreeting(8)).toBe('좋은 아침이에요');
});
});

BFF Route 테스트

// app/api/partners/test/route.test.ts
import { describe, it, expect, vi } from 'vitest';

describe('POST /api/partners', () => {
it('Cross-Origin 요청을 거부한다', async () => {
const req = new Request('http://evil.com/api/partners', {
method: 'POST',
headers: { origin: 'http://evil.com' },
});
const res = await POST(req);
expect(res.status).toBe(403);
});
});

실행

# 단위 테스트
npm run test -w @saju/web

# E2E
npm run e2e -w @saju/web

Turnstile E2E

실제 Cloudflare Turnstile 위젯을 E2E에서 사용할 때는 프로덕션 키 대신 Cloudflare 테스트 키를 사용합니다.

예시 .env.e2e

NEXT_PUBLIC_TURNSTILE_SITE_KEY=1x00000000000000000000BB
TURNSTILE_SECRET_KEY=1x0000000000000000000000000000000AA
  • apps/web/playwright.config.ts.env.e2e를 읽어 E2E 서버에 주입합니다.
  • Turnstile 관련 Playwright 실행은 localhost 기준으로 맞추는 편이 안전합니다.
  • 127.0.0.1localhost를 섞으면 CSRF Origin 검증과 쿠키 기준이 어긋날 수 있습니다.

Turnstile 검증 범위

  • 로그인 화면에서 invisible 위젯이 토큰을 발급하는지
  • /api/auth/turnstile-verify 성공 후 카카오 로그인 시작으로 이어지는지
  • /verify?returnTo=... 페이지에서 재검증 후 원래 화면으로 복귀하는지
  • 보호 API가 TURNSTILE_REQUIRED를 주면 각 feature가 /verify로 보내는지

추천 실행 예시

# 실제 Turnstile 위젯 검증
E2E_BASE_URL=http://localhost:3100 E2E_PORT=3100 \
npm run test:e2e -- e2e/auth-turnstile.spec.ts --project=chromium

# 보호 API 복구 흐름 검증
E2E_BASE_URL=http://localhost:3100 E2E_PORT=3100 \
npm run test:e2e -- e2e/auth-security.spec.ts e2e/community.spec.ts e2e/year-fortune.spec.ts --project=chromium