ネコと和解せよ

技術的なあれこれの備忘録のつもり

Google Testのインストールと使い方

tl;dr

CMake利用前提での話です。GitHubからダウンロードしてソースからビルド・インストールし、 いくつかテストのサンプルコードを書きます

Google Testのインストール

CMakeを利用して、ソースからビルドします。予めCMakeがインストールされ利用できる状態として話を進めます

ソースのダウンロード

GoogleTestのリポジトリを下記です

github.com

master branchからクローンしてビルドしても良いですが、私の環境だとビルドに失敗するときもあったので、 基本的にはリリースからダウンロードするほうがトラブルが少ないと思います

github.com

私のダウンロードしたバージョンはv1.10.0で、環境はMacOS 10.14.6です

Docker環境ですが、Ubuntu18.04でもビルドできることを確認してます

ダウンロードが完了したら展開して、そのディレクトリに移動してください

lsするとCMakeLists.txtが見つかるはずです

Google Testのビルド

普通にCMakeでビルドします

# buildディレクトリを作成してbuildディレクトリに移動
$ mkdir build && cd build

もしインストール先がデフォルトで良いなら下記を実行してください

$ cmake ../

インストール先を変更したい場合は下記のようにCMAKE_INSTALL_PREFIXを設定します

$ cmake -DCMAKE_INSTALL_PREFIX=path/to/install/dir ../

CMakeの処理が完了したらMakeコマンドでビルドしてインストールします

$ make -j4
$ make install

以上でインストールは完了です

Google Testの使い方

Google Testを使う準備

まずCMakeLists.txtを作成します

# 基本的な設定
cmake_minimum_required(VERSION 3.13)
project(test_example_project)

# Google Test ライブラリを探す
find_package(GTest)

# 今回作成する実行ファイルexample_test, ソースファイルはmain.cppのみ
add_executable(example_test main.cpp)
# gtest と gtest_main, pthreadをリンクします。
target_link_libraries(example_test ${GTEST_BOTH_LIBRARIES} pthread)
target_include_directories(example_test PUBLIC ${GTEST_INCLUDE_DIRS})

GTEST_BOTH_LIBRARIESに関しては下記を参照してください cmake.org

CMakeLists.txtと同じディレクトリにmain.cppも作ってください。とりあえず中身は空で良いです

こんな状態になってるはずです

どこかのディレクトリ/
    - CMakeLists.txt
    - main.cpp

テストコードをビルドするためにまずcmakeを実行します

$ mkdir build && cd build
$ cmake ../

もし、Google Testのインストール先を変更してる場合は $ cmake ../ではなくインストールを先を指定して実行します

$ cmake -DCMAKE_PREFIX_INSTALL=path/to/install/dir ../

あとは普通にビルドし、実行します

$ make
$  ./example_test

以下のような実行結果が表示されれば、Google Testが問題なく使えています

[==========] Running 0 tests from 0 test suites.
[==========] 0 tests from 0 test suites ran. (0 ms total)
[  PASSED  ] 0 tests.

テストの書き方

Google TestのTESTマクロを利用して以下の形式で書きます

TEST(テストスイート名, テストケース名) {
    // テスト内容
}

複数のテストケースをまとめたものをテストスイートというらしいので、実際には以下のような形になるはずです

TEST(テストスイート名, テストケース名1) {
    // テスト内容1
}

TEST(テストスイート名, テストケース名2) {
    // テスト内容2
}

テストを実際に書いてみる

例えば与えられた数字が偶数かどうかを判定する関数bool isEven(int)をテストしてみます

#include <gtest/gtest.h>

bool isEven(int number) {
    return number % 2 == 0;
}

TEST(isEven, isEvenTestCase) {
    ASSERT_TRUE(isEven(2));
    EXPECT_TRUE(isEven(4));
    ASSERT_FALSE(isEven(3));
    EXPECT_FALSE(isEven(5));
}

実際にビルドして実行すると

$ make
$  ./example_test

以下のような出力になるはずです

[==========] Running 1 test from 1 test suite.
[----------] Global test environment set-up.
[----------] 1 test from isEven
[ RUN      ] isEven.isEvenTestCase
[       OK ] isEven.isEvenTestCase (0 ms)
[----------] 1 test from isEven (0 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test suite ran. (0 ms total)
[  PASSED  ] 1 test.

特にテストコードの説明はいらないと思いますが、

  • ASSERT_TRUE
  • EXPECT_TRUE

の2つは結果がtrueであることを

  • ASSERT_FALSE
  • EXPECT_FALSE

の2つは結果がfalseであることを確かめます。

ASSERT_*EXPECT_*の違いはテストの失敗時の挙動に違いがあります

ASSERT_*は失敗時、現在のテストを中止しますが、EXPECT_*は失敗時も残りのテストを続行します

EXPECT_TRUEEXPECT_FALSEの他にも以下のようなアサーションが利用可能です。

アサーション  確認内容
ASSERT_EQ(val1, val2); val1 == val2
ASSERT_NE(val1, val2); val1 != val2
ASSERT_LT(val1, val2); val1 < val2
ASSERT_LE(val1, val2); val1 <= val2
ASSERT_GT(val1, val2); val1 > val2
ASSERT_GE(val1, val2); val1 >= val2
EXPECT_EQ(val1, val2); val1 == val2
EXPECT_NE(val1, val2); val1 != val2
EXPECT_LT(val1, val2); val1 < val2
EXPECT_LE(val1, val2); val1 <= val2
EXPECT_GT(val1, val2); val1 > val2
EXPECT_GE(val1, val2); val1 >= val2

他にどのようなものがあるかは下記を参照してください

googletest/primer.md at master · google/googletest · GitHub

googletest/cheat_sheet.md at 70b90929b1da20580cad9ed996397cf04ef8f16d · google/googletest · GitHub

c.f.

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

FindGTest — CMake 3.18.4 Documentation

googletest/primer.md at master · google/googletest · GitHub

googletest/cheat_sheet.md at 70b90929b1da20580cad9ed996397cf04ef8f16d · google/googletest · GitHub