小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


C/C++開発者におくるユニットテストフレームワークGoogleTestの使い方

はじめに

C/C++でユニットテストをやってみようと思い、調べてみたらGoogleTestというC/C++向けのユニットテストフレームワークがあることを知りました。
セットアップの手順や使い方を簡単にですが、まとめてみました。

ソフトウェアのバージョン
  • Visual Studio 2008 Express
  • GoogleTest 1.6.0
GoogleTestの入手

1. 以下のサイトからgtest-1.6.0.zipをダウンロードします。

2. zipファイルを解凍して、任意のフォルダにコピーします。

GoogleTestをビルドする

GoogleTestはそのままでは使えないので、Visual Studioでビルドしてから使います。ただし、古いバージョンのVisual Studioで作られているためか、はじめにVisual Studio変換ウィザードでslnファイルを変換する必要があります。
1. gtest-1.6.0\msvcの中にあるファイルをすべて選択した状態で、右クリックからプロパティを表示して読み取り専用属性を外します。*1
2. gtest-1.6.0\msvc\gtest.slnをダブルクリックで開きます。
3. Visual Studio変換ウィザードが表示されるので、以下の手順で変換を行います。
3-1.「次へ」をクリックします。

3-2.バックアップは作成しなくても良いので、「いいえ」を選択して「次へ」をクリックします。

3-3.「完了」をクリックします。

4. ビルドメニューからデバッグ−バッチビルドを選択します。

5. バッチビルド画面ですべてチェックし、ビルドボタンをクリックします。

6. ビルドが正常終了したら、Visual Studioを終了します。

Visual StudioのプロジェクトでGoogleTestを使うための設定

つづいて、Visual Studioで空のコンソールアプリを作成してから、GoogleTestを使うための設定を行います。ここでは、GoogleTestはC:\Users\Admin\Desktop\gtest-1.6.0にあると仮定します。

1. プロジェクトのプロパティから、C++タブの「全般」を選択して、追加のインクルードディレクトリでGoogleTestのincludeフォルダ("C:\Users\Admin\Desktop\gtest-1.6.0\include")を指定します。

2. リンカタブの「全般」を選択して、追加のライブラリディレクトリでGoogleTestのdebugフォルダ("C:\Users\Admin\Desktop\gtest-1.6.0\msvc\gtest\Debug")を指定します。

3. リンカタブの「入力」を選択して、追加の依存ファイルに以下の2つのファイルを指定します。

  • gtest_maind.lib
  • gtestd.lib


4. C++タブの「コード生成」を選択して、ランタイムライブラリに「マルチスレッドデバッグ(/MTd)」を指定します。*2

サンプルプログラムを作ってテストしてみる

いよいよ、サンプルプログラムを作って動かしてみます。まずメイン関数ではGoogleTestのヘッダファイルをインクルードします。

#include <gtest/gtest.h>

続いて、テストを実行するための"おまじない"を書きます。RUN_ALL_TESTS関数で用意したテストケースを実行するみたいです。

::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();

今回テストする対象の関数は以下のコード。引数を2つもらって、足し算するだけです。

int func1(int x, int y)
{
  return x + y;
}

テストケースはTESTという名前で関数定義します。EXPECT_EQというのはGoogleTestが用意しているマクロで引数1と引数2が一致するかどうかを見てくれます。ここでは1番目の引数に期待する値(1)とfunc1関数に引数1と0を与えた結果を比較します。

TEST(TestCaseName1, TestName1)
{
  EXPECT_EQ(1, func1(1, 0));
}
サンプルプログラムの全体像

以下のようなソースコードを作ってビルドして、実行します。

#include "stdafx.h"
#include <gtest/gtest.h>

// メイン関数
int _tmain(int argc, _TCHAR* argv[])
{
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

// テストする対象の関数
int func1(int x, int y)
{
    return x + y;
}

// テストケース1(引数に1と0を指定して1になるか?)
TEST(TestCaseName1, TestName1)
{
	EXPECT_EQ(1, func1(1, 0));
}

// テストケース2(引数に1と1を指定して1になるか?)
TEST(TestCaseName2, TestName2)
{
    EXPECT_EQ(1, func1(1, 1));
}

実行すると、以下のような画面が表示されます。この結果からテストケース2が期待値と関数の戻り値が一致しないために、テストケースが失敗したことが読み取れます。

以上でGoogleTestの使い方の説明は終わりです。GoogleTestでは、テストケースを開発者が用意すれば、テストの実施を何度でも何回でもほぼ一瞬で実行してくれます。GoogleTestを効果的に使って、関数の品質向上させられるようになると良いと思います。

経験ゼロでもできるプログラミング現場の単体テスト
片桐 一宗
翔泳社
売り上げランキング: 231921

*1:この手順を行わないとソリューションファイルの変換で失敗します。

*2:この設定を行わないと、ビルド時に膨大なエラーがでます。