CUnit for Mr.Ando.

English -->

# ソフトウェアテストの基本
The overview of a software test.

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

## ソフトウェアテストは、テストコードと被テストコードを分ける
The file of a source code and a test code is isolated.

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

## ソフトウェアテストは、入力と出力をテストする。
A software test tests an input and an output.

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

## ソフトウェアテストは、OKかNGの２値で結果が分かる。
A result understands a software test with two values of O.K. or NG.

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

## ソフトウェアテストは、ロジックの正当性を保証しない。
A software test does not guarantee the justification of logic.

プログラムに対して決めたシーケンス通りに動いているか？ というテストはできますが、 仕様がそもそも正しいか？ というテストはできません。
それは人間が考える領域です。
レビュー等をしっかり行い、 仕様上の問題点を洗い直しましょう。
A software test does not guarantee the justification of logic. A software test does not guarantee the justification of specification. In order to guarantee the justification of specification, let's review with a stakeholder!

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

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