タダでソフト開発の生産性と品質を上げる方法(6):高機能な単体テストツール「GoogleTest」を使いこなす(その1):山浦恒央の“くみこみ”な話(96)(2/4 ページ)
「タダでソフト開発の生産性と品質を上げる方法」の第6回。前回紹介したグーグル(Google)製の単体テストフレームワーク「GoogleTest」には高度な機能がありますが、今回は「アサーションマクロ」と「テストフィクスチャの使い方」を取り上げます。
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は、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.