softwares/GoogleTest/index.wiki.txt

current previous
1,170 0,0
+
%smdncms%(set-metadata,title,GoogleTest)
+
%smdncms%(set-metadata,keywords,GoogleTest)
+

         
+
C++テストフレームワーク[[GoogleTest:https://github.com/google/googletest]]のインストール、簡単な使い方、コマンドラインオプションなどについて。
+

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

         
+
$relevantdocs(参考)
+

         
+
-[[入門ガイド — Google Test ドキュメント日本語訳:http://opencv.jp/googletestdocs/primer.html]]
+

         
+

         
+

         
+
$relevantdocs$
+

         
+
#adunit
+

         
+

         
+

         
+
*インストール
+
まず、[[Releases · google/googletest · GitHub:https://github.com/google/googletest/releases]]より目的のバージョンのソースコードを入手する。
+

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

         
+
#prompt(emphasize=shell-unix){{
+
<!-- 展開する -->
+
$ tar -xvf googletest-release-1.10.0.tar.gz
+
$ cd googletest-release-1.10.0
+

         
+
<!-- ビルド用のディレクトリを作成する -->
+
$ mkdir build
+
$ cd build
+
}}
+

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

         
+
#prompt(emphasize=shell-unix,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``で指定したパスにインストールされる。
+

         
+
#prompt(emphasize=shell-unix,ビルド・インストール){{
+
$ make
+
$ sudo make install
+
}}
+

         
+

         
+

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

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

         
+
#code(c,title=main.cpp){{
+
#include <gtest/gtest.h>
+

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

         
+
  return RUN_ALL_TESTS();
+
}
+
}}
+

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

         
+
#code(c,title=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``をリンクしてコンパイルする。
+

         
+
#prompt(emphasize=shell-unix){{
+
$ g++ -I/opt/googletest/include main.cpp test.cpp -L/opt/googletest/lib -lgtest -lgtest_main -o test
+
}}
+

         
+

         
+

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

         
+
#prompt(emphasize=shell-unix){{
+
$ 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
+
}}
+

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

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

         
+
#prompt(emphasize=shell-unix){{
+
<!-- テストフィクスチャ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
+
}}
+

         
+

         
+