본문으로 건너뛰기
QA-Lab
중급20

AI가 생성한 테스트의 커버리지 갭 찾아내기

AI가 만든 테스트는 뻔한 정상 케이스는 잘 잡지만, 경계값과 예외 상황을 자주 놓친다. 모듈 3의 설계 기법을 체크리스트 삼아 빈틈을 스스로 찾아내는 법을 익힌다.

  • #커버리지갭
  • #경계값분석
  • #AI코드검증

개념

AI가 잘 만드는 것과 잘 놓치는 것

AI에게 "이 함수의 테스트를 만들어줘"라고 하면, 명세에 명시적으로 적힌 정상 케이스는 잘 만들어낸다. 문제는 모듈 3에서 배운 설계 기법이 겨냥하는, "명시적으로 적혀있진 않지만 당연히 확인해야 하는" 케이스들이다.

AI가 잘 만드는 것: "가격이 10000원이고 할인율이 10%면 9000원이다"
AI가 자주 놓치는 것: 할인율이 정확히 0%일 때, 100%일 때, 음수일 때,
                     가격이 0원일 때(모듈 3 레슨 1의 경계값)

모듈 3의 설계 기법을 검증 체크리스트로 재사용하기

새로운 기법을 배우는 게 아니라, 이미 배운 것을 거꾸로 활용하는 것이 이 레슨의 핵심이다.

경계값 분석(모듈 3 레슨 1) 체크하기

질문: "AI가 만든 테스트에 정확히 경계에 있는 값(최솟값, 최댓값,
      그 바로 안팎)이 있는가?"
 
예: "재고가 0개일 때 구매 버튼이 비활성화된다"는 명세가 있다면,
    AI가 만든 테스트에 정확히 재고 0개, 1개인 케이스가 있는가?

동등분할(모듈 3 레슨 1) 체크하기

질문: "입력값의 각 그룹(유효한 범위, 무효한 범위)이 골고루
      대표되는가, 아니면 전부 비슷한 정상값만 테스트하는가?"

결정 테이블(모듈 3)이나 페어와이즈(모듈 3 레슨 5) 체크하기

질문: "조건이 여러 개 조합될 때(예: 회원등급 × 쿠폰 종류), AI가
      만든 테스트가 몇 가지 조합만 다루고 있지는 않은가?"

악성 입력·예외 상황(모듈 3 레슨 8~9) 체크하기

질문: "빈 문자열, null, 매우 긴 입력, 특수문자 같은 비정상
      입력에 대한 케이스가 있는가?"

명세를 나란히 놓고 대조하기

가장 실용적인 방법은, 명세와 AI가 만든 테스트 목록을 나란히 놓고, 명세의 각 조건이 테스트로 몇 개나 대응되는지 표로 정리하는 것이다.

명세 조건                          대응 테스트 개수
쿠폰 코드가 유효할 때                2개
쿠폰 코드가 만료됐을 때              0개 ← 갭
쿠폰 코드가 존재하지 않을 때          0개 ← 갭
쿠폰 최소 주문 금액 미달일 때         0개 ← 갭

이 표는 모듈 12(레슨 4)에서 배운 계약 테스트의 발상과 비슷하다 — "약속(명세)과 실제(테스트)가 일치하는가"를 명시적으로 대조하는 것이다.

커버리지 도구와 함께 쓰기

모듈 10(레슨 5)에서 배운 커버리지 도구(라인·브랜치 커버리지)는 이 작업을 보완할 수 있다. 브랜치 커버리지가 낮은 부분은 AI가 아예 건드리지 않은 조건 분기일 가능성이 높다 — 다만 모듈 10(레슨 5)에서 배운 것처럼, 커버리지 도구는 "실행 여부"만 볼 뿐 "경계값이 정확한지"까지는 확인 못 한다는 한계는 여전히 그대로다.

빈틈을 찾은 다음에는

빈틈을 발견했다고 전부 사람이 직접 채울 필요는 없다 — 모듈 18a(레슨 1)에서 배운 것처럼, 발견한 빈틈을 구체적으로 명시한 프롬프트로 AI에게 "이 경계값 케이스도 추가해줘"라고 다시 요청하는 것이 효율적이다. 빈틈을 찾는 것은 사람의 역할, 채우는 초안을 만드는 것은 다시 AI에게 맡길 수 있다.

실무에서 왜 필요한가

"AI가 테스트 케이스 30개를 만들었다"는 숫자에 안심하는 대신, 명세 대조표를 만들어보면 실제로는 정상 케이스만 20번 반복되고 정작 중요한 예외 상황은 하나도 없다는 게 드러나는 경우가 흔하다. 모듈 3의 설계 기법을 검증 체크리스트로 재사용할 줄 아는 QA는, AI가 만든 테스트의 진짜 커버리지를 정확히 판단할 수 있다.

실습 과제

과제 1 — 대조표 만들기 (15분)

"비밀번호는 8~20자, 특수문자 1개 이상 포함해야 한다"는 명세에 대해, AI가 다음 3개 테스트만 만들었다고 하자.

1. "Pass1234!" (유효한 비밀번호) → 통과 기대
2. "short" (너무 짧음) → 거부 기대
3. "verylongpasswordwithoutspecialchar" (특수문자 없음) → 거부 기대

이 레슨의 체크리스트를 적용해 빠진 경계값·케이스를 3가지 이상 찾아낸다.

과제 2 — 재요청 프롬프트 작성하기 (10분)

과제 1에서 찾은 빈틈을 채우기 위해, AI에게 다시 요청할 구체적인 프롬프트를 작성한다(모듈 18a 레슨 1의 좋은 프롬프트 원칙을 참고한다).

자가 체크리스트

  • AI가 정상 케이스는 잘 만들지만 경계값·예외는 자주 놓치는 이유를 설명할 수 있다
  • 모듈 3의 설계 기법들을 검증 체크리스트로 재사용하는 방법을 설명할 수 있다
  • 명세-테스트 대조표를 만들어 갭을 찾는 방법을 설명할 수 있다
  • 커버리지 도구가 이 작업을 어떻게 보완하고, 어떤 한계가 있는지 설명할 수 있다

흔한 실수

  • AI가 만든 테스트 개수만 보고 충분하다고 판단한다. 개수가 아니라 명세 대비 커버리지가 중요하다.
  • 정상 케이스가 여러 번 반복된 것을 다양한 커버리지로 착각한다. 표현만 다를 뿐 같은 조건을 반복 테스트하는 것일 수 있다.
  • 빈틈을 찾고도 직접 하나하나 다 채우려 한다. 빈틈을 구체적으로 짚어 AI에게 다시 요청하는 것이 더 효율적이다.

참고 자료

  • 모듈 3(테스트 설계 기법) 전체 레슨 — 이 레슨에서 재사용하는 모든 설계 기법의 원본
  • ISTQB CTFL — Test Techniques 관련 공식 정의(경계값·동등분할 등)