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