ここ半年くらいはC++のお仕事をしています。
Unit Testってやりますよね?(部署にもよる気がしますが普通しますよね、色々なパターンがあると思いますが、デバッグモードでステップ実行して単体テストですと言われた時は目を強く瞑りました。。。)

C++では、Visual Studioの単体テストフレームワーク、CTest、Catch2などなどあると思いますが、僕はGoogle Testが好きです。
テストが作りやすい、Mockがすごく便利だなと思います。後Visual StudioやVSCodeにTest AdapterがあるのでWindowでもLinuxでもテスト管理が簡単な気がします。

今回は、最近WindowsとLinux両方でコードを使い回してあげる必要が出てきたため、CMakeで環境を作るようにしています。
その際に初めてCMakeでGoogle Testの環境を作りましたので備忘録として残します。また、VSCodeのC++ Test Adapterもとてもよかったのでメモしておきます。

以下のことは書きません

  • CMakeのインストール方法
  • CMake記法の詳細
  • Google Testの詳細

Google Testについてはまた別に書き残したいです。

CMakeでGoogle Testを使う単体テストプロジェクトを作る

googletestのgithubリポジトリは割とドキュメントが充実しています。

GitHub - google/googletest: GoogleTest - Google Testing and Mocking Framework

GoogleTest - Google Testing and Mocking Framework. Contribute to google/googletest development by creating an account on GitHub.

プロジェクトの構成はこんな感じ

proj
|- CMakeList.txt
|- test_sample.cpp
|- build/

CMakeList.txtはこんな感じです。

cmake_minimum_required(VERSION 3.28)
project(gtest_sample VERSION 0.1.0 LANGUAGES C CXX)

include(FetchContent)
FetchContent_Declare(
  googletest
  # Specify the commit you depend on and update it regularly.
  URL https://github.com/google/googletest/archive/5376968f6948923e2411081fd9372e71a59d8e77.zip
)
# For Windows: Prevent overriding the parent project's compiler/linker settings
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(googletest)

# Now simply link against gtest or gtest_main as needed. Eg
add_executable(test_sample test_sample.cpp)
target_link_libraries(test_sample gtest_main)
target_link_libraries(test_sample gmock_main)

enable_testing()

test_sample.cppはこんな感じです。

#include <iostream>
#include <gtest/gtest.h>
#include <gmock/gmock.h>

TEST(HelloTest, BasicAssertions) {
  // Expect two strings not to be equal.
  EXPECT_STRNE("hello", "world");
  // Expect equality.
  EXPECT_EQ(7 * 6, 42);
}

今回はmockの方をincludeする必要はないのですが、なんとなく。

これでコマンドラインからであればcd build && cmake ..
VSCodeであれば、CMakeプラグインが入っていれば普通にビルドすることができます。

C++ Test Mate

Visual Studioであれば、Google Test Adapterと言うものがあるので、Test Exploreでテストケースの結果が一覧で表示されたり、個別テストケースをGUIから操作できます。
そんな便利機能がVSCodeでもあります。

GitHub - matepek/vscode-catch2-test-adapter: Catch2, Google Test and doctest Adapter for the VSCode

Catch2, Google Test and doctest Adapter for the VSCode - matepek/vscode-catch2-test-adapter

注意点としては、テストの実行ファイルは以下のようにしないといけないこと。

{build,Build,BUILD,out,Out,OUT}/**/*{test,Test,TEST}*

最初実行ファイル名にtestをつけていなくて全然テストを拾ってもらえませんでした。
(READMEに書いてあるんですけどね。。。見てなかった。)

おわりに

今回はCMakeでGoogle Testのプロジェクトを作ってみました。
VSCodeはすごく便利ですね。本当に良い。

Google Testについてもまたメモを残したいと思います。