결정 커버리지(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가 필요하며, 소프트웨어가 실행될 때의 각 상태에 따른 수행 경로를 좀 더 상세하게 테스트할 수 있다.

 

댓글