コードカバレッジでのブランチカバレッジとデシジョンカバレッジは何が違う?
今日は、ホワイトボックステストの文脈でよく出てくる、コードカバレッジのブランチカバレッジとデシジョンカバレッジの違いについて書きます。これははるか昔、mixiをやっていたときにあきやまさんに教えてもらいました。以下引用する雑誌の記事で間違えたことを書いてしまい、それをきっかけに教えてもらった記憶があります。なので改めてお礼を。
その節はありがとうございました。>あきやまさん
そのときのmixiの記事を見つけられないので引用できないのですが、教えてもらったことは覚えているということで、忘れないように書き残していきたいと思います。
コードカバレッジの基本的な説明
コードカバレッジの説明は昔々、日経ソフトウェアの連載で書いたものが今もWebに残っていて、そちらを読んでもらえればわかるのでリンクを貼っておきます。このWeb記事では、ステートメントカバレッジ、ブランチカバレッジ/デシジョンカバレッジ、コンディションカバレッジ、マルチコンディションカバレッジについて説明しています。時代がわかりますが、具体例としてEclipseでdjUnitを使って実際にJavaのコードでカバレッジを測る例も載せています。
分岐を全部テストできたか?を測る2つのカバレッジ基準
以下が上記連載でカバレッジの説明をするための簡単なコードになります。
public int coverageCheck(int a,int b,int c) {
c=c+a; //⇒命令①
if ( a <= 1 || b == 0 ) { //⇒分岐①
c = c - a ; //⇒命令②
}
if ( a > 3 && c > 6 ) { //⇒分岐②
c = c+b ; //⇒命令③
}
return c; //⇒命令④
}
分岐を全部テストするには、以下の図のように2つのテストが必要です。
テストは二つで分岐を網羅したことにはなるのですが、計測方法としてブランチカバレッジというのとデシジョンカバレッジというのがあります。これらは分母に何を持ってくるかが違います。
デシジョンカバレッジ
デシジョンカバレッジは、分岐があるノードの全部の分岐を通したか?という考え方です。if文なら一つのノードに二つ分岐があります。なので上記のフローチャートだと4つの分岐をテストして全部網羅したことになります。なので分母は4です。
ブランチカバレッジ
ブランチカバレッジはフローチャートにある全部のエッジを通しているか?という考え方です。上記のフローチャートだと、7つのエッジを通して全部網羅したことになります。なので分母は7です。
最終的には一緒、途中経過だと計測結果が違う
ということです。コードカバレッジは、ツールを使って計測することが多くなるので。知っていればいいだけのことですが知らないと訳わからなくなります。
おまけ
コードカバレッジを計測することにはどんなメリットがあるのかとか、どんな落とし穴があるのかとか、以下のブログがとってもよくまとまってます、
詳しくはリンクしたブログを読んでもらえばいいのですが、英文で読むのも大変なので、私がgoogle翻訳にかけて読んだ結果をサマリーするとこんな感じになります。(若干私の見解で盛ってるかもしれないですのでちゃんと知りたい方は是非原文を読んでください)
メリット
・ほとんどの言語に対応できる十分なツールがそろってて人がほぼ介在せずにデータが取得できる。
・コードカバレッジをあげる努力が欠陥を減らすカルチャーとなる。(テストを大事にして、プロダクトを設計する際にテスタビリティを考えるようになることが、コードの高品質化に貢献する)。
・コードカバレッジが低い場合は、テストされていないことが確実にわかる。
デメリット
・テストがちゃんとできてるかってことを見る尺度としては完全ではない。全てを網羅できているかはカバレッジではわからない
・カバレッジが高いから安心だとしてレビューを疎かにしたり、テストケースの内容の精査を怠ると品質低下に気づかない。そもそも全ては網羅できないことは忘れてはいけない。
・数字合わせでコピペでテスト増やしても良いことなし。メンテ効率が下がりかえって邪魔になる。
サポートありがとうございます。これをカテにこれからも頑張ります。