Google Test の使い方¶
Google Test のインストール¶
msys2 のターミナルを起動して下記コマンドを打ってインストールします。 Make と CMake が必要なのでインストールしていない場合は先にインストールしてください。
$ cd /tmp
$ wget 'https://github.com/google/googletest/archive/release-1.8.1.tar.gz'
$ tar zxvf release-1.8.1.tar.gz
$ mkdir -p /usr/local/src
$ mv googletest-release-1.8.1 /usr/local/src
$ cd /usr/local/src/googletest-release-1.8.1
$ mkdir build
$ cd build
$ cmake ..
$ make
$ make install
実行例¶
例として、 sample.h (.cc)
に偶数を判定する関数 IsEven
を作成し、この関数の動作をテストするには次のようにします。
1 2 3 4 5 6 7 8 9 |
|
1 2 3 4 5 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
sample_test.cc
にテストコードを記述しています。
テストコードでは、Google Test を利用するために gtest/gtest.h
をインクルードし、テスト対象となる sample.h
もインクルードしています。
次のコマンドでテスト実行ファイルを作成します。ここではコマンドの詳細については割愛します。
# ビルド
$ g++ -std=c++11 sample.cc sample_test.cc -o test -L/usr/local/lib -lgtest -lgtest_main
# 実行
$ ./test.exe
# 実行結果
Running main() from /usr/local/src/googletest-release-1.8.1/googletest/src/gtest_main.cc
[==========] Running 3 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 3 tests from IsEvenTest
[ RUN ] IsEvenTest.Negative
[ OK ] IsEvenTest.Negative (0 ms)
[ RUN ] IsEvenTest.Zero
[ OK ] IsEvenTest.Zero (0 ms)
[ RUN ] IsEvenTest.Positive
[ OK ] IsEvenTest.Positive (0 ms)
[----------] 3 tests from IsEvenTest (0 ms total)
[----------] Global test environment tear-down
[==========] 3 tests from 1 test case ran. (0 ms total)
[ PASSED ] 3 tests.
成功したテストは [ OK ]
と出力され、失敗したテストは [ FAILED ]
と出力されます。
また、成功して通過したテスト数が [ PASSED ]
に表示されます。
初歩的なテストコードの書き方¶
テスト関数¶
Google Test に用意されている TEST()
を利用してテスト関数を作成します。
TEST()
の第1引数にテストケース名、第2引数にテスト名を記述します。
TEST(/* テストケース名(大項目)*/, /* テスト名(小項目) */) {
// テスト関数内は、通常通り C++ のコードを記述可能
}
テストケース名とテスト名には _
を含んではいけません。
アサーション¶
Google Test に用意されているアサーションを利用することで、 テスト対象コードの動作を検証することが出来ます。
// true/falseのアサーション
EXPECT_TRUE(condition); // condition が true か
EXPECT_FALSE(condition); // condition が false か
// 2つの値を比較するアサーション
EXPECT_EQ(expected, actual); // expected == actual か
EXPECT_NE(expected, actual); // expected != actual か
EXPECT_LT(expected, actual); // expected < actual か
EXPECT_LE(expected, actual); // expected <= actual か
EXPECT_GT(expected, actual); // expected > actual か
EXPECT_GE(expected, actual); // expected >= actual か
これらのアサーションを利用する場合は、 期待結果 (expected)、 テスト対象 (actual)の順で記述します。
EXPECT_
で始まるアサーションの他に、 ASSERT_
で始まるアサーションがあります。
EXPECT_
の場合は、テストに失敗してもテスト関数がそのまま続行されますが、
ASSERT_
の場合は、テストに失敗するとその時点でテストを中断してテスト関数を抜けます。
試しに、誤った実装がなされた関数 IsEven
を利用して、テスト失敗時の出力を確認すると次のようになります。
1 2 3 4 5 6 7 8 9 |
|
1 2 3 4 5 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
|
テストが失敗した場合、失敗箇所と失敗理由が出力されます。