エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

その1:基本的な使い方

最低限テストとして利用できる基本的な使い方について解説します。応用についてはおいおい。

テストを記述する

テストは、関数のように見えるTESTマクロを使って記述します。

TEST(テストケース名, テスト名)
{
    テスト本体
}


個々のテストは特に登録などの手続きをする必要がなく、TESTマクロを使って書き足すだけで実行の対象になってくれます。

#include <gtest/gtest.h>

int add(int x, int y)
{
    return x + y;
}

TEST(AddTest, Test1)
{
    ASSERT_EQ(2, add(1, 1));
}

TEST(AddTest, Test2)
{
    ASSERT_EQ(3, add(1, 2));
}

TEST(AddTest, Test3)
{
    ASSERT_EQ(4, add(2, 2));
}

int main(int argc, char* argv[])
{
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}


実行結果。

[==========] Running 3 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 3 tests from OpTest
[ RUN      ] OpTest.Add1
[       OK ] OpTest.Add1
[ RUN      ] OpTest.Add2
[       OK ] OpTest.Add2
[ RUN      ] OpTest.Add3
[       OK ] OpTest.Add3
[----------] Global test environment tear-down
[==========] 3 tests from 1 test case ran.
[  PASSED  ] 3 tests.

テストに失敗した場合

テストに失敗した場合は次のようになります。

コードの一部を書き換えて実行してみます。

TEST(AddTest, Test3)
{
    ASSERT_EQ(5, add(2, 2));
}


実行結果。

[==========] Running 3 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 3 tests from AddTest
[ RUN      ] AddTest.Test1
[       OK ] AddTest.Test1
[ RUN      ] AddTest.Test2
[       OK ] AddTest.Test2
[ RUN      ] AddTest.Test3
ex2.cpp:20: Failure
Value of: add(2, 2)
  Actual: 4
Expected: 5
[  FAILED  ] AddTest.Test3
[----------] Global test environment tear-down
[==========] 3 tests from 1 test case ran.
[  PASSED  ] 2 tests.
[  FAILED  ] 1 test, listed below:
[  FAILED  ] AddTest.Test3

 1 FAILED TEST

テストケースAddTest、テストTest3でテストが失敗したことが表示されます。


テストに対してメッセージを追加したい場合、アサートマクロを出力ストリームのように使ってメッセージを「挿入」することができます。

コードの一部をさらに次のように書き換えます。

TEST(AddTest, Test3)
{
    ASSERT_EQ(5, add(2, 2)) << "TEST add(2, 2) FAILED!!";
}


実行結果(該当部分のみ)。

[ RUN      ] AddTest.Test3
ex2.cpp:20: Failure
Value of: add(2, 2)
  Actual: 4
Expected: 5
TEST add(2, 2) FAILED!!
[  FAILED  ] AddTest.Test3

追加したメッセージが表示されているのがわかります。
このメッセージは、テストがパスしたときには表示されません。

main関数の書き方

説明が前後しましたが、テストを実行するためのmain関数の基本的な書き方です。

int main(int argc, char* argv[])
{
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

テストはまず::testing::InitGoogleTest関数で初期化します。引数はmain関数の引数を渡します。

引数は、googletest用のオプションを解析して初期化に利用した後、googletest用のオプションを取り除いた形に書き換えられます。

例えば。

./sample1 --gtest_color=yes a --gtest_filter=*.Test1 a b c 

と実行した場合、main関数の引数は7つですが(実行ファイル名含む)、::testing::InitGoogleTest関数を通したあとでは、./sample1 a a b cの5つになっています。
(オプションについては後述)

テストはRUN_ALL_TESTSマクロで実行されます。このマクロは終了コードを返すのでmain関数の戻り値としてその値を返すようにします。