テスト対象コンポーネント (CUT: component-under test) の詳細な静的分析メトリックは、テストの優先順位付けの方法を決定するのに役立つことがあります。
メトリックには、コンポーネントのアーキテクチャー、コンポーネントの複雑さ、およびテスト範囲をそれぞれ分析するものがあります。
CUT を構成するソース・ファイルの選択を済ませると、静的メトリックが「新規 Java™ コンポーネント・テスト」ウィザード内に表示されます。
このステージでは、データをソートし、さらにデータを表示または非表示にして、最適なテスト戦略を決定できます。
- アーキテクチャーに関するメトリック : 依存レベル、ファンイン、ファンアウト、および EXT ユーザー。
これらは、メソッド呼び出し、継承、または変数の使用法などについて、その関係の複雑さを測定します。
- コンポーネントの複雑さに関するメトリック : 属性、メソッド、ステートメント、および V(g)。
これらのメトリックは、ソース・コードのコントロール・フローの複雑さを測定します。
- テスト範囲に関するメトリック : 行 (%) および テスト。
範囲のメトリックは、そのコードをさらにテストする必要があるかどうかを指示します。
「行 (%)」は、テストでカバーされたコード行のパーセントを示します。
「テスト」は、クラスのメソッドを直接使用するテストの数を示します。
メトリックを使用したテストの計画
テストを計画する際に、以下の提案が役立つ場合があります。
- テストの対象範囲の比率が最も高くなるコンポーネントを集中的にテストする。
「ファンアウト」メトリックは、クラスの外側で定義されているメソッドまたは属性の使用回数を示します。
これにより、対象範囲の比率に大きな影響を与えるクラスがよく分かります。
「ファンアウト」のスコアが大きいクラスに対してスタブをまったく使用しないテストを行うと、コードの大部分を迅速にテストできます。
一方、このようなクラスに対して厳密な単体テスト (スタブを使用してコンポーネントを分離) を行う場合は、多くのスタブを作成するために多大な労力を要求されます。
- 機能的に重要なコンポーネントを集中的にテストする。
たとえば、そのクラス内の public 属性の数と public メソッドの数の合計を表す「ファンイン」、または、そのクラスの属性またはメソッドを使用する外部コンポーネントの数を表す「EXT ユーザー」などのメトリックを確認してください。
これらの値が大きいほど、クラスに変更を加えた場合に回帰が発生するリスクが大きいということです。
したがって、そのようなクラスは徹底的にテストする必要があります。
- 最も複雑なコンポーネントを集中的にテストする。
複雑さの指標となるのは、主にサイクロマティック複雑度の数値 (V(g)) とコード内のステートメント数です。
通常は、V(g) は 1 から 10 の間で変わります。ここで、値 1 はそのコードにはブランチが存在しないことを意味します。
- 各クラスのすべてのメソッドを個別にテストする場合であっても、必ずクラス・レベル・テストを定義する。
これは、必ずしも個別クラスをすべてテストする必要があるということを意味するわけではありません。
例えば、密結合のクラスが幾つかあり、その中の 1 つのクラスをテストするには、それ以外のクラスをすべてスタブしなければならない場合は、3 個から 10 個のクラスを一緒にした小さなクラスターをテストすることを検討してください。
- 1 つのユニットとしてテストする必要のあるサブシステムまたは大きなクラスターを識別する。
サブシステムは、以下の基準のいずれかと合致する場合には 1 つのユニットとしてテストする必要があります。
- 別の開発者に引き渡す必要のある相互依存性を持つクラスがある。
- それらのクラス間で相互作用し、さらにクラス・レベル・テスト中にスタブした他のクラスとも相互作用するクラスがある。
レベル標識を使用して、アプリケーションの呼び出しグラフでクラスの依存レベルを評価してください。
- テストの最初のシリーズを実行し終えたら、対象となった行の比率 (「行 (%)」) とコンポーネントに適用されるテスト数 (「テスト」) を使用して、前のテストではまだ十分にはカバーされていないコンポーネントをすべて識別できます。