Engineer Information Processing study materials
Engineer Information Processing study resources

할인 함수의 커버리지와 경계값

Engineer Information Processing · Put your knowledge to work in context.

All case studies

할인 함수의 커버리지와 경계값

결제 금액 할인 함수 calculateFee(amount, grade, coupon)를 출시하려 한다. 규칙은 다음과 같다. amount가 0 미만이면 IllegalArgumentException을 던진다. grade가 A이면 amount가 50,000원 이상일 때 10%, 미만일 때 5%를 할인한다. grade가 B이면 3%를 할인한다. 그 외 grade는 할인하지 않는다. coupon이 true이면 등급 할인 후 금액에서 2,000원을 빼되 0원 미만으로 내려가지 않는다. 현재 테스트 9개는 amount=-1, 0, 49,999, 50,000, 100,000과 grade A/B, coupon true/false의 일부 조합만 검증한다. JaCoCo 결과 line coverage는 82%, branch coverage는 54%다. 팀은 line 80%를 넘었으므로 배포하자고 하고, QA는 최근 프로모션에서 49,999원 A등급 쿠폰 사용 시 쿠폰 2,000원이 적용되지 않아 47,499원이 청구된 버그를 발견했다. 배포 전 추가 테스트와 기준을 정해야 한다.

1. line coverage 82%인데 branch coverage 54%로 낮은 이유를 설명하고, 이 수치만으로 배포하면 안 되는 이유를 QA가 발견한 49,999원 버그와 연결지어 논하시오.

Read the worked answer

line coverage는 실행된 줄의 비율이고, branch coverage는 각 조건문의 true/false 결과가 모두 실행되었는지를 본다. 조건문이 있는 줄은 한쪽 결과만 실행해도 line coverage에는 100%로 계산될 수 있다. branch가 54%라는 것은 if/else, 등급 분기, coupon 분기 중 상당수의 반대쪽 경로가 실행되지 않았다는 뜻이다.

49,999원 A등급 쿠폰 버그는 amount < 50,000 경계와 coupon 적용 분기가 함께 검증되지 않았기 때문에 발생할 수 있다. 테스트가 함수를 호출해 예외 없이 지나갔더라도 반환값을 정확히 단언하지 않았다면 line coverage는 올라가고 결함은 남는다. 커버리지는 실행 여부만 말하고 정답 여부를 말하지 않으므로, 경계값 단언과 branch coverage, mutation test를 함께 봐야 한다.

2. calculateFee에 대해 추가해야 할 경계값 및 할인/쿠폰 조합 테스트를 최소 6개 설계하고, 각 기대값을 정수 원 단위 버림 정책으로 계산하시오.

Read the worked answer

원 미만은 버림으로 가정한다. 추가 테스트는 다음 7개가 필요하다.

입력 기대 결과
amount=-1, grade=A, coupon=false IllegalArgumentException
amount=0, grade=A, coupon=false 0원
amount=49,999, grade=A, coupon=false 47,499원
amount=49,999, grade=A, coupon=true 45,499원
amount=50,000, grade=A, coupon=true 43,000원
amount=2,000, grade=B, coupon=true 0원
amount=10,000, grade=B, coupon=true 7,700원

49,999원은 5% 할인 경계이고, 50,000원은 10% 할인 경계다. 2,000원 B등급은 3% 할인 후 1,940원에서 2,000원을 빼면 음수가 되므로 0원 clamp를 검증한다. 49,999원 쿠폰 케이스는 QA가 발견한 쿠폰 미적용 버그를 직접 재현한다. 버림 정책이 요구사항과 다르면 반올림 테스트도 별도로 추가해야 한다.

3. 이 결제 모듈의 배포 게이트를 어떤 기준으로 정해야 하는가? line coverage 80% 기준을 대체할 수 있는 기준과 그 이유를 제시하시오.

Read the worked answer

결제처럼 금액이 걸린 모듈은 line 80% 하나로 충분하지 않다. 변경된 코드의 branch coverage를 90% 이상, 가능하면 100%로 요구하고, 경계값·예외·clamp·반올림 케이스를 필수 목록으로 둔다. mutation score 80% 이상을 보조 지표로 삼으면 단언이 약한 테스트를 걸러낼 수 있다.

배포 게이트는 ① 변경 라인 branch coverage 기준 충족, ② 49,999/50,000/2,000원 경계 테스트 통과, ③ coupon true/false와 grade A/B/기타 조합 통과, ④ 결제 금액 단언이 있는 테스트만 인정, ⑤ P1/P2 결함 0건으로 구성한다. 커버리지 숫자보다 실패해야 할 테스트가 실제로 실패하는지를 확인하는 것이 핵심이다.