C++のプロジェクトにGoogleTestを導入する最小限の手順を紹介する。
GoogleTestでは凝ったことをやり始めるといくらでも複雑なことができるが、この記事では「小規模なcmakeプロジェクトに最小限の手間で導入する」ことを目指す。
参考: http://google.github.io/googletest/quickstart-cmake.html
cmakeプロジェクトの設定
以下のような雛形から始めるのが良い。
cmake_minimum_required(VERSION 3.14)
project(my_project)
# GoogleTest requires at least C++14
set(CMAKE_CXX_STANDARD 14)
include(FetchContent)
FetchContent_Declare(
  googletest
  URL https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip
)
# For Windows: Prevent overriding the parent project's compiler/linker settings
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(googletest)
- C++14以降は必須
 - 
FetchContent_Declare(...)FetchContent_MakeAvailable(googletest)で指定したURLから依存パッケージをダウンロードし利用可能にする。事前にgoogleTestをインストールする必要はない。 
ユニットテストコードの実装
以下のようにhello_test.cppを実装。
#include <gtest/gtest.h>
// Demonstrate some basic assertions.
TEST(HelloTest, BasicAssertions) {
  // Expect two strings not to be equal.
  EXPECT_STRNE("hello", "world");
  // Expect equality.
  EXPECT_EQ(7 * 6, 42);
}
このテストをビルドするために、CMakeLists.txtに以下のように追記。
add_executable(
  hello_test
  hello_test.cpp
)
target_link_libraries(
  hello_test
  GTest::gtest_main
)
add_test(NAME hello_test COMMAND hello_test)
enable_testing()
- 
hello_test.cppの中にメイン関数は書いてはいけない。TEST(...)マクロの中にテストコードを書いていく。 - 
gtest_mainの中にメイン関数が含まれている。これとリンクすると、実行可能なファイルができる。 
実行
ビルドして実行すればテストが行われる。
cd build
cmake ..
make
./hello_test
CMakeLists.txt に add_test(...) と enable_testing を追加した場合は、ctestというコマンドで一括実行できる。
cd build
ctest
利用可能なASSERT,EXPECTマクロ
こちらに利用可能なマクロのリストがある。
http://google.github.io/googletest/reference/assertions.html
主要なものをまとめておく。
ちなみにEXPECT_,ASSERT_の2種類が大きく分けて存在する。
EXPECT_は値が正しいことをチェックし、正しくなくても処理を続行する。ASSERT_の場合は処理を止める。
- EXPECT_TRUE(condition)
val1 == true
 - EXPECT_EQ(val1,val2)
val1 == val2
 - EXPECT_NE(val1,val2)
val1 != val2
 - EXPECT_LT(val1,val2), EXPECT_LE(val1,val2), EXPECT_GT(val1,val2), EXPECT_GE(val1,val2)
- 
val1 < val2,val1 <= val2,val1 > val2,val1 >= val2 
 - 
 - EXPECT_NEAR(val1,val2,abs_error)
std::abs(val1-val2) < abs_error