Skip to content
난이도 출제 빈출문제은행 6

화이트박스 테스트와 커버리지 ​

화이트박스 테스트(white-box testing)는 소스 코드의 내부 구조와 논리 흐름을 보고 테스트 케이스(test case)를 설계하는 방법이다. 테스트가 코드의 문장·분기·조건을 얼마나 거쳤는지의 비율을 커버리지(coverage)라고 한다. 실기 시험은 커버리지 종류의 정의를 단답형으로 묻고, 순환 복잡도(cyclomatic complexity)를 제어 흐름 그래프(control flow graph)에서 계산하게 한다.

화이트박스 테스트의 종류 ​

기초 경로 검사(basis path testing)는 맥케이브(Thomas McCabe)가 제안한 대표 기법으로, 논리적 복잡도를 재서 그 수만큼의 독립 경로를 지나도록 테스트 케이스를 만든다. 제어 구조 검사(control structure testing)는 논리 조건을 보는 조건 검사(condition testing), 반복문을 보는 루프 검사(loop testing), 변수의 정의와 사용 위치를 따라가는 데이터 흐름 검사(data flow testing)로 나뉜다.

커버리지 종류 ​

커버리지는 "무엇을 한 번 이상 실행했는가"의 기준에 따라 이름이 달라진다. 시험은 이것을 화이트박스 테스트의 검증 기준이라 부르며 문장 검증 기준, 결정 검증 기준처럼 적는다. 아래 구문 커버리지(statement coverage)가 곧 문장 검증 기준이다. 결정(decision)은 if (A && B) 전체 조건식이고, 조건(condition)은 그 안의 A, B 같은 개별 조건식이다.

커버리지한 번 이상 만족시킬 것A && B 최소
문장(구문)모든 문장을 실행1
결정(분기)모든 결정의 참과 거짓2
조건모든 개별 조건의 참과 거짓2
조건/결정결정과 조건 커버리지를 둘 다2
변경 조건/결정각 조건이 결정을 독립적으로 바꿈3
다중 조건개별 조건의 모든 조합4

오른쪽 열은 if (A && B) 하나에 필요한 최소 테스트 케이스 수다(두 조건을 모두 평가한다고 가정).

구문 커버리지(statement coverage)는 가장 약하다. if (a > 0) y = 1;은 a = 5 하나로 모든 문장을 지나지만 거짓 분기는 안 가 본다. 결정 커버리지(decision coverage)는 분기 커버리지(branch coverage)라고도 하며 구문 커버리지를 포함한다.

조건 커버리지(condition coverage)는 결정 커버리지를 보장하지 않는다. A && B에서 (A=참, B=거짓)과 (A=거짓, B=참)을 쓰면 A와 B가 각각 참·거짓을 다 가져 조건 커버리지는 채우지만, 결정은 두 번 다 거짓이다. 둘을 합친 것이 조건/결정 커버리지(condition/decision coverage)다.

변경 조건/결정 커버리지(MC/DC, Modified Condition/Decision Coverage)는 조건마다 "그 조건만 바꿨을 때 결정이 바뀌는" 쌍을 요구하며, 항공처럼 안전이 중요한 분야에서 쓴다. 다중 조건 커버리지(multiple condition coverage)는 모든 조합이라 조건이 n개면 2ⁿ개가 필요하다.

A && B의 MC/DC는 (T,T)·(T,F)·(F,T) 세 개로 채우며, 조건이 n개면 보통 n+1개다. 포함 관계는 다중 조건 커버리지가 MC/DC를, MC/DC가 조건/결정 커버리지를, 조건/결정이 결정을, 결정이 구문 커버리지를 차례로 포함하는 순서다.

순환 복잡도 ​

순환 복잡도는 제어 흐름 그래프(control flow graph, 프로그램의 문장과 분기를 노드와 화살표로 그려 실행 순서를 나타낸 그림)에서 서로 독립인 경로의 수다. 이 값이 기초 경로 검사의 테스트 케이스 수 기준이 되고, 값이 크면 복잡한 코드라는 신호다. 그래프의 화살표(간선) 수를 E, 노드 수를 N이라 하면 V(G) = E − N + 2다. 같은 값을 결정 노드 수 + 1, 또는 그래프가 나누는 영역 수(바깥 영역 포함)로도 구한다.

예로 if (a > 0) x = 1;, while (i < n) i++;, if (b) y = 1; 세 줄을 차례로 실행하는 코드를 보자.

이 코드를 노드 8개(시작, 세 결정, 세 실행문, 끝)와 간선 10개로 그리면 V(G) = 10 − 8 + 2 = 4이고, 결정 3개 + 1로도 4다. 기초 경로 검사로는 독립 경로 4개를 시험한다.

시험 포인트 ​

  • 답안 이름은 문장·결정·조건·조건/결정·변경 조건/결정·다중 조건 검증 기준(또는 영문 Statement Coverage 등).
  • "모든 결정의 참·거짓을 한 번 이상" → 결정(분기) 커버리지. "개별 조건식의 참·거짓" → 조건 커버리지. "각 조건이 결과에 독립적으로 영향" → 변경 조건/결정 커버리지(MC/DC). "모든 조합" → 다중 조건 커버리지.
  • V(G) = E − N + 2 = 결정 수 + 1 = 영역 수. 답은 숫자만 쓴다.

관련 문서