AI로 테스트 코드를 늘리고 싶다면, 생성보다 검증 파이프라인을 먼저 설계해야 합니다
AI 코딩 도구로 테스트 코드를 빠르게 늘리려는 팀이 많습니다. 실제로 생성 속도는 꽤 좋습니다. 그런데 조금만 운영해 보면 금방 문제가 보입니다. 통과는 하지만 의미 없는 테스트가 늘고, 구현 세부사항에 과하게 묶인 테스트가 생기고, flaky test가 숨어 들어옵니다. 그래서 실무에서는 '테스트를 생성할 수 있느냐'보다 '생성된 테스트를 어떤 기준으로 받아들일 것이냐'가 더 중요합니다. 이 글은 AI 테스트 생성 도입 시 왜 검증 파이프라인이 먼저인지, 어떤 규칙을 정해야 테스트 부채를 줄일 수 있는지 정리합니다. 핵심 키워드는 AI test generation, test quality gate, flaky test prevention, coverage with meaning입니다.
왜 테스트 생성은 쉬운데 테스트 운영은 어려운가
테스트 코드는 자연어에서 코드로 바꾸기 쉬운 편입니다. 함수 설명, 입력 예시, 기대 결과만 있어도 모델이 그럴듯한 테스트를 만듭니다. 문제는 그다음입니다. 모델은 '돌아가는 테스트'를 만드는 데는 강하지만 '장기적으로 유지할 가치가 있는 테스트'를 고르는 데는 약합니다.
예를 들어 아래 같은 문제가 자주 생깁니다.
- 내부 구현을 그대로 따라 쓰는 복제형 테스트
- 값 하나만 바꾼 중복 테스트
- 랜덤, 시간, 네트워크에 취약한 flaky 테스트
- 실패 메시지가 약해서 디버깅에 도움 안 되는 테스트
- 커버리지는 오르지만 리스크 감소에는 기여하지 않는 테스트
그래서 생성 속도만 보고 도입하면 저장소가 빠르게 더러워집니다.
먼저 정해야 하는 검증 기준 5가지
1) 무엇을 테스트할지 우선순위 정의
모든 코드에 테스트를 똑같이 늘릴 필요는 없습니다. 우선순위는 보통 이렇습니다.
- 금액, 권한, 데이터 변환처럼 실패 비용이 큰 로직
- 버그가 자주 났던 경로
- 외부 API 응답을 해석하는 경계 코드
- 회귀 위험이 높은 핵심 유즈케이스
이 기준 없이 생성하면 쉬운 함수 테스트만 잔뜩 늘어납니다.
2) 테스트 종류 구분
AI에게 '테스트 작성'이라고만 하면 단위 테스트와 통합 테스트를 섞습니다. 어떤 저장소는 React Testing Library를 원하고, 어떤 팀은 서비스 레이어 단위 테스트를 원합니다. 테스트 종류를 먼저 고정해야 결과가 안정됩니다.
3) 금지 규칙 설정
실무에서는 하지 말아야 할 일을 먼저 적는 게 좋습니다. 예를 들면 이런 식입니다.
- 스냅샷 테스트 자동 생성 금지
- 네트워크 실제 호출 금지
- 현재 시간 의존 테스트 금지
- private 메서드 직접 검증 금지
- 구현 세부 클래스명 검증 금지
금지 규칙이 없으면 모델이 가장 쉬운 길로 갑니다.
4) 품질 게이트
생성된 테스트는 아래를 통과해야 합니다.
- 실패 시 원인 파악이 쉬운가
- 같은 목적의 중복 테스트가 아닌가
- flaky 위험이 없는가
- 실제 비즈니스 규칙을 검증하는가
- 기존 테스트 전략과 충돌하지 않는가
이 기준을 체크리스트로 만들면 리뷰 품질이 올라갑니다.
5) 수용 방식
AI가 만든 테스트를 바로 머지하지 말고, 제안 형태로 두는 편이 안전합니다. 특히 처음에는 PR에 '추천 테스트 묶음'으로 올리고 사람이 일부만 채택하는 방식이 좋습니다.
어떤 흐름이 잘 작동하나
가장 현실적인 운영 플로우는 이렇습니다.
- 변경된 diff를 읽는다
- 리스크 높은 로직만 식별한다
- 테스트 후보를 3~5개 제안한다
- 각 후보의 목적과 실패 조건을 먼저 설명한다
- 그다음에 테스트 코드를 생성한다
- lint, typecheck, test를 돌린다
- 사람 리뷰어가 가치 없는 테스트를 버린다
이 구조가 좋은 이유는 '코드 생성'보다 '테스트 의도 설명'이 먼저 오기 때문입니다. 의도를 먼저 보면 쓰레기 테스트를 많이 걸러낼 수 있습니다.
자주 생기는 실패 패턴
첫 번째는 coverage 숫자만 KPI로 잡는 경우입니다. 그러면 모델은 가장 쉬운 분기부터 메웁니다. 숫자는 오르는데 품질은 그대로입니다.
두 번째는 기존 테스트 철학과 맞지 않는 테스트가 들어오는 경우입니다. 예를 들어 사용자 행동 중심 UI 테스트를 선호하는 팀인데, 모델이 구현 세부 DOM 구조를 과하게 검증하면 유지보수 비용이 커집니다.
세 번째는 flaky 테스트를 늦게 발견하는 경우입니다. 생성 직후는 통과하지만, CI에서 간헐적으로 깨지기 시작하면 팀 신뢰를 갉아먹습니다. 시간, 랜덤, 외부 상태 의존성을 초기에 차단해야 합니다.
그래서 무엇을 자동화해야 하나
중요한 건 테스트 코드 자체보다 '테스트 제안과 검증'을 자동화하는 겁니다. 예를 들면 아래 자동화가 더 유용합니다.
- 변경 파일에서 고위험 함수 찾기
- 누락된 엣지 케이스 추천
- 기존 테스트와 중복 여부 검사
- flaky 패턴 탐지
- 실패 메시지 품질 검사
이런 보조 자동화가 붙으면 생성된 테스트의 품질이 올라갑니다.
현실적인 결론
AI 테스트 생성은 분명 유용합니다. 하지만 기준 없이 도입하면 테스트 부채를 더 빠르게 쌓을 뿐입니다. 실무 팀이 먼저 할 일은 모델 선택이 아니라 검증 파이프라인 설계입니다. 어떤 테스트를 원하고, 어떤 테스트는 금지하며, 어떤 기준을 통과해야 머지할지 문서로 적어야 합니다.
그 다음에야 AI가 팀에 도움이 됩니다. 테스트를 많이 만드는 도구가 아니라, 가치 있는 테스트만 더 빨리 제안하는 도구로 써야 합니다.
바로 실행할 체크리스트
- 테스트 생성 대상 우선순위를 먼저 정한다
- 단위/통합/UI 테스트 중 원하는 범위를 명시한다
- 스냅샷, 네트워크 실호출, 시간 의존 테스트 금지 규칙을 적는다
- 테스트 코드보다 테스트 의도 설명을 먼저 생성하게 한다
- flaky 패턴과 중복 테스트를 자동 검사한다
- coverage 외에 회귀 방지 가치도 리뷰 기준에 넣는다
- 초반에는 자동 머지 대신 제안 모드로 운영한다