NestJS 테스트와 CI

E2E 테스트 구현: Supertest와 fixture 격리 점검

E2E spec은 실제 HTTP 요청이 Nest pipeline을 통과하는 계약과, 그 요청이 매번 같은 DB·인증 fixture에서 시작하는지를 함께 고정합니다.

앱 수명 실제 module 경계

AppModule compile override provider만 테스트용으로 고정
global 설정 재사용 prefix, ValidationPipe, filter 적용
app context 공유 DI container에서 repository와 token helper 호출
getHttpServer() controller 직접 호출 대신 실제 HTTP 진입
guard → pipe → controller 인증과 validation 실패도 같은 경계 통과
app.close 확인 DB·queue 연결이 CI를 붙잡지 않게 종료

Fixture 격리 순서 의존 제거

test DB 선택 sqlite, container, 전용 schema 중 하나로 고정
truncate 또는 rollback 이전 spec row와 session을 먼저 제거
seed user + role token은 같은 seed에서 만들어 drift 차단
숨은 상태 금지 요청 body와 header 안에 필요한 상태를 명시
side effect 관찰 DB 변경, audit log, event enqueue를 분리 확인
reset log 남김 삭제 row 수와 fixture version을 CI artifact에 보관

HTTP 계약 사용자 경로 고정

route map 확인 prefix와 versioning이 spec path와 일치
권한별 상태 준비 owner, guest, expired token을 따로 구성
요청 입력 고정 body, query, cookie를 fixture 이름으로 추적
status + body 2xx뿐 아니라 401, 403, 400 응답 shape 검증
header와 redirect cache, location, content-type 같은 계약 포함
응답 sample 실패 시 request와 response 일부를 함께 남김
정상
seeded owner 생성된 row와 권한이 token에 반영
POST/GET + header + body를 실제 path로 호출
status, body, DB side effect를 함께 확인
인증 실패
missing/expired token 정상 seed는 유지하고 token만 바꿈
Authorization header 생략 또는 만료값 전달
401/403 body와 guard 로그를 분리 저장
Validation
DB는 정상 상태 요청 payload만 깨뜨려 pipe를 확인
잘못된 body, query, param 조합을 명시
400 field error와 DB 미변경을 같이 assert
의존성 장애
override provider 외부 API 실패를 deterministic하게 고정
같은 사용자 요청으로 장애 branch만 재현
5xx/복구 응답과 error filter 로그 확인