SourceForge.jp 200x40(8244bytes)

ソフトウェアテストの基本

  特にxUnit系に代表されるソフトウェアテストには、 実施するにあたり当然知っておくべき大前提というものがあります。 ここではそれについて何点かあらかじめ紹介することで、 これからCppUnit-xを紹介するにあたって、 驚いたり、疑問に思ったりすることがないようにしたいと思います。

ソフトウェアテストは、テストコードと被テストコードを分ける

  ソフトウェアテストを行う場合、 テストコードと被テストコードを明確に分けてください。 混在してはいけません。
  これはテストコードが実際の製品実行に対し 悪影響を及ぼすのを防ぐためです。
  ソフトウェア内部の設定パラメータや DB値を見るツールと、ソフトウェアテストとは別ものです。 よく混同している人がいますので注意してください。

ソフトウェアテストは、入力と出力をテストする

  テスト対象(関数、クラス、……) に対して入力を与えることによって、 出力/振る舞いの正当性を確認します (当たり前なのですが……)。
  ここからが重要なのですが、 したがって、 入力値を自分で用意する必要があります。
  また、 出力値を取得して目標値と比較することができる状態にする 必要があります。 出力値を取得するためには、Java/C++の場合は、 上書きにより(いわゆるMock オブジェクト)、 C/C++の場合は、ファイル差し替えによるドライバによって、 出力側メソッド/関数からデータを用意に取得できるようにします。
  なお、C言語の場合については、 本稿に記載していますので参照してください。

ソフトウェアテストは、OKかNGの2値で結果が分かる

  よくソフトウェアテストというと、 System.out.println(Javaの場合)や、 printf(C/C++の場合)でデータ値を出力させて、 その値が正しいかを目視でチェックすることを言っている人がいますが、 それはテストとして良い手法ではありません
  目視によるチェックにしてしまうと、 そのテスト結果が正しいかどうかを確認するために、 そのプログラムと結果についてそれなりの知識と経験が必要になって しまいます。
  したがってなるべく統一されたフォーマットで、 簡単に結果が分かるようにする必要があります。 テストを実施するのは、 プログラムを作った人だけではありません。 どんな人が実施しても、 結果がOKまたはNGの2値で分かるようでなければ、 テストの正当性を保証できないのです。

ソフトウェアテストは、ロジックの正当性を保証しない

  プログラムに対して決めたシーケンス通りに動いているか? というテストはできますが、 そのシーケンス自体が仕様レベルで正しいものなのか? というテストはできません。

  それは人間が考える領域です。

  レビュー等をしっかり行い、 仕様上の問題点を洗い直しましょう。

ソフトウェアテストは、出戻りバグに強いく修正バグに弱い

  これは経験則です。
  ソフトウェアテストは、 一度作成すれば何度でも瞬時にテストできます。 したがってある箇所を修正したことによる影響により、 他の箇所に対する派生バグが出るような場合は、 そこに対するテストが行われている場合、 直ちに検出できるというメリットがあります。
  しかし修正バグにはかなり弱いです。 修正した箇所にソフトウェアテストによる網が張られている場合、 すべてエラーとして検出するからです。 修正量が多い場合、工数が爆発します。
ando@park.ruru.ne.jp