なひです。詳しい人がかわりに説明してくれるのを
待っていたのですが。。。^^;
それでは説明してみます。間違ってたら突っ込んでくださいね、
特にswtest方面の方々。
> From: Shibukawa Yoshiki [mailto:yoshiki@....jp]
> Sent: Thursday, July 25, 2002 1:57 PM
> > C1はもちろんC0でもなく、ソースラインカバレジです。
> ちょっと検索かけてみました。
>
> 命令網羅(C0)
> 分岐網羅(C1)
> モジュール網羅(S0)
> call-pair網羅(S1)
>
> これ以上、細かい情報が見つからず。それぞれ100%っていうと何が100%なんでし
> ょうか?C1はif文などの条件分岐のパスをすべて通るってことですよね。C0も同
> じような気がします。S0は無駄なモジュールがないってこと?S1はさっぱり・・
> ・どなたか教えて下さい。
・何が100%?
各種定義の下でいろんな実行パスを考え、その実行パスのうち、
テストして動作を確認したパスが100%、ということです。
例えば先のなひのCSVモジュールは、添付のRUnitによる
単体テストが、モジュール中の全てのソースコード行を通り、
かつ期待通りの結果を返したことを示します。
「ソースコード上でその行を通ったかどうか」なので、
d = a ? 0 : ( [ 1, 2, 3 ].inject( 0 ) { |i| (( i%2 == 0 ) ? i : 0 ) } )
なんて行があっても、a == trueなテストをしたら100%
ということになります。これではお話にならないので、
ソースラインカバレジの信頼性を上げるためには、
1行になんでも詰め込むコーディングを避けないといけません。
d = if a
0
else
[ 1, 2, 3 ].inject( 0 ) { |i|
if ( i%2 == 0 )
i
else
0
end
}
end
とか。
話が脱線しました。
・C0: statement coverage
全ての命令が実行されるようにパスを設定します。
if ( cond1 )
statement1
end
if ( cond2 )
statement2
end
この例なら、cond1 == cond2 == trueというパスが1つです。
・C1: branch coverage
分岐があったら、各分岐点の全分岐先へ実行が進むように
パスを設定します。上の例なら、cond1 == cond2 == trueと、
cond1 == cond2 == falseの2つです。(trueとfalseを
たすきに組み合わせるパターンでもOK)
分岐点に埋まっている条件判断文の扱いに応じて、
より厳しいcoverageレベルもあります。
cond1が(( cond1-1 && cond1-2 ) || cond1-3 )の時に
各副条件の組み合わせを考えるべきというやつや、
論理的に考えられるパスは全て個別のパスに、というものも。
C2、Cn、C∞と言ったりするようですが、このラベルに
ついては、さらっとGoogleした結果いろいろ定義があるように
見えます。なひもラベルはよくわかりません。
・S0: module coverage
存在する関数(メソッド)を全部カバーしたかどうかです。
・S1: call-pair coverage
存在する関数(メソッド)と呼び出し元の組み合わせ、
を全部カバーしたかどうかです。
S0やS1は、OOPだとちょっとした問題になります。
詳細は専門家に任せます。^^;
/ / /
> > 「作りたい人が作ってリリースしてほうりっ放し」
> > 「使いこなす人があんまり居ない」という傾向があるRubyの現状で、
> > 品質を上げるためには非常に役に立つと思います。
>
> あまり使いこなせなくても、ちゃかちゃか作れちゃいますからね。>Ruby
ここは「Rubyを使いこなせる人が居ない」という意味ではなく、
「作るのが好きで他人のを使うのは苦手という人が多い」
という意図でした。念のため。^^;