C++テストフレームワークGoogleTestのインストール、簡単な使い方、コマンドラインオプションなどについて。

本内容は2021年3月時点、version 1.10に基づく。

インストール

まず、Releases · google/googletest · GitHubより目的のバージョンのソースコードを入手する。

展開したあと、ビルド用のディレクトリbuildを作成して移動する。 (ディレクトリ名は任意)

展開する
$tar -xvf googletest-release-1.10.0.tar.gz
$cd googletest-release-1.10.0

ビルド用のディレクトリを作成する
$mkdir build
$cd build

cmakeを実行する。 この際、以下のようにオプションを指定する。 ここでは、インストール先を/opt/googletestとする。

CMakeの実行
$cmake ../ -DBUILD_SHARED_LIBS=ON -DINSTALL_GTEST=ON -DCMAKE_INSTALL_PREFIX=/opt/googletest
-DBUILD_SHARED_LIBS=ON
共有ライブラリのビルドを有効にする
-DINSTALL_GTEST=ON
googletestディレクトリをビルドする
-DCMAKE_INSTALL_PREFIX=/opt/googletest
インストール先ディレクトリを指定する。

最後にmake, make installする。 make installでは、上記のDCMAKE_INSTALL_PREFIXで指定したパスにインストールされる。

ビルド・インストール
$make
$sudo make install

テストの作成・実行

テストケースの作成・コンパイル

まず、テストケースを含むソースファイルを作成する。 ここではmain関数のみを記述したファイルと、テストケースを記述したファイルを別々に用意することにする。

main関数ではGoogleTestの初期化・コマンドライン引数の引き渡しと、テストの実行を行う。

main.cpp
#include <gtest/gtest.h>

int main(int argc, char **argv) {
  ::testing::InitGoogleTest(&argc, argv);

  return RUN_ALL_TESTS();
}

テストケースは以下のように記述する。 ここでは、testing::Testクラスを継承してテストフィクスチャを作成する方法を取る。

test.cpp
#include <gtest/gtest.h>

namespace {
  // SampleTestsの名前でテストフィクスチャクラスを作成する
  class SampleTests : public ::testing::Test {
    protected:
      virtual void SetUp() override
      {
        // 各テスト毎に実行する必要があるセットアップコードがある場合はここに記述する
      }

      virtual void TearDown() override
      {
        // 各テスト毎に実行する必要がある終了コードがある場合はここに記述する
      }

      // 各テストで使用される定数や共通の関数がある場合は、このクラス内で定義できる
      static constexpr int GetConstant() { return 0; }
  };

  // 以下でテストケースを記述する(上記の*クラス外で*記述する点に注意)

  // 各テストケースはTEST_Fマクロで定義する
  // 1つ目の引数にはテストフィクスチャのクラス名、2つ目の引数にはテストケース名を記述する
  TEST_F(SampleTests, TestMustBeSuccess)
  {
    // EXPECT_XXXマクロでアサーションを行う
    EXPECT_EQ(0, GetConstant());
  }

  // 同様にテストケースごとにTEST_Fマクロで定義していく
  TEST_F(SampleTests, TestMustBeFailed)
  {
    EXPECT_EQ(1, GetConstant());
  }
}

作成したソースファイルと、共有ライブラリgtestおよびgtest_mainをリンクしてコンパイルする。

$g++ -I/opt/googletest/include main.cpp test.cpp -L/opt/googletest/lib -lgtest -lgtest_main -o test

テストの実行

コンパイルされたバイナリを実行すると、テストが実行され、以下のように出力される。

$LD_LIBRARY_PATH=/opt/googletest/lib ./test

[==========] Running 2 tests from 1 test suite.
[----------] Global test environment set-up.
[----------] 2 tests from SampleTests
[ RUN      ] SampleTests.TestMustBeSuccess
[       OK ] SampleTests.TestMustBeSuccess (1 ms)
[ RUN      ] SampleTests.TestMustBeFailed
test.cpp:32: Failure
Expected equality of these values:
  1
  GetConstant()
    Which is: 0
[  FAILED  ] SampleTests.TestMustBeFailed (0 ms)
[----------] 2 tests from SampleTests (1 ms total)

[----------] Global test environment tear-down
[==========] 2 tests from 1 test suite ran. (1 ms total)
[  PASSED  ] 1 test.
[  FAILED  ] 1 test, listed below:
[  FAILED  ] SampleTests.TestMustBeFailed

 1 FAILED TEST

共有ライブラリを使用する場合は、LD_LIBRARY_PATHにライブラリファイルへのパスが設定されている必要がある点に注意。

フィルタを指定したテストの実行

特定のテストフィクスチャあるいはテストケースのみ実行するには、環境変数GTEST_FILTERまたはコマンドライン引数--gtest_filterを指定して実行する。 このとき、名前にワイルドカード*を指定することもできる。

テストフィクスチャSampleTestsのテストケースのみを実行する
$LD_LIBRARY_PATH=/opt/googletest/lib GTEST_FILTER=SampleTests.* ./test

同上、コマンドライン引数で指定する場合
$LD_LIBRARY_PATH=/opt/googletest/lib ./test --gtest_filter=SampleTests.*

テストケースSampleTests::TestMustBeFailedのみを実行する
$LD_LIBRARY_PATH=/opt/googletest/lib GTEST_FILTER=SampleTests.TestMustBeFailed ./test

同上、コマンドライン引数で指定する場合
$LD_LIBRARY_PATH=/opt/googletest/lib ./test --gtest_filter=SampleTests.TestMustBeFailed