サブロウ丸

Sabrou-mal サブロウ丸

主にプログラミングと数学

master mind by c++; part12 coverage test

今回やること

カバレッジテスト

カバレッジテスト

カバレッジ(coverage)テストとは

テスト関数が全ての関数,if分岐をカバーしているのかをテストします. googletestでcoverageテストを行えるのでそれを導入してみます.

コンパイルオプション

--coverageを追加します.

add_executable(
  utest
  test.cpp
  )

target_include_directories(
  utest PRIVATE
  ${PROJECT_SOURCE_DIR}/src
  )

target_compile_options(
  utest PRIVATE
  -Wall
  -g
  --coverage  # 追加!!
  )

target_compile_features(
  utest PRIVATE
  cxx_std_17
  )

target_link_libraries(
  utest PRIVATE
  gtest
  gtest_main
  pthread
  )

target_link_options(
  utest PRIVATE
  -g
  --coverage  # 追加!!
)

add_custom_target

カバレッジテストを実行するには, プログラムのコンパイル後に色々コマンドが必要ですが, それをまとめてCMakeLists.txtに書くとこうなります. add_custom_targetにて一連のコマンドをまとめています. ( 参考: CMake: カスタムターゲットによるグループ化 - Qiita )

cmake_minimum_required(VERSION 3.1)
project(MasterMind CXX)

... ( 中略 ) ...

# add mastermind and test
add_subdirectory(src)
add_subdirectory(test)

# test
enable_testing()
add_test(
  NAME utest
  COMMAND utest
  )

# coverage test
add_custom_target(
  coverage
  DEPENDS utest  # 依存するターゲット名
  WORKING_DIRECTORY ${CMAKE_BINARY_DIR}  # カスタムターゲットの動作ディレクトリ
  COMMAND ctest  # 以下コマンド
  COMMAND lcov -d test/CMakeFiles/utest.dir/ -c -o coverage.info > lcov.log 2>&1
  COMMAND lcov -e coverage.info ${PROJECT_SOURCE_DIR}/src/* -o filtered_coverage.info >> lcov.log 2>&1
  COMMAND genhtml -o lcovHtml --num-spaces 4 -s --legend filtered_coverage.info >> lcov.log 2>&1
  COMMENT [[create coverage report as lcovHtml/index.html, and log as lcov.log]]
  )

実行

$ cd build && cmake .. && make

その後

$ make coverage
$ open lcovHtml/index.html

f:id:inarizuuuushi:20210619111031p:plain

こんな感じ, 全て100%が理想です.

まとめ

coverageテストを導入しました. CMakeのadd_custom_target機能を用いて, 一連の処理をコマンド化しました.

コード

参考

他の記事