第1回 C++開発者の皆さん。テスト、ちゃんとしていますか?:連載 C++開発者のための単体テスト入門(2/4 ページ)
人海戦術による膨大な手動テスト、やっていませんか? 一般的なテスト方法を振り返り、より効率的な手法を考える新連載。
■従来のテスト手法[1]:printf関数の活用
簡単な例を考えましょう。本稿では次のような関数を取り上げてみます。
【関数の定義内容】
int abs_compare(int x, int y);
【関数の実装内容】
x、y双方の絶対値「|x|」と「|y|」を比較し、
「|x| < |y|」なら「-1」、
「|x| = |y|」なら「0」、
「|x| > |y|」なら「1」
を返す。
abs_compare関数の仕様
この仕様を満たす関数を実装しましょう。まずヘッダ・ファイル(abs_math.h)を書きます。
#ifndef ABS_MATH_H__
#define ABS_MATH_H__
#ifdef __cplusplus
extern "C" {
#endif
int abs_compare(int x, int y);
#ifdef __cplusplus
}
#endif
#endif /* ABS_MATH_H__ */
この段階で、さっそくテストを書くことができます。実際にabs_compare関数を呼び出して“期待される振る舞い”(=期待される結果)が得られるか否かを確認すればいいですね。
次のコード(ソース・ファイル:abs_math_test.cpp)は、引数の組をいくつか用意して、abs_compare関数のテストを書いたものです。ここでのテストには、C/C++開発者なら誰もが知っているprintf関数(=メッセージをコンソール出力する関数)を使っています。
#include <cstdio>
#include "abs_math.h"
using namespace std;
void abs_compare_test() {
/* 0 を返すケース */
printf("line:%d result = %d\n", __LINE__, abs_compare( 2, 2));
printf("line:%d result = %d\n", __LINE__, abs_compare( 2,-2));
printf("line:%d result = %d\n", __LINE__, abs_compare(-2, 2));
printf("line:%d result = %d\n", __LINE__, abs_compare(-2,-2));
/* 1 を返すケース */
printf("line:%d result = %d\n", __LINE__, abs_compare( 3, 2));
printf("line:%d result = %d\n", __LINE__, abs_compare( 3,-2));
printf("line:%d result = %d\n", __LINE__, abs_compare(-3, 2));
printf("line:%d result = %d\n", __LINE__, abs_compare(-3,-2));
/* -1 を返すケース */
printf("line:%d result = %d\n", __LINE__, abs_compare( 2, 3));
printf("line:%d result = %d\n", __LINE__, abs_compare( 2,-3));
printf("line:%d result = %d\n", __LINE__, abs_compare(-2, 3));
printf("line:%d result = %d\n", __LINE__, abs_compare(-2,-3));
}
int main() {
abs_compare_test();
return 0;
}
これだけのテストを行い、期待どおりの結果が得られれば、abs_compare関数は“信頼できる関数”といえるでしょう。Visual Studio 2005またはVisual C++ 2005 Express Edition(以下、Visual Studio)を使って、実際にこのテストを実行してみましょう。
Visual Studioを立ち上げ、ソリューション&プロジェクトを作ります。ソリューション名は「my_library」、プロジェクトは「abs_math」という名前の「スタティック・ライブラリ」としましょうか。ソリューション&プロジェクトの作成手順は以下の画面を参考にしてください。
[新しいプロジェクト]ダイアログ
Visual C++ 2005の「Win32 プロジェクト」を作成しているところ。このダイアログを表示するには、メニュー・バーから[ファイル]−[新規作成]−[プロジェクト]を選択すればよい。ここでは、左の[プロジェクトの種類]で[Visual C++]−[Win32]を選択し、右の[テンプレート]から「Win32 プロジェクト」を選択する。[プロジェクト名]には「abs_math」を、[場所]には任意のフォルダ・パス(この例では「D:\work」)を、[ソリューション名]には「my_library」を入力し、最後に[OK]ボタンをクリックする。
[Win32 アプリケーション ウィザード - abs_math]ダイアログ
最初に表示される[概要]ページではすぐに[次へ]ボタンをクリックする。次に表示される[アプリケーションの設定]ページで、[アプリケーションの種類]として「スタティック ライブラリ」を選び、[プリコンパイル済みヘッダー]のチェックボックスを外して[完了]ボタンをクリックする。
以上の手順により、ソリューション「my_library」と空のプロジェクト「abs_math」が生成されます。これに、前述のヘッダ・ファイル(abs_math.h)を、次の画面の手順で追加します。
[新しい項目の追加 - abs_math]ダイアログ
このダイアログを表示するには、[ソリューション エクスプローラ]ウィンドウのプロジェクト項目「abs_math」を右クリックして、表示されるコンテキスト・メニューの[追加]−[新しい項目]を選択すればよい。ここでは、左の[カテゴリ]で「Visual C++」−「コード」を選び、右の[テンプレート]で「ヘッダー ファイル (.h)」を選択する。[ファイル名]には「abs_math.h」を入力し、[場所]は変更せずに(この例では「D:\work\my_library\abs_math」)、[追加]ボタンをクリックする。
abs_math.hファイルが追加できたら、そこに先ほど示した「abs_compare関数を定義するヘッダ・ファイル(abs_math.h)」のコード内容を記述します。
次に、(ソリューションに)テスト・プロジェクト「abs_math_test」を「コンソール・アプリケーション」として追加します。その際の手順は以下のとおりです。
[新しいプロジェクトの追加]ダイアログ
このダイアログを表示するには、[ソリューション エクスプローラ]ウィンドウのソリューション項目「my_library」を右クリックして、表示されるコンテキスト・メニューの[追加]−[新しいプロジェクト]を選択すればよい。ここでは、左の[プロジェクトの種類]で[Visual C++]−[Win32]を選択し、右の[テンプレート]から「Win32 コンソール アプリケーション」を選択する。[プロジェクト名]には「abs_math_test」を、[場所]は変更せずに(この例では「D:\work\my_library」)、[OK]ボタンをクリックする。
[Win32 アプリケーション ウィザード - abs_math_test]ダイアログ
最初に表示される[概要]ページではすぐに[次へ]ボタンをクリックする。次に表示される[アプリケーションの設定]ページで、[アプリケーションの種類]として「コンソール アプリケーション」を選び、[空のプロジェクト]のチェックボックスにチェックを入れて[完了]ボタンをクリックする。
以上の手順で、テスト・プロジェクト「abs_math_test」が追加されます。このプロジェクトにソース・ファイル(C++ファイル)「abs_math_test.cpp」を追加し、前述した「printf関数で記述したabs_compare関数をテストするソース・ファイル(abs_math_test.cpp)」のコード内容を書き込んでください。
Copyright© Digital Advantage Corp. All Rights Reserved.