タダでソフト開発の生産性と品質を上げる方法(6):高機能な単体テストツール「GoogleTest」を使いこなす(その1):山浦恒央の“くみこみ”な話(96)(3/4 ページ)
「タダでソフト開発の生産性と品質を上げる方法」の第6回。前回紹介したグーグル(Google)製の単体テストフレームワーク「GoogleTest」には高度な機能がありますが、今回は「アサーションマクロ」と「テストフィクスチャの使い方」を取り上げます。
3.テストフィクスチャの使い方
テストコードが多くなると、テストの前提条件を設定することが面倒になります。これを解決するのがxUnit系ツールのテストフィクスチャで、テストの前後に実行するメソッドを記述できます。GoogleTestでは、テストフィクスチャクラスと、「SetUp」と「TearDown」メソッドを記述します。例えば、リスト2のように使います。なお、リストは、C++で記述しています。
#include <gtest/gtest.h> #include <stdio.h> class Car{ public: int TotalGas; void Init(){ TotalGas = 0; }; void Add(int amount){ TotalGas += amount; } }; class CarTestFixture:public::testing::Test{ protected: Car* car; virtual void SetUp(){ printf("SetUpメソッド実行\n"); car = new Car; car->Init(); } virtual void TearDown(){ printf("TearDownメソッド実行\n"); delete car; } }; int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); } TEST_F(CarTestFixture,CheckInitValue){ printf("初期値のテスト\n"); EXPECT_EQ(0,car->TotalGas); } TEST_F(CarTestFixture,CheckAddValue){ printf("加算値のテスト\n"); car->Add(15); EXPECT_EQ(15,car->TotalGas); }
リスト2は、テストフィクスチャの使用例を示したものです。概略は、Car(車クラス)というクラスがあり、Addメソッドを呼び出し、ガソリン量(TotalGas)を加えるプログラムです。なお、printf文は、ログ用に記述しています。以下に、詳細を説明します。
3.1 各行の説明
3〜8行目
3〜8行目は、Carクラスのメンバ変数とメソッドを定義しています。メンバ変数は、ガソリン量の合計を示した変数(TotalGas)だけです。メソッドには、TotalGasに0を代入するInit(初期化メソッド)と、引数:amountの値だけガソリン量を加算するAddがメソッドがあります。なお、Addメソッドは引数の値だけ無限にガソリンを入れられる仕様になっていますが(もちろんバグです)、今回は無視してください。
9〜11行目
9行目は、テストフィクスチャの宣言部です。テストフィクスチャを記述する場合は、以下のように記述します。なお、「テストフィクスチャ名」は、任意の名前です。
- class テストフィクスチャ名: public ::testing::Test
10行目のアクセス修飾子は、publicかprotectedにしてください。それにより、上位クラス(今回はCarクラス)の変数にアクセスできます。11行目はcarクラスの宣言部です。
12〜16行目
12行目のSetUpは、テストが実施される前に呼ばれるメソッドです。つまり、TEST系マクロですね。この部分に、テストの前提条件を記述できます。今回は、Carクラスをテストする前に動的に生成しています。
17〜21行目
17行目のTearDownは、テスト実施後に実施するメソッドです。今回は、動的確保したCarクラスを開放しています。これで、TESTマクロが増えても、SetUpでCarクラスを生成し、TearDownでCarクラスを解放することになります。
26〜34行目
26〜34行目は、テスト項目を記述した部分です。TEST_Fは、テストフィクスチャ用のマクロです。マクロは、通常のTESTマクロと変わりませんが、次のように使います。
- TEST_F(テストフィクスチャ名, 任意のテスト名)
例題は、TEST_Fを2つ記述しています。TEST_Fを実行するごとに、SetUpとTearDownを実行します。
Copyright © ITmedia, Inc. All Rights Reserved.