クラス・レベル・テスト では、1 つのクラス内またはクラスの小さなクラスター内のメソッド間で、相互作用を実際に行わせてみます。 焦点は、そのクラスが利用者が必要とするユース・ケースをすべてサポートしており、予期しないメソッド・シーケンスを処理できる十分な堅固さを備えているかどうかを検査することです。
シナリオ・ベースのテスト・パターンを使用して、クラス用のシンプルなテスト・ケースを生成します。 例えば、コンストラクターと、そのクラスの場合の最も一般的なフローを表現する一連のメソッドを呼び出します。 テストを生成したら、初期化ポイントを追加し、さらにコンストラクターのパラメーター用のデフォルト・テスト・データ値を幾つか定義してください。 このシンプルなシナリオでは、例えば、オブジェクト値を NULL に設定するための初期化ポイントを追加できます。 これにより、ガーベッジ・コレクターがオブジェクトを破棄できるようになり、結果的に新規クラスのデストラクター・コードが実行されることになります。
テストを実行して、すべてが適切に機能していることを確認します。 このケースでは、テストは 1 回目から成功しなければなりません。なぜなら、コンストラクターに対し、予期される値は 1 つも定義していないからです。 結果を解釈できない場合は、デバッガーを使用してください。 成功するまで、テストを何度でも再実行してください。
クラスをテストする場合、テスト・ケースはそのクラスのいずれかの利用者の役割を果たします。 そのクラスの他のすべての利用者とまったく同じように、必ず一連のメソッドをテスト振る舞いスクリプトから呼び出してください。
データ区分化技法を使用して、適切なテスト・データを定義してください。
フローの全体にわたって、必ず幾つかの検証アクションを定義します。 それぞれの検証アクションで、最後の妥当性検査以降に実行された各アクションが、テスト対象コンポーネントを適切な方法で変更したかどうかを検査する必要があります。
テストが成功するまで、必要なだけテストを繰り返し実行してください。
それぞれ異なるテスト・シナリオを定義して、ユース・ケースのバリエーションを幾つか定義してください。 状態ベースのパス範囲分析を使用すると、さまざまな可能なユース・ケースを考えるのに役立ちます。 テストのバリエーションを定義するには、既存のテストをコピーするか、新しいテストを作成します。
おそらくは、これまでに定義したシナリオは、クラスのユーザーによっていつか使用されるフローを反映していると考えられます。 ただし、予期しないフローも、検討してみる価値があります。 ここでのゴールは、そのクラスが予期しないメソッド・シーケンスを処理できるかどうかを検査し、オブジェクトが決して破壊されないことを確認することです。
より一般性の低いシナリオをテストする場合は、オブジェクトの一生を通じて常に真であるプロパティーを幾つか定義してください。 (そのようなプロパティーは不変 と呼ばれます。) メソッド呼び出しのランダム・シーケンスを定義し、テストの最後には、不変が守られているかどうかを検査するための検証アクションを定義してください。
テスト範囲を評価するには、プロファイル・パースペクティブの「範囲 (Coverage)」ビューに移動して、テスト対象としていたメソッドの場合の範囲を監視します。 行のカバー率が 100% 未満である場合は、新しいシナリオを幾つか追加してください。 コード・カバレッジのモニターについての詳細は、オンライン・ヘルプに記載されています。
追加するデータ・セットを決定するには、カバーされていないコード行を識別します。 通常は、それらの行はコード内で行われる判断 (例えば、if 文など) と関連しています。 非常に多いのは、その条件が常に偽と評価されるので、その判断に続くコード・ブロックがカバーされないという場合です。 このコード・ブロックをカバーするためには、その判断のステートメントがどのようなユース・ケースをカバーするように意図されているのかを理解して、そのユース・ケースを表現するテストを作成する必要があります。