第1回 C++開発者の皆さん。テスト、ちゃんとしていますか?:連載 C++開発者のための単体テスト入門(3/4 ページ)
人海戦術による膨大な手動テスト、やっていませんか? 一般的なテスト方法を振り返り、より効率的な手法を考える新連載。
さらにここで、スタティック・ライブラリ・プロジェクトの「abs_math」に依存関係を設定します。プロジェクトの依存関係の設定方法は、次の画面を参考にしてください(※ファイルの追加方法については先ほどとほぼ同じなので説明は割愛します)。
プロジェクトの依存関係の設定方法
[ソリューション エクスプローラ]ウィンドウのソリューション項目「abs_math_test」を右クリックして、表示されるコンテキスト・メニューの[プロジェクト依存関係]を選択する。これにより[プロジェクトの依存関係]ダイアログが表示されるので、[依存関係]タブを開き、[プロジェクト]から「abs_math_test」を選んだ状態で、[依存先]の「abs_math」にチェックを入れる。最後に[OK]ボタンをクリックすれば完了。
さらにテスト・コードがabs_math.hファイルをインクルードできるよう、次の画面の手順でインクルード・パスを設定しましょう。
インクルード・パスの設定方法
[ソリューション エクスプローラ]ウィンドウのソリューション項目「abs_math_test」を右クリックして、コンテキスト・メニューから[プロパティ]を選択する。これによりこの[abs_math_test プロパティ ページ]ダイアログが表示される。まず[構成]から「すべての構成」を選び、次に左のツリーから[構成プロパティ]−[C/C++]−[全般]を選択して、右の[追加のインクルード ディレクトリ]に「../abs_math」を入力し、最後に[OK]ボタンをクリックして完了。
ここでテスト・プロジェクト「abs_math_test」をビルドすると、「ファイル '..\debug\abs_math.lib' を開くことができません。」というエラーとなります。当然ですね、まだ求められる関数abs_compareの実装がないのですから。ライブラリ・プロジェクト「abs_math」にソース・ファイル(C++ファイル)「abs_compare.cpp」を追加します。ビルドを成功させるため、関数abs_compareの実装は取りあえず“常に0を返す”ことにします。次の画面はこれを実装したところです。
これでソリューション全体をビルドしてみてください。無事にすべてのビルドが成功し、ライブラリ「abs_math.lib」とテスト「abs_math_test.exe」が生成されます。「abs_math_test」プロジェクトをスタートアップ・プロジェクトに設定して(=[ソリューション エクスプローラ]でプロジェクト項目を右クリックして[スタートアップ プロジェクトに設定]を選択)、IDEのメニュー・バーから[デバッグ]−[デバッグなしで開始](または[Ctrl]+[F5]キー)を実行してください。次のような結果が得られるはずです。
printf関数によるテスト「abs_math_test.exe」の実行結果(期待される結果ではない……)
先ほどのabs_compare関数の実装で、すべて「return 0;」で戻り値を返すようにしたため、期待される結果とはならない。
これでテストと実装の準備は整いました。期待する結果が得られるよう、ここからabs_compare関数を実装してみてください。仕様どおりに正しく実装されれば、次の実行結果が得られます。
abs_compare関数が仕様を満たしているか否かを検証できるだけの十分なテスト・ケースをテスト関数abs_compare_testが網羅しており、実行結果が全テスト・ケースに対して成功することを示しているならば、あなたの書いたabs_compare関数は完ぺきであることが保証されたことになります。
この例から「関数のテスト」の手順が分かりますが、この手順はC++の「クラスのテスト」であってもまったく同様です。すなわち、
- 仕様からクラスの宣言部(ヘッダ)が定まった時点で
- クラスのメソッドを1つ選び、
- そのメソッドが満たすべき要件を基にテスト・コードを書く。
- メソッドを実装し、テストする。必要に応じてテスト・コードに追加/修正を施す。
- テスト・ケースのすべてが成功するまで3-4を繰り返す。
- 全メソッドに対して2-3-4-5を繰り返す。
ここで重要なのは、テスト・ケースは実装作業とともに次第に増えていき、それらは毎回すべてテストされるということです。それによっていままで正しく動いていた関数/メソッドの実装が進むうちにいつの間にか動かなくなる“デグレード”を速やかに検出できるのです。
Copyright© Digital Advantage Corp. All Rights Reserved.