設計述語は、トーマス・マッケイブ[1]が考案した、2つのソフトウェアユニットの統合の複雑さを定量化する方法です。4種類の設計述語のそれぞれには、統合の複雑さの評価が関連付けられています。複数の設計述語を適用するコード部分については、統合の複雑さの評価を組み合わせることができます。
コード単位の統合の複雑さの合計に 1 を加えたものが、統合を完全に実行するために必要なテスト ケースの最大数です。ただし、テスト エンジニアは通常、新しいテストごとに、これまでカバーされていなかった設計述語を可能な限り多くカバーすることで、この数を減らすことができます。また、設計述語の組み合わせによっては、論理的に不可能な場合があります。
通話の種類
無条件の呼び出し
ユニット A は常にユニット B を呼び出します。この場合、積分複雑度は 0 になります。例:
ユニットA::関数A() {
ユニットB->関数B();
}
条件付き呼び出し
ユニット A はユニット B を呼び出す場合と呼び出さない場合があります。この統合の複雑度は 1 で、B を呼び出すテストと呼び出しないテストの 2 つのテストが必要です。
ユニットA::関数A() {
if (条件)
ユニットB->関数B();
}
相互に排他的な条件呼び出し
これはプログラミング言語のswitch ステートメントに似ています。ユニット A は、複数の可能なユニットのうち 1 つだけを呼び出します。統合の複雑さは n - 1 です。ここで、n は呼び出すことができるユニットの数です。
ユニットA::関数A() {
スイッチ(条件){
ケース1:
ユニットB->関数B();
壊す;
ケース2:
ユニットC->関数C();
壊す;
...
デフォルト:
ユニットN->関数N();
壊す;
}
}
反復呼び出し
反復呼び出しでは、ユニット A はユニット B を少なくとも 1 回呼び出しますが、複数回呼び出す場合もあります。この統合の複雑度は 1 です。また、ユニット B を 1 回呼び出すテストと、ユニット B を複数回呼び出すテストの 2 つのテストも必要です。
ユニットA::関数A() {
する {
ユニットB->関数B();
} while (条件);
}
通話の結合
特定の統合では、複数の種類の呼び出しを組み合わせることができます。たとえば、ユニット A はユニット B を呼び出すことも呼び出さないこともあります。呼び出す場合は、1 回以上呼び出すことができます。この統合では、統合の複雑度が 1 の条件付き呼び出しと、統合の複雑度が 1 の反復呼び出しを組み合わせています。統合の複雑度は合計 2 になります。
ユニットA::関数A() {
(何らかの数値が0より大きい場合)
(i = 0; i < someNumber; i++) の場合 {
ユニットB->関数B();
}
}
}
テスト数
必要なテストの数は、統合の複雑さの合計に 1 を加えた数なので、この統合には 3 つのテストが必要です。1 つは、someNumber が 0 より大きくないため、ユニット B は呼び出されません。もう 1 つは、someNumber が 1 であるため、ユニット B が 1 回呼び出されます。最後の 1 つは、someNumber が 1 より大きいため、ユニット B が複数回呼び出されます。
