메인 콘텐츠로 건너뛰기
failproofai에는 두 가지 테스트 스위트가 있습니다: 유닛 테스트 (빠른 실행, 모킹 사용)와 엔드-투-엔드 테스트 (실제 서브프로세스 호출).

테스트 실행


유닛 테스트

유닛 테스트는 __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을 참고하세요.