통합 테스트의 마이그레이션 replay를 fail-closed로 만들기
통합 테스트가 스키마를 만들지 못했는데도 entity 테스트를 계속하면 실패가 지연되어 원인을 잃는다. 마이그레이션 디렉터리 누락, SQL 파일 0개, 파일 읽기 실패, 개별 SQL 오류는 모두 테스트 bootstrap 실패다.
4회 조회약 2분 읽기
목차
통합 테스트가 스키마를 만들지 못했는데도 entity 테스트를 계속하면 실패가 지연되어 원인을 잃는다. 마이그레이션 디렉터리 누락, SQL 파일 0개, 파일 읽기 실패, 개별 SQL 오류는 모두 테스트 bootstrap 실패다.
false green을 막는 replay
SSOT 디렉터리와 SQL 파일 1개 이상을 요구합니다.
파일을 정렬하고 UTF-8로 읽습니다.
첫 SQL 오류에서 전체 transaction을 중단합니다.
대표 테이블·컬럼·제약 probe 뒤에만 본 테스트를 시작합니다.
안전한 replay 규칙
- 저장소 SSOT 경로를 찾지 못하면 즉시 예외를 발생시킨다.
- 디렉터리 안에 SQL이 없으면 성공으로 표시하지 않는다.
- 정렬된 SQL을 UTF-8로 읽고 첫 실행 오류에서 중단한다.
- seed도 동일한 규칙을 따르며, 적용 개수만으로 성공을 추정하지 않는다.
이 계약은 “테스트가 실행됐다”와 “실제 스키마에서 실행됐다”를 구분한다. 운영 migration 자체의 중복 실행 안전성과는 별개로, 테스트 harness가 실패를 숨기지 않는 것이 먼저다.
bootstrap 상태표
| 입력 상태 | 잘못된 처리 | 안전한 처리 |
|---|---|---|
| 디렉터리 없음 | 빈 목록으로 진행 | 경로와 함께 즉시 실패 |
| SQL 0개 | 적용 0건 성공 | 구성 오류로 실패 |
| UTF-8 읽기 실패 | 해당 파일 skip | 파일명을 남기고 중단 |
| 세 번째 SQL 실패 | 앞의 두 개만으로 테스트 | transaction rollback |
| seed 실패 | entity 테스트에서 발견 | bootstrap에서 실패 |
경로 → SQL 1개 이상 → 정렬 → UTF-8 읽기 → transaction replay → schema probe
└──────── 어느 단계든 실패하면 entity test를 시작하지 않는다 ────────┘
마지막 probe는 적용 개수가 아니라 대표 테이블·컬럼·제약을 확인합니다. 잘못된 디렉터리의 SQL을 읽었거나 드라이버가 일부 문장을 무시한 false green까지 잡기 위해서입니다.
판정 질문
마이그레이션 파일이 실제로 읽혔는지, 첫 SQL 오류가 원인과 함께 남았는지, 적용 개수만으로 성공을 표시하고 있지 않은지를 확인해야 합니다.