タダでソフト開発の生産性と品質を上げる方法(5):グーグルの隠し球的単体テストツール「GoogleTest」:山浦恒央の“くみこみ”な話(95)(3/3 ページ)
「タダでソフト開発の生産性と品質を上げる方法」の第5回。今回は、IT業界の巨人、グーグル(Google)製の単体テストフレームワーク「GoogleTest」を紹介する。
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は、GoogleTestの使用例を示したものです。以下に各行を説明します。
4.1 1行目:ヘッダファイルのインクルード
1行目の#include
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マクロの使用例を示したものです。本例では、「正の値を入力した場合」「負の値を入力した場合」のように分けて記述しました。このように、テスト内容に合わせて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を要約すると、「1件のテストケースを実行し、パス(成功)しました」です。では、EXPECT_EQ(0,add(0,1))と記述した場合はどうでしょうか。つまり、期待値=0、結果=1の時です。図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/アスキーメディアワークス社)
東海大学 大学院 組込み技術研究科 非常勤講師(工学博士)
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- ≫連載「山浦恒央の“くみこみ”な話」バックナンバー
- タダでソフト開発の生産性と品質を上げる方法(4):単体テストで威力を発揮する「MinUnit」
「タダでソフト開発の生産性と品質を上げる方法」の第4回。今回は、単体テストで威力を発揮する「MinUnit」を紹介する。 - タダでソフト開発の生産性と品質を上げる方法(3):意外に使えるフリーツール「PictMaster」を使いこなす
「タダでソフト開発の生産性と品質を上げる方法」の第3回。今回は、前回紹介した無料の組合せテスト自動生成ツール「PictMaster」を使いこなす応用編だ。 - タダでソフト開発の生産性と品質を上げる方法(2):フリーの組合せテスト自動生成ツール「PictMaster」
「タダでソフト開発の生産性と品質を上げる方法」の第2回。今回は、ソースコードを簡単に分析し、計測するフリーの組合せテスト自動生成ツール「SourceMonitor」を紹介します。 - タダでソフト開発の生産性と品質を上げる方法(1):意外に使える無料のソースコード測定ツール「SourceMonitor」
「“くみこみ”な話」の新シリーズが開幕。テーマは「タダでソフト開発の生産性と品質を上げる方法」です。第1回は、ソースコードを簡単に分析し、計測するフリーツール「SourceMonitor」を紹介します。 - 猫でも分かるソフトウェアのテスト網羅(6):パス・カバレッジの王者の意外な弱点
「制御パステスト」をテーマとする「猫でも分かるソフトウェアのテスト網羅」シリーズの第6回では、前回に引き続き「C2カバレッジ」を取り上げます。パス・カバレッジの王者ともいわれる「C2カバレッジ」ですが弱点がないわけではありません。