# テストカバレッジ ## 定義 テストカバレッジ(test coverage / code coverage)とは、あるテスト集合がプログラムの構造(文・分岐・データフロー関係など)をどれだけ網羅しているかを測る、**テストの十分性(test adequacy)**を定量化する指標である。あるテスト集合 T が特定の規準(criterion)に関して**十分(adequate)**であるとは、その規準が要求する要素をすべて T が網羅していることをいう。文カバレッジ(statement/block coverage)・分岐カバレッジ(decision coverage)・データフローカバレッジ(data flow coverage)・ミューテーションスコア(mutation score)がその代表的な規準である。ブラックボックス(機能)テストが「何をテストしたか」を問うのに対し、これらは白箱(white-box)テストとして「プログラムのどの部分を実際に実行したか」を問う点で異なる。(Source: [[@1996__McGrawHill__Handbook of Software Reliability Engineering - Chapter 13 Software Testing and Reliability]] §13.2) ## テスト十分性規準の階層 - **文カバレッジ/ブロックカバレッジ**: 各文(または基本ブロック、indivisible な制御実行単位)が少なくとも一度は実行されること。 - **分岐カバレッジ**: 各決定(decision、単純条件または `&&`/`||` で結合された複合条件の構成要素)が、ある実行で真、別の(または同じ)実行で偽の値を少なくとも一度ずつとること。 - **データフローカバレッジ**: 変数の**定義-使用対(def-use pair)**が網羅されること。変数 x の定義文 S₁ と使用文 S₂ の対のうち、S₁ から S₂ への**定義無汚染パス(definition-free path、途中で x を再定義しないパス)**が実行されれば「被覆」とみなす。使用が計算式内なら **c-use**、述語内なら **p-use** と呼ぶ。 - **ミューテーションスコア**: プログラム P に規則的な変更を加えた**変異体(mutant)**を多数生成し、各非等価な変異体 M を P と区別する(P(d) ≠ M(d) となる)テストケース d の割合。統計的網羅ではなく「欠陥を模した変更を検出できるか」を直接問う点で、上記3規準とは異なる原理に基づく。 - **サブサンプション(subsumption)関係**: p-use・c-use に関して十分なテスト集合は分岐カバレッジについても十分であることが形式的に証明されており([Clar89])、**データフローカバレッジは分岐カバレッジを形式的に包含する**。一方、経験的証拠([Math91], [Wong93])は、ミューテーション十分なテストデータがデータフロー十分である可能性は高いが、データフロー十分なテストデータがミューテーション十分である可能性は低いことを示唆し、**ミューテーション ⊇ データフロー ⊇ 分岐** という経験的な強さの序列を裏付ける。機能テストにはこれらのような精密で測定可能な十分性規準が存在しない。(Source: [[@1996__McGrawHill__Handbook of Software Reliability Engineering - Chapter 13 Software Testing and Reliability]] §13.2.2) ## 飽和効果と信頼性推定への影響 個々のテスト手法(機能・分岐・データフロー・ミューテーション)には、その手法が発見しうる障害数に固有の上限があり、上限に到達した後もテストを続けても新規障害は発見されない(**飽和効果, saturation effect**)。TEX・AWK という長年機能テストされ続けた実プログラムに対し、データフローテストツール ATAC を適用した実証実験では、ブロックカバレッジ 85%/70%、分岐カバレッジ 72%/59%、p-use カバレッジ 53%/48%、c-use カバレッジ 48%/55% にとどまり、いずれも 100% に到達しなかった。除去しても出力が変わらない(=真に到達不能な)ブロックが実在した一方、実行可能だが未網羅のまま残る要素も確認された。 飽和効果は、故障間隔データのみに基づく時間領域の信頼性成長モデル(Musa 基本実行時間モデル・Goel-Okumoto の NHPP モデルなど)に深刻な影響を与える。飽和領域で障害が見つからない期間が続くと、これらのモデルは「信頼性が成長している」と誤認し、真の信頼性が一定のままでも推定信頼性を単調に押し上げてしまう。カバレッジを増加させなかった「無駄な」テスト実行を圧縮比(compression ratio)で除去してから故障間隔データを投入すると、より保守的で現実的な推定が得られ、露出期間によっては未フィルタ推定とフィルタ済み推定の比が最大 3.33 倍に達する例が報告されている。(Source: [[@1996__McGrawHill__Handbook of Software Reliability Engineering - Chapter 13 Software Testing and Reliability]] §13.4) ## 横断的知見 - **カバレッジと障害検知の関係は決着していない論争であり続けた**: 2007年のロードマップ論文([[@2007__FOSE__Software Reliability Engineering - A Roadmap]])は、コードカバレッジと障害カバレッジの関係に関する既存文献の比較調査(§3.6 表1)を行い、本概念の一次資料である Horgan(1994、[[@1996__McGrawHill__Handbook of Software Reliability Engineering - Chapter 13 Software Testing and Reliability]] の著者自身の先行研究)を含む複数の実証研究(Frankl 1988, Rapps 1988, Chen 1992, Wong 1994, Frate 1995, Cai 2005)を「肯定的な知見」として分類する一方、Briand(2000)はコードカバレッジと障害カバレッジの間に因果的依存関係を支持しない結果を報告したとしている。1996年の本章刊行から11年が経過してもなお、カバレッジ向上が実際に障害検出・信頼性向上に結びつくかという問いは実証的に一枚岩の結論を得ておらず、肯定・否定両方の知見が併存し続けたことがうかがえる。(Source: [[@1996__McGrawHill__Handbook of Software Reliability Engineering - Chapter 13 Software Testing and Reliability]], [[@2007__FOSE__Software Reliability Engineering - A Roadmap]]) - **カバレッジと信頼性の統合は2007年時点でも将来課題のままだった**: 2007年のロードマップ論文は「信頼性評価のためのテスト」を将来方向の1つに掲げ、ソフトウェアテストコミュニティと信頼性測定コミュニティの統合、コードカバレッジと運用プロファイルの連携、テスト時間とカバレッジを統合した閉ループ SRE プロセスの構築を課題として挙げている。これは本章(1996年)がすでに提案していた「カバレッジ情報で故障データをフィルタリングする」アプローチの延長線上にある課題であり、11年を経てもなお研究アジェンダとして残っていたことを意味する。(Source: [[@1996__McGrawHill__Handbook of Software Reliability Engineering - Chapter 13 Software Testing and Reliability]], [[@2007__FOSE__Software Reliability Engineering - A Roadmap]]) ## 未解決の問い - カバレッジと障害検出率・信頼性の間の因果関係について、Horgan(1994)らの肯定的知見と Briand(2000)の否定的知見を分けた要因は何か(プログラム規模、障害の性質、カバレッジ規準の選び方など)。両論文を直接比較していないため未確認。 - 飽和効果に基づく圧縮比フィルタリング(σ)は本章では合成データによる例示にとどまる。実プロジェクトの故障データでどの程度信頼性推定を改善するかは [Chen94a] の詳細な実験結果を読む必要がある。 - ミューテーションスコアと信頼性の関係を直接扱った実証研究は本章では言及されるにとどまり、詳細は追えていない。ミューテーションテストに特化した後続ソースの ingest 時に厚くしたい。 - 静的リスクモデル(ρ(l_i))はデータフロー属性の数え上げに基づくが、サイクロマティック複雑度など他の静的複雑度指標とどう相関するのか・すべきなのかは本章では明示的に比較されていない。 ## 関連 - source: [[@1996__McGrawHill__Handbook of Software Reliability Engineering - Chapter 13 Software Testing and Reliability]] / [[@2007__FOSE__Software Reliability Engineering - A Roadmap]] - entity: [[Joseph R. Horgan]] / [[Aditya P. Mathur]] / [[ATAC]] - concept: [[wiki/concepts/運用プロファイル]](構造網羅ベースの配分と使用頻度ベースの配分は独立した原理) ## 出典 - Joseph R. Horgan, Aditya P. Mathur, "Software Testing and Reliability", in Michael R. Lyu (ed.), *Handbook of Software Reliability Engineering*, IEEE Computer Society Press / McGraw-Hill, 1996, Chapter 13, pp. 531–566. - [[@2007__FOSE__Software Reliability Engineering - A Roadmap]] §3.6