コード網羅率(コードもうらりつ、、コードカバレッジ)は、ソフトウェアテストで用いられる尺度の1つである。プログラムのソースコードがテストされた割合を意味する。この場合のテストはコードを見ながら行うもので、ホワイトボックステストに分類される。

コード網羅率は体系的なソフトウェアテストのための技法として最初に生み出されたものの1つである。1963年の Communications of the ACM にある Miller と Maloney の論文に言及されているのが最初である。

手法 コード網羅率の測定にはいくつかの手法があり、主なものとしては以下のような手法がある。 文網羅 - ソースコードの各文がテストで実行されたかどうかで判断する。 分岐網羅 - 制御構造上の分岐でそれぞれの分岐方向がテストされたかどうかで判断する。 条件網羅 - 分岐条件の各項で真と偽の両方がテストされたかどうかで判断する。 経路網羅 - 対象コードの考えられる全ての経路についてテストで実行されたかどうかで判断する。 入口/出口網羅 - 存在する全ての関数呼び出しがテストで実行されたかどうかで判断する。

インフラなどの重要なアプリケーションでは、何らかの形でコード網羅率 100% のテストを実施したことを示すよう要求されることが多い。

上で列挙した手法は相互に関係している。例えば経路網羅は、分岐網羅、文網羅、入口/出口網羅を含んでいる。文網羅は分岐網羅を含まない。以下のC言語のコードを考える。

void foo(int bar) { printf("This is "); if (bar < 0)

printf("not ");

printf("a positive integer.\n"); return; }

この関数 "foo" を引数 "bar = -1" で呼び出すと、文網羅は達成される。しかし、分岐網羅は達成されていない。

完全な経路網羅は実際には現実的でないし、不可能とされる。n 個の判断が行われるモジュールでは、最大 2n 個の経路が理論上存在する。ループがあれば無限の経路が存在することもある。また、タイミングに依存するような条件分岐では、テストではそのような条件を生成できないことがある。しかし、テスト不可能な経路を特定する汎用のアルゴリズムは存在しないことがわかっている(チューリングマシンの停止問題と等価であることが示されている)。実用的な経路網羅の手法としては、ループ回数が異なるだけの経路を経路クラスとしてひとまとめにして、経路クラスを網羅するようにする。

一般に、一連のテストを実行してから、その結果を分析してコード網羅率を算出し、必要に応じてテストを修正して再試行する。このようなテスト作成の最終的な目的は、コードの修正時のバグ作りこみを防ぐ回帰テストの作成にある。

コード網羅率は一般に百分率で表される。ただし、手法によって同じテストでも数字が変わってくるので注意が必要である。

関連項目 変異解析 ソフトウェア測定法 回帰テスト 静的コード解析 ホワイトボックステスト

外部リンク Code Coverage Analysis Introduction to Code Coverage What lies beneath -- Discovering untested code Don't be fooled by the coverage report Lessons in achieving 100% code coverage ツール(フリーなもの): gcov - GNU テスト網羅率プログラム EMMA - Java 用 Netbeans Code Coverage Plugin EMMAベースの NetBeans 向けプラグイン Eclipse EMMA plugin - EMMAベースの Eclipse 向けプラグイン NCover - .NET 用 trace2html - Python用 coverage.py - Python用 Cobertura - Java 用 PartCover - .NET 用 Devel::Cover Perl 5 用