連載
» 2017年05月24日 11時00分 公開

山浦恒央の“くみこみ”な話(95):タダでソフト開発の生産性と品質を上げる方法(5):グーグルの隠し球的単体テストツール「GoogleTest」 (3/3)

[山浦恒央 東海大学 大学院 組込み技術研究科 非常勤講師(工学博士),MONOist]
前のページへ 1|2|3       

4.GoogleTestを用いた単体テスト

 上記3.4で実行したプログラムから、GoogleTestの使い方を確認します。以下に、リスト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, value){
	EXPECT_EQ(1,add(0,1));
}
リスト1 例題プログラム(再掲)

 リスト1は、GoogleTestの使用例を示したものです。以下に各行を説明します。

4.1 1行目:ヘッダファイルのインクルード

 1行目の#includeでGoogleTestのライブラリをインクルードします。要は、GoogleTestを使うおまじないですね。

4.2 2行目:足し算関数

 2行目は、筆者が作成した2つの引数を足し算をする関数(add関数)です。例えば、add(3,4)と記述すると、3+4=7が戻り値となります。ただ足し算するだけなので簡単ですね。これを本例題のテスト対象とします。

4.3 3〜6行目:メインルーチン

 3〜6行目は、main処理を記述した部分です。InitGoogleTest()を記述し、初期化処理を記述します。5行目のRUN_ALL_TESTS()は、テスト実行する関数です。テストが全て成功すれば0、それ以外は1が返ります。

4.4 7行目:TESTマクロ

 7行目は、TEST()マクロで、テストケースをまとめて記述するものです。TESTマクロの使用方法をリスト2に示します。

マクロ名 引数 内容
TEST 引数1 テストケース名 テストケースをまとめて記述する
引数2 テスト内容
リスト2 TESTマクロ

 TESTマクロは、引数1にテストケースの名前、引数2にテスト目的を記述します。例えば、次のようです。

// (引数1: 足し算のテスト、引数2: 正の入力のテスト)
TEST (Addtest, PositiveInput) {
	// 正の値が入力した時のテスト1
	// 正の値が入力した時のテスト2
}
// (引数1: 足し算のテスト、引数2: 負の入力のテスト
TEST (Addtest, NegativeInput) {
	// 負の値を入力した時のテスト1
	// 負の値を入力した時のテスト2
}
リスト3 TESTマクロの記述例

 上記のリスト3は、TESTマクロの使用例を示したものです。本例では、「正の値を入力した場合」「負の値を入力した場合」のように分けて記述しました。このように、テスト内容に合わせてTESTマクロを記述します。

4.5 8行目:EXPECT_EQマクロ

 8行目のEXPECT_EQ()は、テストケースの結果を評価するマクロです。つまり、アサーションですね。このマクロは、2つの引数の値を比較し、「テスト成功」か「テスト失敗」を返します。リスト4をご覧ください。

マクロ名 引数 内容
EXPECT_EQ 引数1 期待値 引数1と引数2が一致する場合は、テスト成功となる
引数1と引数2が一致しない場合は、テスト失敗となる
引数2 結果
リスト4 EXPECT_EQマクロの使い方

 リスト4は、EXPECT_EQマクロの使い方です。リスト1にはEXPECT_EQ(1,add(0,1))と書いてあり、以下のようになります。

  • 引数1(期待値=1)、引数2(結果=0+1)が一致している場合は、テストが成功する
  • 引数1(期待値=1)、引数2(結果=0+1)が一致しない場合は、テスト失敗となる

 テストが成功すると、コンソールに図10のようなメッセージが表れます。

図10 図10 テスト成功時のメッセージ

 図10を要約すると、「1件のテストケースを実行し、パス(成功)しました」です。では、EXPECT_EQ(0,add(0,1))と記述した場合はどうでしょうか。つまり、期待値=0、結果=1の時です。図11をご覧ください。

図11 図11 テスト失敗時のメッセージ

 図11は、EXPECT_EQマクロでテスト失敗時のログを示したもので、「add(0,1)の値は、期待値は1だけれど実際は0で、1件テスト失敗」を意味します。

5.まとめ

 上記の4の内容を要約すると、以下のようになります。

  • InitGoogleTest()でGoogleTestの初期化する
  • RUN_ALL_TESTS()でテスト実行する
  • TESTマクロ内に、テストケースのまとまりを記述する
  • EXPECT_EQを使って、テストケースを記述する
  • EXPECT_EQの引数1と引数2が一致している場合は、「テスト成功」となる
  • EXPECT_EQの引数1と引数2が一致しない場合は、「テスト失敗」となる

6.終わりに

 今回は、GoogleTestを使った単体テストを説明しました。このツールを使うと、単体テスト手法が統一化できたり、1度記述すれば回帰テストが容易になったりします。また、GoogleTestは機能が豊富で、さまざまな使い道が期待できるでしょう。詳しい使い方は、参考文献[1]をご覧ください。本コラムをきっかけに、より単体テストに興味を持っていただければ幸いです。

 次回は、もう一歩進んだGoogleTestの高機能な使い方を紹介します。

参考文献

[1]「モダンC言語プログラミング」(花井志生、2013、KADOKAWA/アスキーメディアワークス社)


【 筆者紹介 】
山浦 恒央(やまうら つねお)

東海大学 大学院 組込み技術研究科 非常勤講師(工学博士)


1977年、日立ソフトウェアエンジニアリングに入社、2006年より、東海大学情報理工学部ソフトウェア開発工学科助教授、2007年より、同大学大学院組込み技術研究科准教授、2016年より非常勤講師。

主な著書・訳書は、「Advances in Computers」 (Academic Press社、共著)、「ピープルウエア 第2版」「ソフトウェアテスト技法」「実践的プログラムテスト入門」「デスマーチ 第2版」「ソフトウエア開発プロフェッショナル」(以上、日経BP社、共訳)、「ソフトウエア開発 55の真実と10のウソ」「初めて学ぶソフトウエアメトリクス」(以上、日経BP社、翻訳)。


前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.