
백엔드
1. 통과하는 테스트 뒤에 숨어 있던 것들
두줄요약
통합 테스트가 없던 코드베이스에서 Mock이 급증한 원인과, AI가 그 관성을 더 키우는 구조를 정리했습니다. 실제 DB와 기록형 대역, 스냅샷, lint로 검증 기반을 바꿔 Mock 의존을 줄인 과정을 공유했습니다.
핵심 내용
- 통합 테스트가 없던 TypeScript 서버에서 Mock이 급증한 배경과, 특히 AI 보조 작성이 Mock을 더 빠르게 늘리는 자기강화 루프
- Mock은 외부 경계와 재현 불가 상황에만 두고, 내부 로직은 실제 DB 기반 통합 테스트나 인메모리 대역으로 검증하는 기준 정리
- Testcontainers, WireMock, 기록형 Mock, 특성화 테스트, 스냅샷, lint 규칙으로 Mock 의존을 줄이고 안전하게 제거한 과정
구조와 흐름
- 시작점: 통합 테스트 0개, Mock 1,336개에서 출발
- AI가 Mock을 양산하는 네 가지 원인 분석: 낮은 문맥 요구, 빠른 종료 신호, 기존 관례 모방, 문서상 기본값
- Mock을 세우는 대신 실제 출력과 나간 값을 검증하도록 테스트 구조 전환
- 특성화 테스트와 lint 정비로 유닛 Mock을 삭제할 수 있는 기반 마련
선택 이유
- 외부 API, S3, Redis 실패 같은 경계는 Mock이 적절한 검증 수단
- 저장·조회 결과가 중요한 내부 로직은 실제 DB 통합 테스트가 더 정확한 검증 수단
- 호출 여부보다 전송된 payload 자체를 보는 기록형 대역이 계약 검증에 더 적합
적용해볼 점
- 테스트 대상이 내부 로직인지 외부 경계인지 먼저 구분
- Mock 단언을 호출 횟수 대신 실제로 나간 값 검증으로 전환
- 통합 테스트 인프라와 lint 게이트를 먼저 마련한 뒤 Mock 제거
