GoogleTest + CMake로 C++의 실용적인 단위 테스트 환경 구축 : 그 2 (커버리지 표시)

배경과 목적



지난번 다음 기사입니다.

아래에 해당합니다.

배경과 목적


  • ⑦ 커버리지를 행 단위로 표시할 수 있는 것(별도 기재 예정)

  • 지난번 은 단위 테스트 실행 환경을 구축하는 것만으로 끝났지만, 그 외에도
    HTML 커버리지 보고서를 출력할 수 있습니다.

    샘플 코드



    본 기사는 최소한의 샘플 코드를 따라가면 목적을 달성할 수 있게 되어 있습니다.
    그렇다고 해도 코드 쪽에 자세한 코멘트를 기술하고 있는 것은 아니기 때문에, 간단하게 해설을 아래에 기술합니다.
    샘플 코드는 여기

    시험 환경


  • os: Ubuntu 16.04 LTS
  • tool: gcc-5.4.0, cmake-3.10.2, lcov-1.12
  • lcov가 설치되어 있다고 가정합니다.
  • lcov의 설치 방법 예 (다른 방법도 있다고 생각합니다) :

  • $ mkdir ~/tmp
    $ wget https://github.com/linux-test-project/lcov/releases/download/v1.12/lcov-1.12.tar.gz -O ~/tmp/lcov-1.12.tar.gz
    $ tar xfz ~/tmp/lcov-1.12.tar.gz -C ~/tmp/
    $ cd ~/tmp/lcov-1.12
    $ sudo make install
    

    해설



  • 지난번 과의 차이를 설명합니다.
  • 우선, test측의 빌드 옵션에 「--coverage」를 추가합니다.
  • 이 옵션은 gcov에 대한 파일을 출력하는 옵션으로 build/test/CMakeFiles/UnitTestExecutor.dir 아래에 .gcno라는 파일을 생성합니다.
  • 이 옵션은, 컴파일시에는 「-fprofile-arcs -ftest-coverage」, 링크시에는 「-lgcov」에 붙여 주는 편리한 것입니다.


  • test/CMakeList.txt
    set(CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} --coverage") # 追加
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage") # 追加
    
    set(MY_SRCS_MINUS_MAIN ${MY_SRCS})
    list(REMOVE_ITEM MY_SRCS_MINUS_MAIN ${PROJECT_SOURCE_DIR}/src/main.cpp)
    
    # [以下、省略]
    
    
  • 빌드( 지난번 참조)
  • 다음에 테스트를 실행하고 나서 커버리지 결과를 html로 출력하기까지의 순서입니다만,
  • ①테스트 실행
  • ②lcov(gcov)로 커버리지 해석
  • ③불필요한 정보 삭제
  • ③html 생성

  • 절차를 스크립팅하면이 느낌입니다

  • runtest.sh
    # run test to output gcov files
    cd build/test
    ./UnitTestExecutor
    
    # make coverage data 
    cd CMakeFiles/UnitTestExecutor.dir
    lcov -d . -c -o coverage.info
    
    # remove unnecessary file paths
    lcov -r coverage.info */googletest/* test/* */c++/* -o coverageFiltered.info
    
    # make html report
    genhtml -o lcovHtml --num-spaces 4 -s --legend coverageFiltered.info
    
  • 테스트를 실행하면 gcno 파일이 있던 디렉토리에 gcda 파일이 출력됩니다.
  • 다음에 lcov를 실행하면 내부적으로 gcov가 실행되어 커버리지 해석되어 html화하기 위한 정보가 생성됩니다.
  • 그대로는 외부 프로젝트, test 코드, C++ 표준 라이브러리등의 결과도 포함되어 있으므로, 필요에 따라서 제거합니다.
  • 필요한 것만 추출하는 방법 (-e 옵션)도 있습니다. 자체 프로젝트의 소스 파일에는 접두사를 붙이는 규약이 있으면, 이런 경우에 도움이 됩니다.
  • genhtml에서 html을 생성합니다. lcovHtml이라는 폴더가 생성되고 거기에 html 파일이 저장되어 종료됩니다.
  • 옵션이 최소화되었습니다.

  • 덧붙여서, 참고 사이트에도 쓰고 있습니다만, 작업 디렉토리를 어디로 하고, 어디에 파일을 출력하면 되는지, 라고 하는 곳에서 빠지기 쉬운 생각이 듭니다.
  • 실행하면
  • $ ./runtest.sh
    
  • 결과는 build/test/CMakeFiles/UnitTestExecutor.dir/lcovHtml에 출력되고 index.html을 열면 안전하게 커버리지 결과를 표시해야합니다.
  • 그렇다고해도, 이 디자인, 좀 더 모던하게 하는 방법 없습니까. . .






  • 참고 사이트


  • htp://d. 하테나. 네. jp/쿠마메/20090721/p1
  • 좋은 웹페이지 즐겨찾기