ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [소프트웨어 공학] Code Coverage(코드 커버리지)란 무엇인가?
    Computer Science/Software Engineering 2020. 6. 12. 09:17

    Coverage란, 소프트웨어를 테스팅하는 데 사용되는 중요한 지표중 하나로, 보통 Code가 얼마나 실행되었느냐를 측정합니다.

     

    보통 Coverage를 측정하기 위해서 instrumentation을 합니다. Instrumentation은 많은 경우 작성된 코드가 실행되는 지를 확인하는 코드를 작성된 코드 사이사이에 삽입하는 것을 말합니다. 

     

    Coverage에는 종류가 굉장히 많습니다. 많은 사람들이 어떻게하면 잘 Testing을 하면 좋을지를 측정하기 위해서 여러 방식을 사용하고 있는데요,
    그 중에 기본적이고 대표적인 Coverage 5가지를 소개하겠습니다.

     

    1. Function coverage 
    - Whether the functions in the program is called at least once

    Function coverage는 어떤 function이 최소한 한 번은 실행되었는 가를 측정합니다. Function call을 했는지만을 확인하기 때문에 해당 function 안의 모든 코드가 실행되었는 지는 확인할 수 없습니다. 

    2. Statement coverage (line coverage, segment coverage)
    - Whether each statement in the program is executed

    -Statement coverage는 각 statement가 실행되었는 지를 측정합니다. 즉, 각 라인이 실행가능한 statement라면 해당 라인이 실행되었는 지를 확인합니다.
    -장점 : object code에 바로 적용이 될 수 있다.
    -단점 : 특정 조건분기문에서 에러를 찾아내지 못할 가능성이 있다.
    아래와 같은 경우 condition이 false면 null pointer error가 난다. 이런 경우는 statement coverage를 사용하여 해당 부분을 테스트 할 경우 coverage가 달성되었다고 하겠지만, 모든 경우를 test 했다고 보장할 수 없다.
    int *p = NULL;
    if(condition)
       p = &a;
    *p = 123;
    

     

    3. Branch coverage (decision coverage, all-edges coverage)
    - Whether each branch of each control structure is executed

    -Branch coverage는 각 조건분기문의 Boolean expression이 참/거짓으로 모두 실행되었는 지를 측정합니다. 조건분기문에 있는 전체 Boolean expression은 참 혹은 거짓의 predicate로 생각합니다.
    예를 들자면 If(condition1 || condition2 || condition3) 와 같은 if문에서 전체 조건문이 참인 경우, 거짓인 경우 2가지 경우만을 따져봅니다.  

    -장점 : Statement coverage가 가지고 있는 단점을 보완하면서 Coverage 중 비교적 간단한 편입니다.
    -단점 : 위에서와 같이 전체 Boolean expression을 하나의 참 혹은 거짓의 predicate으로 보기 때문에 조건문 전체를 모두 확인해보지 않습니다. 그럴 경우 아래의 예와 같은 경우가 발생하게 됩니다. condition2가 참이 되는 순간 function ()을 실행하지 않기 때문에 function()이 test 되지 않는 경우가 발생하게 됩니다.
    if(condition1 && (condition2 || function()))

     

    4. Condition coverage
    - Whether each Boolean sub-expression evaluated both true and false

    Condition coverage는 Branch Coverage와 비슷한데, Branch Coverage의 단점을 보완하여, 조건 분기문에 있는 모든 expresion들의 참 혹은 거짓을 모두 확인해봅니다.
    예를 들어, 다음과 같은 조건문이 있다면 if(condition1 || condition2 && condition3) 
    condition1, condition2, condition3가 각각 모두 true/false인 경우를 확인합니다. 

    5. Path coverage(Predicate coverage)
    - Whether every path is executed at least once. (all linearly independent paths)

    -Path coverage는 각 function에서 가능한 모든 Path를 실행해봤는지를 확인합니다. 이 때 loop는 일정한 수의 반복까지만을 측정합니다. 
    *여기서 Path란? function의 entry부터 exit까지에 존재하는 일련의 연속된 branch들을 뜻한다. 각 path는 unique하다.

    -장점 : 굉장히 엄밀한 테스팅이 가능합니다.
    -단점 : Path의 숫자가 굉장히 많습니다.

     

    Coverage를 공부하면서 대해 정리를 해보았습니다. 틀린 부분이 있거나 오타가 있다면 댓글로 지적해주시기 바랍니다:)

     

    출처 :
    https://confluence.atlassian.com/clover/about-code-coverage-71599496.html
    https://www.codegrip.tech/productivity/everything-you-need-to-know-about-code-coverage/
    https://www.guru99.com/test-coverage-in-software-testing.html

    https://www.bullseye.com/coverage.html#basic_path

    댓글

Designed by Tistory.