連載
» 2017年06月28日 11時00分 UPDATE

山浦恒央の“くみこみ”な話(96):タダでソフト開発の生産性と品質を上げる方法(6):高機能な単体テストツール「GoogleTest」を使いこなす(その1) (2/4)

[山浦恒央 東海大学 大学院 組込み技術研究科 非常勤講師(工学博士),MONOist]

2.アサーションマクロ

 アサーションとは、デバッグ手法の1つです。プログラムの途中で、(重要な)変数が期待した範囲にあるかチェックする方法です。非常に効果があるので、昔は自分で作った2〜3行のアサーション用ロジックを入れていました。アサーションの機能を簡単に埋め込めるのがアサーションマクロです。

 GoogleTestは、連載第94回で紹介したMinUnitと異なり、非常に多くのアサーションマクロが使用できます。例えば、前回説明した「EXPECT_EQ」は、期待値と結果を比較するアサーションマクロでした。大半は、EXPECT_EQで十分ですが、他のマクロを知っておくとテストの幅が広がります。

 GoogleTestのアサーションマクロは、「テスト失敗時(期待結果が一致しない)でも、残りのテストを実行」「テスト失敗時、残りのテストは実行しない」の2つに分類できます。例えば、EXPECT_EQは、テストが失敗しても残りのテストは実行できる代表例です。このマクロでは、全10件をテスト中に、5件目でテストが失敗しても、残りの5件を継続して実行します。GoogleTestでは、「EXPECT」が先頭に付くマクロがこの分類です。

 テストが失敗した時点で、テストを中断するマクロも存在します。従来のアサーションはこの類なので、イメージしやすいでしょう。GoogleTestでは、「ASSERT」が先頭に付くマクロがこの分類です。

 GoogleTestを使う時は、テストの結果に関わらず実行できるEXPECT系マクロが非常に便利です。表1に主要なEXPECT系アサーションマクロを示します。

マクロ名 引数 詳細
EXPECT_TRUE 引数1 条件の結果 引数1が真の場合は、テスト成功となる。
EXPECT_FALSE 引数1 条件の結果 引数1が偽の場合は、テスト成功となる。
EXPECT_EQ 引数1 期待値 ・引数1と引数2が一致する場合は、テスト成功となる
・引数1と引数2が一致しない場合は、テスト失敗となる
引数2 結果
EXPECT_LE 引数1 期待値 ・引数1<=引数2が一致する場合は、テスト成功となる
・引数1<=引数2が一致しない場合は、テスト失敗となる
引数2 結果
EXPECT_GE 引数1 期待値 ・引数1>=引数2が一致する場合は、テスト成功となる
・引数1>=引数2が一致しない場合は、テスト失敗となる
引数2 結果
表1 EXPECT系アサーションマクロ

 表1は、主要なEXPECTマクロを示したものです。この他にもさまざまなマクロがあります。リスト1に示す例題で確認してみましょう。

#include <gtest/gtest.h>
int add(int a,int b){ return a + b; }
int main(int argc, char **argv) {
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}
TEST(AddTest, test){
	EXPECT_TRUE(5 == add(2,3));
	EXPECT_FALSE(1 == add(2,3));
	EXPECT_LE(3,add(2,3));
	EXPECT_GE(6,add(2,3));
}
リスト1 マクロ使用例

 リスト1は、2つの引数を加算する関数を例にしたプログラムです。

 7〜12行目では、リスト1で示した5つのマクロを記述しています。このadd関数の引数には2と3を入れています。よって、結果は5です。以下から、各マクロを確認します。

  • 8行目:期待値=5、結果=5で、EXPECT_TRUE(5 == 5)となるので、テスト成功
  • 9行目:期待値=1、結果=5で、EXPECT_FALSE(1 != 5)となるので、テスト成功
  • 10行目:期待値=3、結果=5で、EXPECT_LE(3 < 5)となるので、テスト成功
  • 11行目:期待値=6、結果=5で、EXPECT_GE(6 > 5)となるので、テスト成功

 他にも多くのマクロがありますので、調べるとより効果的なテストが出来ます。

Copyright © ITmedia, Inc. All Rights Reserved.