第2回 C++アプリケーションの効率的なテスト手法(CppUnit編):連載 C++開発者のための単体テスト入門(1/4 ページ)
効率的なテスト手法の1つが単体テストだ。CppUnitというフレームワークの活用例を通して単体テストの有効性を理解しよう。
前回は単体テストの重要性を示し、従来のC/C++でのテスト手法であるprintf関数やassertマクロを使ったテストを紹介しました。この2つのテスト手法は開発環境(コンパイラとライブラリ)さえあれば利用でき、その使い方も簡単です。しかしながら、いずれも系統立てて、効率よくテストを行うには力不足の感が否めません。
今回は、Visual C++ 2005 Express Editionを含むVisual Studio 2005(以後、VS 2005)で利用できる代表的な単体テスト・フレームワーク(Unit Test Framework)の1つである「CppUnit」を紹介します。
■単体テスト・フレームワークとは?
前回、「バグは早期発見が望ましい。早期に見つけるほど原因究明もその対処も楽だ」と述べました。そのためには、短い間隔、すなわちほんの少しでもコードに変更を加えたらすぐさまテストし、“常に信頼できる状態”を維持することが重要です。それには、柔軟なテスト環境を構築すること、加えて多数のテスト項目を短時間にこなしてくれるツールの導入が効果的です。
前回紹介したprintf関数とassertマクロは単純ではありますが、それぞれに欠点があります。printf関数による結果出力では、その結果が正しいか否かを検証するのは人の目に頼るのですから、「短時間に何度も」というわけにはいきません。また、assertマクロはテストに失敗するとその時点でテスト実行が停止しますので、すべてを一度にテストできない可能性があります。願わくは、多数のテストをまとめて実行し、失敗したテスト項目の一覧を出力してもらいたいものです。
今回のCppUnitは「短時間に何度もテストする」「一度にまとめてテストして失敗項目を一覧表示する」という2つの要求を満たしてくれるサポート・ライブラリおよびテスト実行環境です。
■CppUnit導入手順
それではまず、CppUnitの導入手順について解説します。CppUnitはSourceForgeから無償で入手できます。以下のサイトから最新バージョン(執筆時点では1.12.0)のソース・コード(cppunit-1.12.0.tar.gz)とドキュメント(cppunit-docs-1.12.0.tar.gz)をダウンロードし、それぞれ適当なディレクトリに展開しておきます(ソースを展開したディレクトリを、以後、「<CPPUNIT_PATH>」と表記します)。
以下では、ダウンロードしたCppUnitのソース・コードをVS 2005でビルドし、テストに必要となるライブラリを作成していきます。
VS 2005を立ち上げ、メニュー・バーから[ファイル]−[開く]−[プロジェクト/ソリューション]を選び、表示される[プロジェクトを開く]ダイアログで「<CPPUNIT_PATH>\examples\cppunittest\CppUnitTestMain.dsw」を開きます。このファイルは、Visual C++ 6.0のものであるため、プロジェクトの変換を促すダイアログが表示されます。[すべてはい]を選んでソリューションに変換してください。
プロジェクトの変換が完了すると、[ソリューション エクスプローラ]には下の画面に示す3つのプロジェクト(「cppunit」「cppunit_dll」「CppUnitTestMain」)が現れます。
プロジェクト変換後の[ソリューション エクスプローラ]の内容
プロジェクトの変換が完了すると、「cppunit」「cppunit_dll」「CppUnitTestMain」という3つのプロジェクトが現れる。
cppunitプロジェクトはCppUnitのスタティック・ライブラリ、cppunit_dllプロジェクトはCppUnitのダイナミック・ライブラリです。そして、CppUnitTestMainプロジェクトはCppUnit自体のテストを行うアプリケーション・プロジェクトです。
ここで[ソリューション エクスプローラ]で「CppUnitTestMain」項目を右クリックし、[スタートアップ プロジェクトに設定]してください(スタートアップ・プロジェクトに設定してあれば、上の画面のように太字になります)。
次に依存関係を設定します。CppUnitTestMainプロジェクトはcppunit/cppunit_dllプロジェクトをテストするものですから、CppUnitTestMainプロジェクトのビルドに先立ってcppunit/cppunit_dllプロジェクトがビルドされ、ライブラリが生成されていなければなりません。再び「CppUnitTestMain」項目を右クリックし、コンテキスト・メニューから[プロジェクト依存関係]を選択して、[プロジェクトの依存関係]ダイアログを表示します。そこで、次の画面のように、CppUnitTestMainプロジェクトをcppunit/cppunit_dllプロジェクトに依存させます。
これでビルド準備は完了。IDEのメニュー・バーから[ビルド]−[バッチ ビルド]を選択して、[バッチ ビルド]ダイアログを表示します。そこで、次の画面のように、CppUnitTestMainプロジェクトを構成する4つのプロジェクトをチェックして[ビルド]します。
これによりCppUnitライブラリがビルドされ、引き続いてCppUnitTestMainアプリケーションがビルドされます。ビルドが完了すると、ディレクトリ「<CPPUNIT_PATH>\src\cppunit」に「Debug」「DebugDLL」「Release」「ReleaseDLL」というディレクトリが新たに作成され、それぞれにスタティック・ライブラリ(.libファイル)とダイナミック・ライブラリ(.dllファイル)が生成されます。
生成されたライブラリ・ファイルは、以下の表のとおりとなります。
フォルダ | 生成されたファイル | ライブラリ種別 | ビルド種別 |
---|---|---|---|
Debug | cppunitd.lib | スタティック | デバッグ |
DebugDLL | cppunitd_dll.lib cppunitd_dll.dll |
ダイナミック | |
Release | cppunit.lib | スタティック | リリース |
ReleaseDLL | cppunit_dll.lib cppunit_dll.dll |
ダイナミック | |
単体テスト・フレームワーク「CppUnit」のライブラリ・ファイルの内容 |
これらのライブラリ・ファイルから、テスト対象のプロジェクト設定に合わせて適切なものを選択することになります。生成されたスタティック・ライブラリとダイナミック・ライブラリは、次の画面のように「<CPPUNIT_PATH>\lib」にコピーされるので、実際にはこれを使うことになります。
CppUnitを使ったテストの実装と実行には、これらライブラリ・ファイルと「<CPPUNIT_PATH>\include」に格納されているヘッダ群が必要となります。特に拡張子が「.dll」であるダイナミック・ライブラリは、テストの実行時に動的にロードされるので、環境変数「PATH」に設定されたディレクトリにコピーしておくと、自動的に見つけられてロードされるので便利です。
以上でCppUnitの準備は完了です。
Copyright© Digital Advantage Corp. All Rights Reserved.