Index: [Article Count Order] [Thread]

Date:  Fri, 26 Jul 2002 22:42:47 +0900
From:  ono@....jp
Subject:  [XP-jp:03614] カバレッジ (Re:  Re: ソフトウェア品質指標についての考察)
To:  extremeprogramming-jp@....jp
Message-Id:  <20020726224247X.ono@....jp>
In-Reply-To:  Your message of "Fri, 26 Jul 2002 01:00:29 +0900"	<20020726005028.E8EB.Y-KAMITE@....jp>
References:  <20020726005028.E8EB.Y-KAMITE@....jp>
X-Mail-Count: 03614

小野です。

>> Regarding [XP-jp:03608] Re: ソフトウェア品質指標についての考察; Yutaka Kamite <y-kamite@....jp> adds:

 > 今日は、上手です。
....

 > 手許にある「ソフトウェアテスト技法」ボリス・バイザー 日経BP出版センター
 > では

 > ステートメントテストP1=c0
 > ブランチテスト=P2=c1

 > となってますね。(P58〜)
 > C0はC1に含まれる、ようですが?
 > 小野さんが、この辺りを深読みされてるのでしたら、私のコメントは外れですが
 > ・・

この本を、私も念頭に置いていました。手元にあったので再確認
しました。
まず C0, C1 という表現からはなれて、私が言いたかったこと
(そしてこの本に書いてあること)を述べると..

------------------------------------------------------

a 「すべての命令語、ステートメントを、最低1回は実行する」
b 「ブランチやCASE文の判定で、全方向へ最低一回は実行する」

というカバレッジを考えたときに、以下の二例で差が出て来ます。

1) 
やりたいこと:
X の値を調べて、0 より小さいときには X に A を足し、
そうでないときには X に 2 * A を足す

正しいプログラム(の一つ)
 |     IF(X.LT.0) GOTO 200
 |     X = X + A
 | 200 X = X + A
 | 300 CONTINUE

間違ったプログラム(上記を実装しようとして間違えた)
 |     IF(X.LT.0) GOTO 200
 | 200 X = X + A
 | 300 CONTINUE

このテストを行う際に、カバレッジ b で検査すればバグが引っ
かかります。しかし、カバレッジ a で検査して X が 0 未満
の時しか調べていない場合には、バグが発見されないことに
なります。

2) 
プログラム例

IF(X) 200, 150, 150
100 X = X + A 
    GOTO 100 
150 X = X + A
200 X = X + A
300 CONTINUE

で、カバレッジ a でやれば 行100 の無限ループが見つかり
ますが、カバレッジ b だと見つからない可能性があります。

こう言った話が、p59 -- p60 にあります。

------------------------------------------------------

というわけで、「分岐の一方がセルフループ」というのは
完全な誤解でした。正解は
  「a sin of omission/書き忘れの害」
とでもいうべきものでした。また本書には、「構造化プログラ
ミング言語で書かれたソフトウェア」では、方式 b を満足すると
方式 a も満足する、と書いています。

というわけで、まあ、上記のような例は現在ではあまり一般的
ではないとも言えるし、 「C1 が C0 を内包する」ということで
よいのだと思います。失礼しました。

(ちなみにバイザーの本では、
   ステートメントテストP1=C1
   ブランチテスト=P2=C2
 としています。なぜに 1 はじまり??)

// Tsuyoshi ONO // 
"Be completely flexible on how we get there, but be totally 
 uncompromising on where we are going." -- Martin Fowler