連載
» 2007年07月20日 00時00分 公開

連載 C++開発者のための単体テスト入門:第1回 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.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;
}

printf関数で記述したabs_compare関数をテストするソース・ファイル(abs_math_test.cpp)

 これだけのテストを行い、期待どおりの結果が得られれば、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]ダイアログが表示される

[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]ダイアログが表示される

[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.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。