🎃
CMakeでGoogleTestする最小構成
想定読者
- vscode + CMake + C++ + GoogleTestの環境を作りたい人
- いいからさっさとテンプレをパクらせてほしい人
リポジトリ
解説
こちらのエントリーの続きになります。
テンプレのようにこんな感じのディレクトリ構成をとりましょう。
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としてデバッグもでき、結果も見やすいので個人的にはコマンドラインで走らせるより好きです。
参考サイト
Discussion