07

10

コードカバレッジ測定ツール TestCocoon の使い方 その3

2011.07.10(21:41)

カバレッジの種類は一般に3種類ある。以下の3つである。

(1) C0:命令網羅率、ステートメントカバレッジ statement coverage
実行した命令文 / 全命令文
たとえば条件判断してtrueの時だけ命令文があるようなプログラムの場合はtrueの場合だけ実行すれば100%になってしまう。

(2) C1:分岐網羅率 デシジョンカバレッジ decision coverage
実行した分岐数 / 全分岐
条件判断があった場合、trueとfalseの両方を実行すれば100%になる。trueとfalseの片方に文がなくても、両方を実行することをチェックするので、C0よりも詳しく調べているとはいえる。ただ、条件判断は何段階もの判断でtrue,falseを決定する場合があるので、次のC2よりは甘い。

(3) C2:条件網羅率 condition coverage
実行した条件 / 全条件
条件判断が、if (s1 || s2 || s3) だった場合、s1がtrueの場合と、s1がfalseでs2がtrueだった場合と、s1とs2がfalseでs3がtrueだった場合の3つのパターンで条件判断全体がtrueになる。この3つと、すべてがfalseだった場合、合計4つのパターンをすべて調べた場合、100%となる。

分母が違っているので、(1)<(2)<(3)とは言えないし、値同士に関係はない。違うものの比率を計算している。

経路をチェックしている目的からすると、3番目がもっとも詳しく調べる場合であり、ツールができるかぎり、厳しくコードカバレッジを調べるのがいいに決まっているので、それさえ理解しておけばいいし、このツールのデフォルトもそれになっているので、デフォルトのまま調べるでよい。

ここからは、C2:条件網羅率 condition coverage を説明する。TestCocoonのサンプルプログラムとほぼ同じプログラムで考える。

void sample3(void)
{
int i;
bool found = false;
for (i=0;(i<100) && (! found);i++) {
if (i == 50) break;
if (i == 20) found = true;
if (i == 30) found = true;
}
printf("sample3 is called \n");
}

このループではiは0から99まで1ずつ増えるが、ループの途中でiが20になったところでfoundがtrueになり、for文のループ条件が非成立になるのでそこでループを抜ける。つまり、iは30にも50にもならない。

フローチャートにすると以下のようになる。
flowchart3.png

デフォルト設定で、全ての条件、全ての分岐、全ての命令を通ることをチェックしているのがわかる。

ソースコード表示。すべて実行されているときだけ緑色になる。
tc81.png

13行目のカバレッジ。前半はtrueのみ、後半はtrueとfalseの両方が実行されている。
tc82.png


また、分岐に入る前、foundやiを初期化しているようなところは、条件も分岐もないので、そこを通るかどうかはチェックしていないのがわかる。TestCocoonの場合、条件も分岐もない部分はチェックしないのだ。

その1へ戻る

次回はTestCocoonを使っていろいろ調べてみた結果から考えてみることにする。しっかりユニットテストを書いたつもりでも、どういうときに通らない部分ができてしまうのかを考えてみたい。

コメントの投稿

非公開コメント

プロフィール

島敏博

Shima Toshihiro 島敏博
信州アルプスハイランド在住。HaskellとElixirが好き。組み込みソフトウェアアーキテクト、C++プログラマ、山歩き、美術館巡り、和食食べ歩き、日本赤十字社救急法指導員、インデックス投資、クラシック音楽、SESSAME会員、状態マシン設計、モデル駆動開発、ソフトウェアプロダクトライン、Rubyist、実践ビジネス英語

■ ツイッター
http://twitter.com/saltheads
■ Facebook
http://www.facebook.com/saltheads
■ Qiita
http://qiita.com/saltheads

印刷する場合は、ブラウザの印刷メニューではなく、このページの上から3cmくらいの青いところにある、「印刷」を押してみてください。少しうまく印刷できます。まだ完全ではないのですが、これで勘弁してください。


カテゴリ
最新記事
月別アーカイブ
最新コメント
検索フォーム
リンク
sessame
RSSリンクの表示