ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [소프트웨어 공학]gcov:테스트 커버리지 측정
    Computer Science/Software Engineering 2020. 6. 13. 14:44

    gcov는 코드 커버리지를 측정하기 위해 사용하는 프로그램입니다.

    코드 커버리지에 대한 내용은 여기서 간단하게 알 수 있습니다.

    gcov는 아래와 같은 것을 알려줍니다.
    - 각 라인의 코드가 얼마나 자주 실행되었는 지

    - 정확히 어떤 라인의 코드가 실행되었는 지

    - 특정 부분의 코드를 실행하는 데 얼마나 시간이 걸렸는 지(gprof와 함께) 


    위와 같은 정보를 활용하여 코드 커버리지를 측정할 수 있는데요, 구체적으로 gcov는 다음과 같이 사용할 수 있습니다. 

    Gcov Usage Flow

    1. gcc의 특정 flag와 함께 테스트하고자하는 프로그램을 컴파일
       - -fprofile-arcs -ftest-coverage
       - .gcda , .gcno 파일 생성

    2. 테스트하고자 하는 프로그램을 실행
       - .gcda 파일에 실행한 프로그램의 커버리지 정보가 저장됨

    3. gcov 프로그램을 사용하여 커버리지 정보를 분석
       - gcov options

    4. (Optional)gcovr, lcov 등의 프로그램을 사용하여 분석된 정보를 시각화

     

    1. gcc의 특정 flag와 함께 테스트하고자하는 프로그램을 컴파일

    gcc를 이용하여 특정 flag와 함께 컴파일시 해당 코드에 대한 데이터를 담고 있는 파일들을 생성합니다.

    어떤 Option을 사용하나요? https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html 

    아래와 같은 option을 사용합니다. (더 자세한 내용을 알고 싶으시다면 위의 링크를 참고해주세요.)

    -fprofile-arcs

    이 flag와 함께 컴파일된 프로그램을 실행할 때 각 branch와 call이 얼마나 실행되었는지, return을 하였는지 기록합니다. 이 데이터는 *.gcda 파일에 저장이 됩니다.

    -ftest-coverage
    이 flag와 함께 컴파일이 되면, gcov프로그램이 프로그램의 coverage를 보여줄 때 사용할 수 있는 파일인 *.gcno 파일을 생성합니다. 

     

    --coverage

    이 flag는 -fprofile-arcs -ftest-coverage 두 flag를 사용한 것과 같습니다. 

     

    * 위와 같은 instrumentaion을 진행할 때는 Code의 Optimization을 하지 않으셔야 더 정확한 정보를 얻을 수 있습니다.

    * .gcda .gcno 파일은 binary파일로 직접 사용하지 말고 gcov를 사용해서 커버리지 정보를 얻는 것을 권합니다.

    gcc -O0 -fprofile-arcs -ftest-coverage a.c

    2. 테스트하고자 하는 프로그램을 실행

    위의 flag를 사용하여 compile한 프로그램을 실행시 .gcda 파일에 해당 프로그램의 커버리지 정보가 저장됩니다.

    이 때, 커버리지 정보는 프로그램은 실행할 때마다 누적하여 저장됩니다.

     

    3. gcov 프로그램을 사용하여 커버리지 정보를 분석

    gcov를 실행하면 위의 .gcda, .gcno파일을 활용하여 *.gcov 파일을 생성해줍니다. .gcov파일은 해당 프로그램의 커버리지 정보를 담고 있습니다.

    gcov files [options]

     

    gcov 프로그램의 실행 gcov a.c -bc
    a.c.gcov 파일의 내용

    위와 같이 실행한 프로그램에서 어떤 라인의 코드가 실행되었는 지를 기록해 줍니다.

     

    gcov를 실행할 때도 여러가지 option을 줘서 정보를 얻을 수 있습니다. ( 모든 option들을 알고 싶으시면 위의 링크를 확인하거나 man page를 활용하시기 바랍니다.)

     

    gcov의 여러 option들

    -a | --all-blocks
    각 basic block 마다 실행 횟수를 출력해줍니다. 보통 gcov는 main block의 실행 횟수만을 출력해줍니다.

    -a option이 없을 때
    -a option을 사용하였을 때

    -b | --branch-probabilities

    각 branch의 실행 횟수를 %로 나타내줍니다.

    -c | --branch-counts

    각 branch의 실행 횟수를 count로 나타내줍니다.

    -i | --intermediate-format

    gcov 파일을 parsing하기 편한 형식으로 나타내줍니다.

    -bci 옵션을 줬을 때

     

    4. (Optional)gcovr, lcov 등의 프로그램을 사용하여 분석된 정보를 시각화

    gcov를 통해 얻은 정보를 이용하여 모두 통합하여 html, xml, json 등 여러 형식으로 파싱하기 좋은 형태로 만들고, 커버리지를 시각화 하는 프로그램이 있는데요, 해당 프로그램을 사용하면 보다 보기 좋은 커버리지 정보를 얻을 수 있습니다.

    - gcovr

    gcovr은 python을 기반으로 이루어진 프로그램으로, html, xml, json 등의 형식으로 커버리지 정보를 파싱해줍니다. 

    https://gcovr.com/en/stable/guide.html

     

    Gcovr User Guide — gcovr 4.2 documentation

    alex43dm, Andrew Stone, Arvin Schnell, Attie Grande, Bernhard Breinbauer, Carlos Jenkins, Cezary Gapiński Christian Taedcke, Dave George, Dom Postorivo, goriy, ja11sop, James Reynolds, Jeremy Fixemer, Jessica Levine, Joel Klinghed, John Siirola, Jörg Kre

    gcovr.com

    -lcov

    lcov는 gcov를 통해 얻은 정보를 html형식으로 커버리지 정보를 시각화 할 수 있는 프로그램입니다.

    http://ltp.sourceforge.net/coverage/lcov.php

     

    Linux Test Project - Coverage » lcov

    LCOV - the LTP GCOV extension About LCOV LCOV is a graphical front-end for GCC's coverage testing tool gcov. It collects gcov data for multiple source files and creates HTML pages containing the source code annotated with coverage information. It also adds

    ltp.sourceforge.net

     

    lcov User manual page

    http://ltp.sourceforge.net/coverage/lcov/lcov.1.php

     

    Linux Test Project - Coverage » lcov

      Last modified on: March 04, 2019 - 11:57:26 UTC.

    ltp.sourceforge.net

     

    오늘은 gcov의 사용법에 대해 알아보았습니다. 제가 올린 부분 뿐만아니라 여러 option들을 사용하여 본인이 필요한 상황에 맞게 사용하시면 될 것 같습니다. 혹시 틀린 부분이나 헷갈리는 부분이 있으면 댓글로 남겨주세요:)

    댓글

Designed by Tistory.