Google Test を使ってみる。- その2
タイトル的につづきがあるようにしてしまったので、2回目。
前回は、導入までを書きました。
ドキュメントのことも書きましたので、基本的にはそちらを見ていただければわかるとは思います。
今回は、補足的にちょっとしたことを書きたいと思います。
※ Google Test 関係の記事一覧は
こちら豊富なアサーション
ASSERT_TRUE(condition);
こちらは、condition の真偽をテストするマクロです。
condition が真ならテストが成功します。
他にも、
(ASSERT|EXPECT)_FALSE(condition);
(ASSERT|EXPECT)_EQ(expected, actual);
(ASSERT|EXPECT)_NE(val1, val2);
(ASSERT|EXPECT)_LT(val1, val2);
(ASSERT|EXPECT)_LE(val1, val2);
(ASSERT|EXPECT)_GT(val1, val2);
(ASSERT|EXPECT)_GE(val1, val2);
(ASSERT|EXPECT)_STREQ(val1, val2);
などがあります。
(ASSERT|EXPECT)_EQ だけ、第一引数が expected (期待値)、第二引数が actual (実数値) と
なっているので、それに従って書くのがよいでしょう。
また、これらの ASSERT_xxx マクロは失敗した時点で以降の処理を行いません。
TEST(Curry, Rice)
{
ASSERT_EQ(42, 7*6);
ASSERT_EQ(49, 7*7);
ASSERT_EQ(54, 7*8); // ここで失敗
ASSERT_EQ(61, 7*9); // ここは実行されない
}
それに対して、EXPECT_xxx マクロは以降の処理も行われます。
TEST(Curry, Udon)
{
EXPECT_EQ(42, 7*6);
EXPECT_EQ(49, 7*7);
EXPECT_EQ(54, 7*8); // ここで失敗
EXPECT_EQ(61, 7*9); // ここも失敗
}
なるべく情報が残るようにして欲しい
テストを書いていてあったことだが、まずは以下のコードを見てもらいたい。
TEST(Shokupan, Change)
{
Shokupan face(6);
Man man;
ASSERT_TRUE( face.num() == 6 );
man += face;
ASSERT_TRUE( face.num() == 5 );
}
コードの内容はさておき、仮にこのテストが失敗したとします。
[----------] 1 test from Shokupan
[ RUN ] Shokupan.Change
c:\hoge\sample.cpp(32): error: Value of: face.num() == 5
Actual: false
Expected: true
[ FAILED ] Shokupan.Change (1 ms)
[----------] 1 test from Shokupan (4 ms total)
このようなログが出力されるのですが、 face.num() がいったい何だったのかがさっぱりわかりません。
わかるのは「 5 ではなかった。」ということだけです。
手元でデバッグできる環境であれば調べれば済むことなのですが、Jenkins などで自動テストを使っていると、
- 特定の環境・タイミングでしか発生しない
- よくわからないが稀に発生する
- 自分のマシンでは再現できない
という状況があります。こういう時に、情報は多いに越したことはありません。
先のテストをこのように修正します。
TEST(Shokupan, Change)
{
Shokupan face(6);
Man man;
ASSERT_EQ( 6, face.num() );
man += face;
ASSERT_EQ( 5, face.num() );
}
すると出力は以下のようになります。
[----------] 1 test from Shokupan
[ RUN ] Shokupan.Change
c:\hoge\sample.cpp(32): error: Value of: face.num()
Actual: 6
Expected: 5
[ FAILED ] Shokupan.Change (1 ms)
[----------] 1 test from Shokupan (4 ms total)
どうして失敗したのかわかりやすくなりましたね。
このテストはもともとあったコードを gtest に書き換えた際に、
ASSERT(face.num() == 5);
を
ASSERT_TRUE(face.num() == 5);
のように置換しただけのものでした。
全く、こういうことはホントやめていただきたい。
一体どこのどいつが書いたんだ!
と、思ったら過去の自分でした…orz