LoginSignup
0
1

cmakeプロジェクトにGoogleTestを最小限の手間で導入する

Last updated at Posted at 2023-05-22

C++のプロジェクトにGoogleTestを導入する最小限の手順を紹介する。
GoogleTestでは凝ったことをやり始めるといくらでも複雑なことができるが、この記事では「小規模なcmakeプロジェクトに最小限の手間で導入する」ことを目指す。

参考: http://google.github.io/googletest/quickstart-cmake.html

cmakeプロジェクトの設定

以下のような雛形から始めるのが良い。

CMakeLists.txt
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を実装。

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に以下のように追記。

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.txtadd_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
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1