上記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の使用例を示したものです。以下に各行を説明します。
1行目の#include
2行目は、筆者が作成した2つの引数を足し算をする関数(add関数)です。例えば、add(3,4)と記述すると、3+4=7が戻り値となります。ただ足し算するだけなので簡単ですね。これを本例題のテスト対象とします。
3〜6行目は、main処理を記述した部分です。InitGoogleTest()を記述し、初期化処理を記述します。5行目のRUN_ALL_TESTS()は、テスト実行する関数です。テストが全て成功すれば0、それ以外は1が返ります。
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マクロを記述します。
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))と書いてあり、以下のようになります。
テストが成功すると、コンソールに図10のようなメッセージが表れます。
図10を要約すると、「1件のテストケースを実行し、パス(成功)しました」です。では、EXPECT_EQ(0,add(0,1))と記述した場合はどうでしょうか。つまり、期待値=0、結果=1の時です。図11をご覧ください。
図11は、EXPECT_EQマクロでテスト失敗時のログを示したもので、「add(0,1)の値は、期待値は1だけれど実際は0で、1件テスト失敗」を意味します。
上記の4の内容を要約すると、以下のようになります。
今回は、GoogleTestを使った単体テストを説明しました。このツールを使うと、単体テスト手法が統一化できたり、1度記述すれば回帰テストが容易になったりします。また、GoogleTestは機能が豊富で、さまざまな使い道が期待できるでしょう。詳しい使い方は、参考文献[1]をご覧ください。本コラムをきっかけに、より単体テストに興味を持っていただければ幸いです。
次回は、もう一歩進んだGoogleTestの高機能な使い方を紹介します。
[1]「モダンC言語プログラミング」(花井志生、2013、KADOKAWA/アスキーメディアワークス社)
東海大学 大学院 組込み技術研究科 非常勤講師(工学博士)
Copyright © ITmedia, Inc. All Rights Reserved.