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

WinUnitによる単体テストに必要なのは「WinUnit\Include」にあるヘッダ「WinUnit.h」と 「WinUnitLogger.h」、および生成された「WinUnit.exe」、この3つだけです。
早速お試し。空のディレクトリに上記3つをコピーし、以下のコード「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");を追加して再ビルドしてください。

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_」のような通し番号を振るといいでしょう。
また、FIXTURE とBEGIN_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」であったなら、下図のようになります。
次にテスト・プロジェクトを起こします。あいにくVisual C++ 2005 ExpressはDLLのプロジェクト・テンプレートが用意されていないので、とりあえず「Win32 コンソール アプリケーション」を使い、プロジェクトのプロパティでDLLに変更しましょう。
さらにテストのビルドに成功したら直ちにWinUnitで実行させます。
これで準備完了。先ほどのテストを書いてビルドすると……、
エラー一覧には失敗したテストが表示され、ダブルクリックでエラー位置にジャンプできます。便利でしょ!






