ML로 테스트 우선순위를 정하는 결함 예측과 커버리지 최적화
결함 예측, 강화학습 기반 테스트 생성, 커버리지 갭 탐지와 중복 제거를 MLOps 운영 체계로 연결하는 ML 테스트 자동화 방법론
2026-08-14 · 최초 발행 2026-04-20
테스트 자원을 위험도에 따라 배치하는 방식
규칙 기반 테스트 자동화에서는 사람이 시나리오를 정하고 스크립트를 계속 손봐야 한다. 요구사항이 바뀔 때마다 수정 부담이 생기고, 예상하지 못한 엣지 케이스는 빠지기 쉽다. 스위트 전체를 실행하는 시간이 길어지며, 유사한 테스트가 쌓일수록 유지보수 비용도 커진다.
ML 기반 접근은 수백만 건의 테스트 실행 이력, 코드 변경 패턴, 결함 데이터를 학습해 사람이 규칙으로 모두 정의하기 어려운 패턴을 찾는다. 생성, 선택, 커버리지 전략, 중복 제거를 데이터 기반으로 조정한다.
| 영역 | 전통적 자동화 | ML 기반 자동화 |
|---|---|---|
| 테스트 케이스 생성 | 사람이 패턴 정의 | ML이 패턴 학습·자동 생성 |
| 결함 예측 | 코드 리뷰 후 발견 | 커밋 전 고위험 모듈 예측 |
| 커버리지 전략 | 균등 커버리지 목표 | 리스크 기반 집중 커버리지 |
| 중복 제거 | 수동 검토 | 자동 클러스터링·중복 탐지 |
변경 이력에서 고위험 모듈을 찾는 결함 예측
소프트웨어 결함 예측(SDP, Software Defect Prediction)은 과거 결함 데이터와 코드 메트릭을 학습해 결함 발생 가능성이 높은 모듈을 미리 식별한다. 예측 결과는 어떤 테스트를 먼저 실행하거나 더 집중적으로 생성할지 결정하는 입력이 된다.
모델에는 코드 복잡도 메트릭(Cyclomatic Complexity, LOC(Lines of Code), 함수 개수), 변경 빈도·변경 규모·공동 변경 파일(Co-change) 같은 변경 이력 메트릭이 들어갈 수 있다. 기여자 수, 코드 소유권, 리뷰 횟수의 소셜 메트릭과 결함 수정 이력, 재오픈 빈도, 수정 소요 시간의 프로세스 메트릭도 활용한다. Fan-in, Fan-out, 커플링 계수는 의존성 측면을 나타낸다.
| 알고리즘 | 특징 | 적합 상황 |
|---|---|---|
| Random Forest | 다수 결정 트리 앙상블, 해석 가능 | 일반적 결함 예측 |
| Gradient Boosting (XGBoost) | 순차적 오차 보정, 높은 정확도 | 불균형 데이터셋 |
| Deep Neural Network | 복잡한 비선형 패턴 학습 | 대규모 코드베이스 |
| Logistic Regression | 빠른 추론, 해석 용이 | 실시간 예측 |
| LSTM (코드 시퀀스) | 코드 토큰 시퀀스 패턴 학습 | AST 기반 예측 |
예측 점수는 CI/CD에서 테스트 강도를 달리하는 기준으로 쓸 수 있다.
결함 예측 정확도 벤치마크(2026 기준)는 다음과 같다.
- Precision: 75~85% (고위험으로 예측한 모듈 중 실제 결함 발생 비율)
- Recall: 80~90% (실제 결함 모듈 중 예측 성공 비율)
- F1-Score: 0.77~0.87
- 조기 결함 탐지율: 인간 대비 3~5배 향상
강화학습으로 미도달 경로를 탐색하는 테스트 생성
강화학습에서는 소프트웨어 탐색 자체를 환경(Environment)으로 본다. 에이전트는 현재 실행 경로와 도달한 브랜치, 입력 조합을 상태(State)로 받아 새 입력값 생성과 실행 경로 탐색을 행동(Action)으로 수행한다. 신규 브랜치 커버리지 획득에는 +1, 기존 경로 재탐색에는 -0.1의 보상(Reward)을 두고 최대 코드 커버리지를 목표(Goal)로 삼는다.
| 기법 | 커버리지 달성률 | 실행 시간 | 엣지 케이스 |
|---|---|---|---|
| 랜덤 테스트 | 40~60% | 빠름 | 낮음 |
| 경계값 분석 (수동) | 60~75% | 느림 | 중간 |
| 퍼즈 테스팅(Fuzzing) | 70~80% | 중간 | 높음 |
| RL 기반 테스트 생성 | 85~95% | 중간 | 매우 높음 |
Coverage-Directed Generation(CDG)은 커버리지가 낮은 코드 영역에 테스트 생성을 집중하는 ML 최적화 기법이다. 실행 추적(execution trace)으로 아직 도달하지 못한 브랜치를 찾고, Variational Autoencoder(VAE)로 입력 공간의 다양성을 확보한다. 이후 특정 경로로 이어지는 입력값을 역추적(backtracking)하며, 실행 결과를 다음 생성 단계에 반영해 반복적으로 정제한다.
유사 테스트는 줄이고 비어 있는 검증 영역은 찾는다
테스트 스위트가 커지면 동일하거나 비슷한 케이스가 누적되어 실행 시간과 유지보수 비용을 높인다. 텍스트 임베딩(Text Embedding)은 테스트 설명과 코드를 벡터화해 코사인 유사도로 중복을 찾는다. 실행 추적 클러스터링은 같은 코드 경로를 실행하는 테스트를 묶어 대표 케이스를 고르는 데 사용된다.
입력/출력 쌍이 동일한 테스트는 행동 동등성 분석(Behavioral Equivalence)으로 동등 클래스로 분류할 수 있다. 같은 브랜치만 실행하는 테스트는 커버리지 기반으로 중복 판단하고, 더 간결한 케이스를 남긴다.
1. 전체 테스트 스위트 실행 → 커버리지 행렬(Coverage Matrix) 생성
2. 클러스터링 (K-means, DBSCAN) → 유사 테스트 그룹화
3. 각 클러스터에서 대표 테스트 선택 (커버리지 최대, 실행 시간 최소)
4. 제거 대상 목록 생성 → 사람 검토 (선택적)
5. 테스트 스위트 최적화 완료
중복을 줄이는 작업과 함께, 테스트가 없는 코드 영역(Coverage Gap)을 찾아 새 테스트 생성을 유도할 수 있다. 커버리지와 결함 예측 점수를 함께 보면 보완 우선순위를 정하기 쉽다.
| 모듈 | 현재 커버리지 | 결함 예측 점수 | 우선순위 |
|---|---|---|---|
| payment/processor.py | 45% | 0.82 | Critical |
| auth/token_validator.py | 62% | 0.71 | High |
| notification/email.py | 78% | 0.35 | Medium |
| util/formatter.py | 91% | 0.12 | Low |
JaCoCo / Istanbul은 코드 커버리지 측정으로 갭 리포트를 제공한다. SonarQube + ML 플러그인은 결함 예측 점수와 커버리지를 결합해 우선순위를 추천하며, Diffblue Cover는 Java 코드의 커버리지 갭을 단위 테스트로 채운다. GitHub Copilot Test Generation은 함수·클래스 단위 테스트를 자동 추천한다.
모델과 CI/CD를 함께 운영하는 MLOps 체계
ML 기반 테스트 자동화는 일회성 모델 적용으로 끝나지 않는다. 코드 변경 이력, 테스트 실행 결과, 결함 이력을 수집하고 피처 엔지니어링과 모델 재학습을 CI/CD 의사결정에 연결해야 한다.
데이터 수집
→ 코드 변경 이력 (Git)
→ 테스트 실행 결과 (CI 시스템)
→ 결함 이력 (Jira, Bugzilla)
↓
피처 엔지니어링 파이프라인
→ 코드 메트릭 자동 추출
→ 정규화 및 결측값 처리
↓
모델 학습 (재학습 트리거: 주간 or 정확도 저하 감지)
→ 결함 예측 모델
→ 중복 탐지 모델
→ 갭 탐지 모델
↓
모델 레지스트리 (MLflow, Weights & Biases)
→ 버전 관리, A/B 배포
↓
CI/CD 파이프라인 통합
→ API 호출로 결함 예측 점수 수신
→ 테스트 선택 결정 자동화
운영 중에는 결함 예측 정확도의 드리프트, 테스트 스위트 중복률 추이(목표: 10% 미만), 커버리지 갭 해소율을 확인한다. 모델 추론 지연 시간도 CI 게이트에 미치는 영향을 최소화하는 방향으로 관리한다.
전체 스위트를 균등하게 실행하는 대신, 결함 가능성이 높은 코드에 검증 자원을 집중하는 것이 이 접근의 핵심이다. 이를 위해서는 과거 결함 이력과 코드 변경 데이터를 체계적으로 수집하고, 모델을 지속적으로 재학습하며 정확도를 모니터링해야 한다.
Sources
- Intelligent Software Testing: Harnessing Machine Learning to Automate Test Case Generation and Defect Prediction
- Automated Test Case Generation and Defect Prediction: Enhancing Software Quality Assurance through AI-Driven Testing Automation
- Machine Learning Approaches for Software Defect Prediction
- Coverage-Directed Test Generation Automated by Machine Learning - A Review
- How AI is Transforming Test Case Generation in 2026
- How machine learning is changing what QA engineers actually do day-to-day
- Machine Learning to Predict Test Failures - testRigor