소프트웨어 테스팅
조건이 정말 많을 경우 어떤 값을 테스트하면 좋을까요? 중요한 조건의 조합만 테스트해보면 효과적일 텐데 말이죠. 이럴 때 사용하는 변형 조건/결정 커버리지 기법에 대해 알아보겠습니다. 이해하기 쉽도록 and 조건을 사용해서 예시 코드를 만들어보겠습니다.
사용자가 입력한 a, b, c값 모두 0보다 크면 'MC/DC커버리지'가 출력되어야 합니다. MC/DC커버리지가 정상 출력되는지 확인하려면 총 몇 개의 TC가 필요할까요?
3개 조건에서는 위와 같이 8개의 TC가 필요합니다. 그런데 만약에 조건이 5개면 몇 개의 TC가 필요할까요? 2의 5승만큼 필요하므로 32개가 필요합니다. 만약 조건이 10개라면 어떻게 될까요? 1024개 TC가 필요하겠네요.
이처럼 조건이 1개씩 늘어날 때마다 TC는 2의 n승만큼 증가하기 때문에 테스트 커버리지 100%를 달성하기엔 사실상 불가능한 수준인데요. 이처럼 조건이 많을 때 굳이 테스트하지 않아도 괜찮은 TC를 제거하면서도 테스트 커버리지를 높이고자 할 때 활용하는 것이 바로 MC/DC 커버리지입니다.
MC/DC 커버리지의 핵심은 각 개별 조건이 다른 개별 조건에 영향을 받지 않으면서 전체 조건식의 결과 값에 독립적으로 영향을 주는 조건을 MC/DC 테스트 커버리지로 선정하는 것입니다. 예시를 살펴보겠습니다.
위 예시는 조건이 3개일 때 검증 필요한 테스트 케이스 개수입니다. 8개가 나왔죠? 이 상태에서 MC/DC 커버리지 기법을 적용해보겠습니다. 우선 B/C 조건은 변함이 없으면서 A 조건만 바꿨을 때 결괏값이 바뀌는 케이스를 찾아보겠습니다. 1번이겠죠? T/T/T에서 F/T/T는 F이기 때문입니다. MC/DC 커버리지 달성을 위해 필요한 1개의 TC를 찾았습니다. 이와 같은 방식으로 쭉 찾아보면 아래와 같습니다.
3개의 조건을 가진 로직에서 MC/DC 커버리지를 활용하지 않는다면 8개의 테스트 케이스를 확인해야 합니다. 하지만 MC/DC 커버리지 기법을 활용할 경우 4개의 테스트 케이스만 확인하면 됩니다.
A 조건에서 1번과 5번의 값이 변경될 경우 결과 값이 바뀌었고 B 조건은 3번의 F가 T가 될 경우 전체 결과가 T로 바뀌었습니다. 마지막으로 C 조건에서는 2번의 F 조건이 T로 변경될 경우 전체 값이 F에서 T로 바뀌는 것을 확인할 수 있습니다. 이로써 4번, 6번, 7번, 8번 TC는 테스트 진행해도 크게 의미가 없을 수 있다는 점을 확인했습니다.
MC/DC는 결과에 독립적으로 영향을 주는 개별 조건식을 골라내야 해서 적용하기가 꽤나 까다로운 단점이 있지만, 많은 조건이 있는 상황에서 테스트 케이스를 효율적으로 제거하고 최소한의 테스트 케이스로 테스트 커버리지를 높일 때 활용하는 기법입니다.