결정 커버리지(Decision Coverage)
태그 :
- 개념
- - Decision Coverage는 Code Coverage 분석의 7가지 척도 중 하나로써, 각 조건문이 True 혹은 False가 되는 조건이 모두 테스트되는 정도를 측정하는 척도 - 결정 커버리지는 결정 포인트(Decision points)내의 전체 조건식이 “true”과 “false”의 모든 값을 갖게 되어 모든 분기로 흐르면 달성 - 결정 테스팅은 결정 커버리지를 늘리기 위해 특정 조건문의 분기를 테스트하는 테스트 케이스를 도출하는 과정 - 결정 테스팅은 결정 포인트에 해당하는 제어흐름을 다루므로 흐름 테스팅의 한가지 형태 - 결정 테스팅을 수행할 때 제어흐름 또는 각 결정문(Decision)의 대체 흐름을 가시화하는데 사용 가능 - 결정 커버리지는 구문 커버리지 달성을 보장한다. 그러나 반대의 경우는 불성립 - 분기문 테스팅과 관련된 결정 커버리지는 테스트 케이스 스위트(Suite, 묶음)에 의해 실행된 조건문 분기(IF문의 참, 거짓)전체 가능한 분기의
1. 결정 커버리지(Decision Coverage)
- Decision Coverage는 Code Coverage 분석의 7가지 척도 중 하나로써, 각 조건문이 True 혹은 False가 되는 조건이 모두 테스트되는 정도를 측정하는 척도
- 결정 커버리지는 결정 포인트(Decision points)내의 전체 조건식이 “true”과 “false”의 모든 값을 갖게 되어 모든 분기로 흐르면 달성
- 결정 테스팅은 결정 커버리지를 늘리기 위해 특정 조건문의 분기를 테스트하는 테스트 케이스를 도출하는 과정
- 결정 테스팅은 결정 포인트에 해당하는 제어흐름을 다루므로 흐름 테스팅의 한가지 형태
- 결정 테스팅을 수행할 때 제어흐름 또는 각 결정문(Decision)의 대체 흐름을 가시화하는데 사용 가능
- 결정 커버리지는 구문 커버리지 달성을 보장한다. 그러나 반대의 경우는 불성립
- 분기문 테스팅과 관련된 결정 커버리지는 테스트 케이스 스위트(Suite, 묶음)에 의해 실행된 조건문 분기(IF문의 참, 거짓)전체 가능한 분기의 몇 퍼센트 인지를 측정하고 평가하는 것
2. 결정 커버리지 특징
1) 결정 커버리지는 구문커버리지 보다 강력하여 100%결정 커버리지 달성한 경우 100%구문커버리지를 보장함
2) 테스트 깊이가 깊을 수록 제품의 커버리지는 높아지나 테스트 케이스 수가 기하 급수적으로 많아져 비용, 시간, 리소스 등이 많이 소요된다.
3. 개념도
1) 모든 흐름을 한번씩 지나가는 테스트
-TC1 : (1,2,8,3,5,7)
-TC2 : (1,3,6,8,4,7)
2) (각 결정 포인트 간)흐름의 조합을 모두 지나가는 테스트
inflow |
outflow |
Combinations |
|
D1 |
1,8 |
2,3,4 |
(1,2) (1,3)(1,4)(8,2)(8,3)(8,4) |
D2 |
3 |
5,6 |
(3,5) (3,6) |
D3 |
2,5,6,4 |
7,8 |
(2,7)(5,7)(6,7)(4,7)(2,8)(5,8)(6,8)(4,8) |
-TC1 : (1,2,8,3,5,7) => (1,2)(2,8)(8,3)(3,5)(5,7) -삭제
-TC2 : (1,3,6,8,4,7) => (1,3)(3,6)(6,8)(8,4)(4,7) -삭제
-TC3 : (1,4,8,2,7) => (1,4)(4,8)(8,2)(2,7) -추가
-TC4 : (1,3,5,8,3,6,7) => (5,8)(6,7) -추가
3) 반복(LOOP)적인 흐름을 포함하는 모든 경우의 흐름을 고려한 테스트
inflow |
outflow |
Combinations |
|
D1 |
(1,2)(1,4) (8,2)(8,4) |
7,8 |
(1,2,7)(1,2,8)(1,3,5)(1,3,6)(1,4,7) (1,4,8)(8,2,7)(8,2,8)(8,3,5)(8,3,6) (8,4,7)(8,4,8) |
(1,3)(8,3) |
5,6 |
||
D2 |
(3,5)(3,6) |
7,9 |
(3,5,7)(3,5,8) (3,6,7)(3,6,8) |
D3 |
(2,7)(5,7) (6,7)(4,7) |
- |
(2,8,2)(2,8,3)(2,8,4)(5,8,2)(5,8,3)(5,8,4)(6,8,2)(6,8,3)(6,8,4) (4,8,2)(4,8,3)(4,8,4) |
(2,8)(5,8) (6,8)(4,8) |
2,3,4 |
신규로 추가된 level3 테스트
-TC5 : (1,2,7)
-TC6 : (1,4,7)
-TC7 : (1,2,8,4,8,3,5,7) => (2,8,4)(8,4,8)(4,8,3)
-TC8 : (1,2,8,2,8,3,5,8,4,7) => (2,8,2) (8,2,8)(5,8,4)
-TC9 : (1,3,5,8,2,7) => (5,8,2)
-TC10 : (1,4,8,4,7) => (4,8,4)
-TC11 : (1,3,6,8,2,7) => (6,8,2)
-TC12 : (1,3,6,8,3,5,7) => (6,8,3)
2. 샘플 소스코드
package codecoverage;
public class DecisionCoverageTest {
public int method(int param){
if(param > 0){
System.out.println("param is greater than 0");
}
else{
System.out.println("param is equal or less than 0");
}
return param;
}
}
이 소스 코드를 테스트하기 위한 Test Case를 다음과 같이 작성하였을 경우,
package codecoverage;
import junit.framework.TestCase;
public class DecisionCoverageTestCase extends TestCase {
public void testMethod1(){
DecisionCoverageTest decisionCoverageTest = new DecisionCoverageTest();
assertEquals(decisionCoverageTest.method(5), 5);
}
}
이 Test Case를 수행하는 경우, DecisionCoverageTest.method 내의 if 문 조건 중, True인 조건만을 만족하기 때문에, Decision Coverage 기준에 의한 Coverage가 100%를 만족하지 못한다.
다음 결과를 보면
위와 같이, TestCase에서 method에 대한 Test Case 작성 시, 파라미터 값이 5에 대한 Test Case만을 작성하는 경우, if 내의 참인 조건 만 Test가 수행되게 된다. 그 결과로써, Decision Coverage는 다음과 같다.
이 분석 결과를 100%로 하기 위해서는 다음과 같이 Test Case를 추가할 수 있다.
package codecoverage;
import junit.framework.TestCase;
public class DecisionCoverageTestCase extends TestCase {
public void testMethod1(){
DecisionCoverageTest decisionCoverageTest = new DecisionCoverageTest();
assertEquals(decisionCoverageTest.method(5), 5);
}
public void testMethod2(){
DecisionCoverageTest decisionCoverageTest = new DecisionCoverageTest();
assertEquals(decisionCoverageTest.method(0), 0);
}
}
이 경우, 두 개의 Test Case에 의해, if 내의 조건의 True인 경우와 False인 경우가 모두 테스트되기 때문에, Decision Coverage를 100%를 달성할 수 있다. 결과를 보면,
위와 같이 Decision Coverage에 따른 Code Coverage가 100%가 됨을 알 수 있다.
이와 같이, Decision Coverage의 경우, Statement Coverage 보다는 좀 더, 상세한 Test Case가 필요하며, 소프트웨어가 실행될 때의 각 상태에 따른 수행 경로를 좀 더 상세하게 테스트할 수 있다.