🎃

CMakeでGoogleTestする最小構成

2024/01/28に公開

想定読者

  • vscode + CMake + C++ + GoogleTestの環境を作りたい人
  • いいからさっさとテンプレをパクらせてほしい人

リポジトリ

https://github.com/zwire/cmake_test_template

解説

こちらのエントリーの続きになります。

https://zenn.dev/zwire/articles/b8098da2bf4803

テンプレのようにこんな感じのディレクトリ構成をとりましょう。

project_root
  - CMakeLists.txt -- (i)
  - lib
    - CMakeLists.txt -- (ii)
    - include
      - calc.h
    - src
      - calc.cpp
  - tests
    - CMakeLists.txt -- (iii)
    - test_mylib.cpp

さて、ここでCMakeLists.txtが3つ出てきますね。
(ii)はただのライブラリなので、テストの有無とは無縁です。
(i)と(iii)でテストなりの記述をする必要があります。

cmake_minimum_required(VERSION 3.12)

project(cmake_test_template)

enable_testing()

add_subdirectory(lib)
add_subdirectory(tests)
include(FetchContent)
FetchContent_Declare(
  googletest
  URL https://github.com/google/googletest/archive/refs/tags/v1.14.0.zip
)

if (WIN32)
  set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
endif()
FetchContent_MakeAvailable(googletest)

file(GLOB_RECURSE TESTS test_*.cpp)
foreach(test ${TESTS})
  get_filename_component(target ${test} NAME_WE)
  add_executable(${target} ${test})
  target_link_libraries(${target} gtest_main lib)
  target_include_directories(${target} PRIVATE ../lib/include)
  include(GoogleTest)
  gtest_discover_tests(${target})
endforeach()

あまり深く考えずにこのまま使っていただければと思います。
実装によって変わるのはtarget_link_libraries()、target_include_directories()のあたりだけかなと思います。
テストを記述するcppファイルには"test_"接頭辞をつけましょう。それでGLOBするようにしています。

次はテストコードの方ですね。自作の四則演算コードに対して、こんな感じで書いています。

#include "gtest/gtest.h"
#include "calc.h"

TEST(test_calc, add) {
  EXPECT_EQ(1.0, my_add(0, 1));
  EXPECT_EQ(6.0, my_add(3, 3));
  EXPECT_EQ(-9.0, my_add(-12, 3));
}

TEST(test_calc, sub) {
  EXPECT_EQ(4.0, my_sub(5, 1));
  EXPECT_EQ(1.0, my_sub(4, 3));
  EXPECT_EQ(-10.0, my_sub(-6, 4));
}

~~ 以下略 ~~

初っ端の#include "gtest/gtest.h"と、TEST() / TEST_F()の書き方さえ覚えればOKです。
細かいことは調べれば出てくるので割愛します。

vscodeでこれができたら、ビルド後にCTestとして実行できるようになります。
前回のエントリーで述べたようにIDEとしてデバッグもでき、結果も見やすいので個人的にはコマンドラインで走らせるより好きです。
image.png

参考サイト

http://opencv.jp/googletestdocs/

https://qiita.com/utkamioka/items/cacb1001bd2abf605b15

https://mickey-happygolucky.hatenablog.com/entry/2021/02/04/005424

Discussion