조건 테스트는 프로그램 내의 개별 조건식(논리적 조건)이 true와 false 값을 모두 가질 수 있도록 테스트 케이스를 설계하는 방법입니다. 조건식의 각 결정 포인트에서 모든 가능한 결과를 테스트하는 데 중점을 둡니다.
분기 테스트는 프로그램의 제어 흐름 내에서 발생하는 각 분기(branch)가 적어도 한 번은 실행되도록 테스트 케이스를 설계하는 방법입니다. 코드의 모든 가능한 경로(path)가 실행되는 것을 보장하기 위한 테스트입니다.
다음과 같은 코드가 있다고 가정해 봅시다:
public void processOrder(boolean isPremiumCustomer, int orderAmount) {
if (isPremiumCustomer && orderAmount > 1000) {
applyDiscount(20);
} else if (orderAmount > 500) {
applyDiscount(10);
} else {
applyDiscount(0);
}
}
조건 테스트에서는 다음 조건들을 독립적으로 테스트합니다:
isPremiumCustomer가 true일 때isPremiumCustomer가 false일 때orderAmount > 1000이 true일 때 orderAmount > 1000이 false일 때orderAmount > 500이 true일 때orderAmount > 500이 false일 때분기 테스트에서는 다음 분기들을 테스트합니다:
isPremiumCustomer && orderAmount > 1000가 true일 때 (첫 번째 if 블록)orderAmount > 500이 true일 때 (else if 블록)조건 커버리지는 각 조건식이 true와 false 값을 모두 가질 수 있도록 보장합니다. 100% 조건 커버리지를 달성하기 위해서는 각 조건식이 독립적으로 true와 false 값을 가져야 합니다.
분기 커버리지는 모든 제어 흐름 분기가 적어도 한 번은 실행되는 것을 보장합니다. 100% 분기 커버리지를 달성하기 위해서는 각 분기점(if, else, while 등)에서 모든 가능한 경로가 실행되어야 합니다.
예를 들어, if (A && B) 구문에서:
조건 테스트와 분기 테스트의 한계를 극복하기 위해 수정 조건/결정 커버리지(Modified Condition/Decision Coverage, MC/DC)와 같은 보다 강력한 테스트 기법이 사용됩니다.
MC/DC는 다음을 요구합니다:
| 비교 항목 | 조건 테스트(Condition Testing) | 분기 테스트(Branch Testing) |
|---|---|---|
| 테스트 대상 | 개별 논리적 조건식 | 코드 흐름의 분기점 |
| 커버리지 유형 | 조건 커버리지(Condition Coverage) | 분기 커버리지(Branch Coverage) |
| 테스트 초점 | 조건식의 개별 요소 | 전체 결정에 따른 제어 흐름 |
| 테스트 케이스 수 | 일반적으로 더 많음 | 일반적으로 더 적음 |
| 단축 평가 고려 | 직접적으로 고려하지 않음 | 고려함 |
| 결함 발견 효율 | 논리적 오류에 효과적 | 제어 흐름 오류에 효과적 |
| 구현 복잡성 | 비교적 높음 | 비교적 낮음 |
조건 테스트와 분기 테스트는 컴퓨터 프로그램이 올바르게 작동하는지 확인하는 두 가지 방법이에요.
조건 테스트는 "만약 비가 오고 바람이 분다면"이라는 문장에서 "비가 오는지"와 "바람이 부는지"를 각각 따로 확인하는 방법이에요. 이 방법은 모든 날씨 상황을 꼼꼼하게 확인할 수 있어요.
분기 테스트는 "비가 오고 바람이 불면 우산을 가져가고, 아니면 그냥 나가자"라는 결정에서 '우산을 가져가는 경우'와 '그냥 나가는 경우' 두 가지 경로를 모두 확인하는 방법이에요. 이 방법은 우리가 할 수 있는 모든 선택을 확인할 수 있어요.
두 방법은 모두 프로그램이 제대로 작동하는지 확인하는 중요한 방법이지만, 서로 다른 부분을 확인하기 때문에 둘 다 사용하면 더 완벽하게 테스트할 수 있답니다!