Index: [Article Count Order] [Thread]

Date:  Thu, 25 Jul 2002 16:47:52 +0900
From:  "NAKAMURA, Hiroshi" <nakahiro@....jp>
Subject:  [XP-jp:03605] Re: ソフトウェア品質指標についての考察
To:  <extremeprogramming-jp@....jp>
Message-Id:  <000f01c233af$96190270$85222fc0@....jp>
References:  <000e01c2338e$80660f20$85222fc0@....jp> <JL20020725135704.594782702@....jp>
X-Mail-Count: 03605

なひです。詳しい人がかわりに説明してくれるのを
待っていたのですが。。。^^;

それでは説明してみます。間違ってたら突っ込んでくださいね、
特に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を使いこなせる人が居ない」という意味ではなく、
「作るのが好きで他人のを使うのは苦手という人が多い」
という意図でした。念のため。^^;