Google Testのインストールと使い方
tl;dr
CMake利用前提での話です。GitHubからダウンロードしてソースからビルド・インストールし、 いくつかテストのサンプルコードを書きます
Google Testのインストール
CMakeを利用して、ソースからビルドします。予めCMakeがインストールされ利用できる状態として話を進めます
ソースのダウンロード
GoogleTestのリポジトリを下記です
master branchからクローンしてビルドしても良いですが、私の環境だとビルドに失敗するときもあったので、 基本的にはリリースからダウンロードするほうがトラブルが少ないと思います
私のダウンロードしたバージョンは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_TRUE
や EXPECT_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