同値分割または同値クラス分割(ECP)[1]は、ソフトウェアユニットの入力データをテストケースを導出できる同等のデータのパーティションに分割するソフトウェアテスト手法です。原則として、テストケースは各パーティションを少なくとも1回カバーするように設計されています。この手法は、エラーのクラスを明らかにするテストケースを定義しようとし、それによって開発する必要があるテストケースの総数を減らします。このアプローチの利点は、テストケースの数が少ないため、ソフトウェアのテストに必要な時間が短縮されることです。
等価パーティションは通常、テスト対象コンポーネントの入力に適用されますが、まれに出力に適用されることもあります。等価パーティションは通常、テスト オブジェクトの処理に影響する入力属性の要件仕様から派生します。
ECP の基本概念は同値クラスに由来し、同値クラスは同値関係に由来します。ソフトウェア システムは、実質的には、何らかの実装プログラミング言語でアルゴリズムとして実装された計算可能な関数です。入力テスト ベクトルが与えられると、そのアルゴリズムの一部の命令はカバーされますが (詳細についてはコード カバレッジを参照)、その他はカバーされません。これにより、入力テスト ベクトル間に興味深い関係が生まれます。 ベクトルa、bのカバレッジ フットプリントがまったく同じ場合、つまり同じステップで同じ命令をカバーする場合に限り、テスト ベクトル a、b 間に同値関係があります。これは明らかに、関係カバーC がテスト ベクトルのドメインを 複数の 同値クラスに分割することを意味します。この分割は、テスト入力の同値クラス分割と呼ばれます。N個の同値クラスがある場合、システムを完全にカバーするにはN 個のベクトルだけで 十分です。
デモンストレーションはCで書かれた関数を使用して行うことができます:
int safe_add ( int a , int b ) { int c = a + b ; if ( a > 0 && b > 0 && c <= 0 ) { fprintf ( stderr , "オーバーフロー (正)! \n " ); } if ( a < 0 && b < 0 && c >= 0 ) { fprintf ( stderr , "オーバーフロー (負)! \n " ); } return c ; }
コードに基づいて、[ a , b ]の入力ベクトルが分割されます。カバーする必要があるブロックは、正方向、負方向、およびこれら 2 つのどちらでもないオーバーフローです。コードレビュー自体から、3 つの同等のクラスが生成されます。

入力問題を解くために、不等式に頼る。
整数(コンピュータサイエンス)のサイズは固定されているため、z は次のように置き換えることができます。
- INT_MIN ≤ x + y ≤ INT_MAX
そして
ただし、x ∈ { INT_MIN , ... , INT_MAX }かつy ∈ { INT_MIN , ... , INT_MAX }
INT_MIN = x + yおよびINT_MAX = x + yという厳密な等式条件での テスト ベクトルの値は境界値と呼ばれ、境界値分析にはこれに関する詳細情報があります。グラフはオーバーフローの場合のみ、X および Y の正の値の最初の象限のみをカバーしていることに注意してください。
一般的に、入力には有効な範囲と無効な範囲があります。ここでの無効なデータは、データが間違っているという意味ではなく、このデータが特定のパーティションの外側にあるという意味です。これは、パラメータ「月」を取る関数の例で説明できます。月の有効な範囲は 1 から 12 で、1 月から 12 月を表します。この有効な範囲はパーティションと呼ばれます。この例では、無効な範囲のパーティションがさらに 2 つあります。最初の無効なパーティションは ≤ 0 で、2 番目の無効なパーティションは ≥ 13 です。
... -2 -1 0 1 ................... 12 13 14 15 ....
--------------|-----------------|-------------- ------
無効なパーティション 1 有効なパーティション 無効なパーティション 2
同値分割に関連するテスト理論では、関連するパーティションのプログラムの動作を評価するには、各パーティションの 1 つのテスト ケースのみが必要であるとされています。言い換えると、プログラムの動作を確認するには、各パーティションから 1 つのテスト ケースを選択するだけで十分です。パーティションのテスト ケースをさらに使用したり、すべてのテスト ケースを使用したりしても、プログラムに新しい障害は見つかりません。1 つのパーティション内の値は「同値」であると見なされます。したがって、テスト ケースの数を大幅に削減できます。
この手法を適用すると、いわゆる「ダーティ」なテスト ケースも見つかるという追加の効果もあります。経験の浅いテスターは、月の入力データ 1 から 12 をテスト ケースとして使用してしまい、無効なパーティションの一部を選択し忘れることがあります。その結果、一方では不要なテスト ケースが大量に発生し、他方ではダーティ範囲のテスト ケースが不足することになります。
等価性パーティション分割は、ソフトウェアの内部構造を考慮せずに、ソフトウェア コンポーネントをインターフェイスで厳密にチェックする、いわゆるブラック ボックス テストに関連付ける傾向があります。しかし、この主題を詳しく調べると、グレー ボックス テストにも適用される場合があります。上記の例のように、有効範囲が 1 から 12 までのコンポーネントへのインターフェイスを想像してください。ただし、内部的には、関数は 1 から 6 までの値と 7 から 12 までの値で区別している可能性があります。入力値に応じて、ソフトウェアは内部的に異なるパスを実行して、わずかに異なるアクションを実行します。コンポーネントへの入力インターフェイスと出力インターフェイスに関しては、この違いは認識されませんが、グレー ボックス テストでは、両方のパスが検査されるようにする必要があります。これを実現するには、ブラック ボックス テストには必要ない追加の等価性パーティションを導入する必要があります。この例では、次のようになります。
... -2 -1 0 1 ..... 6 7 ..... 12 13 14 15 .....
--------------|----------|----------|-------------- -------
無効なパーティション 1 P1 P2 無効なパーティション 2
有効なパーティション
期待される結果を確認するには、出力インターフェイスではなく、内部の中間値を評価する必要があります。各パーティションから複数の値を使用する必要はありません。上記のシナリオでは、無効なパーティション 1 から -2、有効なパーティション P1 から 6、有効なパーティション P2 から 7、無効なパーティション 2 から 15 を取得できます。
同値分割は、テストケースを決定するためのスタンドアロンの方法ではありません。境界値分析によって補完される必要があります。可能な入力のパーティションを決定したら、境界値分析の方法を適用して、これらのパーティションから最も効果的なテストケースを選択する必要があります。
制限事項
関係するデータ範囲またはセットが近似的に単純であり(例:0-10、11-20、21-30)、すべての値をテストすることが実際的である場合、範囲内および範囲に隣接するすべての値を使用した包括的なテストカバレッジを検討する必要があります。ソフトウェアにテスターに知られていないサブパーティションが含まれている場合、包括的なテストカバレッジにより、等価分割法では検出されないバグが明らかになることがあります。[2]また、単純なケースでは、等価分割を使用してテスト値の数を減らすことの利点は、より大きな範囲(例:0-1000、1001-2000、2001-3000)を含む場合と比較して減少します。
さらに読む
- 試験基準ワーキング パーティの Web サイト
- Parteg は、UML ステート マシンからのテスト パス生成と入力値の等価クラス生成を組み合わせた無料のテスト生成ツールです。
- https://books.google.com/books/about/Software_Testing_Techniques.html
