SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

C/C++に対応した、もうひとつのUnitTestFramework ─ WinUnit

お手軽お気楽なWindows C/C++ テスト環境

前準備

 WinUnitのからくりはこれくらいにして、ともあれ使ってみましょうか。MSDNマガジン2008年2月号に収録されたコードをダウンロード/展開すると、Visual Studio 2005のソリューション一式が手に入ります。ソリューション「WinUnit\WinUnit.sln」をVS2005にロードし、プロジェクト「WinUnit」をreleaseモードでビルドすればディレクトリ「WinUnit\release」に「WinUnit.exe」が生成されます。

Visual C++ 2005 Express EditionでのWinUnitのビルド
 Visual C++ 2005 Express EditionでWinUnitのビルドを行うと、「Version.rc」で「afxres.hをincludeできない」旨のエラーが発生します。これは「afxres.h」がExpress EditionではサポートされていないMFCのヘッダであるからで、当該個所を「windows.h」に置き換えることでビルドが成功します。
Express Editionでの変更箇所
Express Editionでの変更箇所

 WinUnitによる単体テストに必要なのは「WinUnit\Include」にあるヘッダ「WinUnit.h」と 「WinUnitLogger.h」、および生成された「WinUnit.exe」、この3つだけです。

 早速お試し。空のディレクトリに上記3つをコピーし、以下のコード「TestRun.cpp」を用意します。

TestRun.cpp
#include <WinUnit.h>

BEGIN_TEST(Success)
{
  WIN_TRACE("Success: 成功するテスト\n");
  WIN_ASSERT_TRUE(3 < 4);
}
END_TEST

BEGIN_TEST(Failure)
{
  WIN_TRACE("Failure: 失敗するテスト\n");
  WIN_ASSERT_TRUE(3 > 4);
}
END_TEST

 コンパイル/実行してみましょう。コンパイル・オプション「-LD」と「-EHsc」をお忘れなく。

おためし実行
>cl -I. -LD -EHsc -nologo TestRun.cpp
TestRun.cpp
   ライブラリ TestRun.lib とオブジェクトTestRun.expを作成中

>WinUnit TestRun.dll
Processing [TestRun.dll]...
(Failure)
Failure: ???????
TestRun.cpp(13): error : WIN_ASSERT_TRUE failed: "3 > 4".
FAILED: Failure.
(Success)
Success: ???????
[TestRun.dll] FAILED.  Tests run: 2; Failures: 1.

There were errors.
Tests run: 2; Failed: 1.

 ……あれ? テストはちゃんと行われたようですが、日本語が?に化けてますね。WinUnitのlocaleが設定されていないようです。プロジェクトWinUnitにある「Main.cpp」に#include <locale.h>setlocale(LC_ALL,"japanese");を追加して再ビルドしてください。

Main.cppにlocale設定
Main.cppにlocale設定

 localeが正しく設定されれば以下の出力が得られます。

おためし実行(再度挑戦)
>WinUnit TestRun.dll
Processing [TestRun.dll]...
(Failure)
Failure: 失敗するテスト
TestRun.cpp(13): error : WIN_ASSERT_TRUE failed: "3 > 4".
FAILED: Failure.
(Success)
Success: 成功するテスト
[TestRun.dll] FAILED.  Tests run: 2; Failures: 1.

There were errors.
Tests run: 2; Failed: 1.

テストの書き方

 WinUnitを使ったテストコードの書式はとても単純、#include <WinUnit.h> しておいて、テストコードをBEGIN_TEST( 関数名 )END_TESTで囲むだけ。書かれたテストは関数名のアルファベット順に実行されますから、ソース上の定義順とは一致しません。関数名の頭には(内部的に)「TEST_」が付加されるので関数名を数字から始めても構いません。テストの順序をコントロールしたいなら関数名のアタマに「00_」「01_」のような通し番号を振るといいでしょう。

 また、FIXTUREBEGIN_TESTF/END_TESTFを使えばテスト関数を初期化コードと後始末コードで挟み込むことができます。

初期化と後始末
#include <WinUnit.h>

/* 初期化(SETUP)と後始末(TEARDOWN)
   FIXTURE/SETUP/TEARDOWNで一揃い。*/

FIXTURE(my_fixture)

SETUP(my_fixture)
{
  WIN_TRACE("テスト直前に実行\n");
}

TEARDOWN(my_fixture)
{
  WIN_TRACE("テスト直後に実行\n");
}

/* FIXTUREでテストを挟むには
   BEGIN_TESTF/END_TESTF を使うべし */

BEGIN_TESTF(01_Success, my_fixture)
{
  WIN_TRACE("Success: 成功するテスト\n");
  WIN_ASSERT_TRUE(3 < 4);
}
END_TESTF

BEGIN_TESTF(02_Failure, my_fixture)
{
  WIN_TRACE("Failure: 失敗するテスト\n");
  WIN_ASSERT_TRUE(3 > 4);
}
END_TESTF
実行結果
Processing [TestRun.dll]...
(01_Success)
テスト直前に実行
Success: 成功するテスト
テスト直後に実行
(02_Failure)
テスト直前に実行
Failure: 失敗するテスト
テスト直後に実行
TestRun.cpp(31): error : WIN_ASSERT_TRUE failed: "3 > 4".
FAILED: 02_Failure.
[TestRun.dll] FAILED.  Tests run: 2; Failures: 1.

There were errors.
Tests run: 2; Failed: 1.

VisualStudio からのテスト実行

 Visual Studio 2005(Visual C++ 2005 Express)にWinUnitを組み入れる手順を紹介しておきましょう。

 [ツール]-[オプション]で表示される「オプション」ダイアログボックスの[VC++ディレクトリ]で、実行可能ファイル、インクルードファイルのそれぞれに「WinUnit.exe」「WinUnit.h」をコピーしたディレクトリを設定します。例えば 「c:\usr\bin」「c:\usr\include」であったなら、下図のようになります。

VC++ディレクトリ/実行可能ファイル
VC++ディレクトリ/実行可能ファイル
VC++ディレクトリ/インクルードファイル
VC++ディレクトリ/インクルードファイル

 次にテスト・プロジェクトを起こします。あいにくVisual C++ 2005 ExpressはDLLのプロジェクト・テンプレートが用意されていないので、とりあえず「Win32 コンソール アプリケーション」を使い、プロジェクトのプロパティでDLLに変更しましょう。

プロジェクトのプロパティ/全般/構成の種類
プロジェクトのプロパティ/全般/構成の種類

 さらにテストのビルドに成功したら直ちにWinUnitで実行させます。

ビルド後のイベント
ビルド後のイベント

 これで準備完了。先ほどのテストを書いてビルドすると……、

ビルド成功後ただちに実行
ビルド成功後ただちに実行

 エラー一覧には失敗したテストが表示され、ダブルクリックでエラー位置にジャンプできます。便利でしょ!

エラー一覧には...
エラー一覧には...

次のページ
提供されるASSERT群

この記事は参考になりましたか?

特集記事連載記事一覧

もっと読む

この記事の著者

επιστημη(エピステーメー)

C++に首まで浸かったプログラマ。Microsoft MVP, Visual C++ (2004.01~2018.06) "だった"りわんくま同盟でたまにセッションスピーカやったり中国茶淹れてにわか茶...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/2290 2008/03/18 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー