Skip to main content
failproofai에는 두 가지 테스트 스위트가 있습니다: 단위 테스트 (빠름, 목(mock) 사용)와 엔드투엔드 테스트 (실제 서브프로세스 호출).

테스트 실행


단위 테스트

단위 테스트는 __tests__/ 디렉터리에 위치하며 jsdom과 함께 Vitest를 사용합니다.

정책 단위 테스트 작성하기


엔드투엔드 테스트

E2E 테스트는 실제 failproofai 바이너리를 서브프로세스로 호출하고, JSON 페이로드를 stdin으로 전달한 뒤, stdout 출력과 종료 코드를 검증합니다. 이는 Claude Code가 사용하는 전체 통합 경로를 테스트합니다.

설정

E2E 테스트는 저장소 소스에서 바이너리를 직접 실행합니다. 첫 실행 전에, 커스텀 훅 파일이 'failproofai'에서 임포트할 때 사용하는 CJS 번들을 빌드하세요:
이후 테스트를 실행합니다:
공개 훅 API(src/hooks/custom-hooks-registry.ts, src/hooks/policy-helpers.ts, src/hooks/policy-types.ts)를 변경할 때마다 dist/를 다시 빌드하세요.

E2E 테스트 구조

E2E 헬퍼 사용하기

FixtureEnv - 테스트별 독립 환경:
createFixtureEnv()afterEach 정리를 자동으로 등록합니다. runHook - 바이너리 호출:
Payloads - 미리 만들어진 페이로드 팩토리:

E2E 테스트 작성하기

E2E 응답 형태

Vitest 설정

E2E 테스트는 vitest.config.e2e.mts를 사용하며 다음과 같이 구성됩니다:
  • environment: "node" - 브라우저 전역 변수 불필요
  • pool: "forks" - 진정한 프로세스 격리 (테스트가 서브프로세스를 생성)
  • testTimeout: 20_000 - 테스트당 20초 (바이너리 시작 + 훅 평가)
forks 풀이 중요한 이유: 스레드 기반 워커는 globalThis를 공유하므로 서브프로세스를 생성하는 테스트에 간섭이 발생할 수 있습니다. 프로세스 기반 포크는 이 문제를 방지합니다.

CI

병합 전에 전체 CI 실행(bun run lint && bunx tsc --noEmit && bun run test:run && bun run build)이 통과되어야 합니다. E2E 스위트는 별도의 CI 작업으로 병렬 실행됩니다. 전체 병합 전 체크리스트는 Contributing를 참조하세요.