仕事の方でテストカバレッジをGUIなしに集計する必要が出たので、メソッド単位のカバレッジを集計したいクラス単位でのカバレッジを集計したいファイル単位でのカバレッジを集計したいディレクトリ単位でのカバレッジを集計したいの集計をするために、PHPUnitが出力するClover形式のXMLと格闘して得られた、XMLの構造と扱い方についてまとめてみましたはじめにレガシーなPHPと戦っており、PHPUnitのバージョンは3.4です最高につらいなので出力されるXMLの構造や属性名に差異があるかもしれませんまた、カバレッジレポートの出力方法はこちらのドキュメントを参照して下さいなお、PHPUnitのカバレッジレポート単体ではC0のカバレッジしか計測できませんでした後述するlineタグのnum属性とcount属性の値を使って対象プログラムの静的解析かければ、解析できなくはないかもしれませんが、カバレッジレポート単体ではC0のレポートしか出ません。name="..."が出現。</project></coverage>有効行数は、空白行やコメントアウトなどを除いた、PHPのコードとして評価される行数を指しています。目的のクラスの中にあるmetricsタグを抽出し、有効行数とカバーしている有効行数で比較できます。namespaceを入れないと衝突する恐れがあります。その辺考慮しなくていいならnamespace属性は無視できます。ファイル単位で行カバレッジを取るファイルも同じ要領で、fileタグ1つの直下にmetricsタグが1つ入っているので、それを比較します。el.statements)ファイル名(basepath相当)ではなく、フルパスな点に注意です。テストを実行(カバレッジ集計)した環境によって変わるのでご注意下さい。ディレクトリ単位でカバレッジを取るカバレッジレポートはfileタグ単位で纏まっているので、ディレクトリごとのカバレッジを完璧に取ることは困難です。ディレクトリの中身を漁って有効行数を出すことが可能ですが、ソースの実体を持たない限り、カバレッジレポートに記載されているファイルしか計測対象になりません。dirMetrics.statements)相当で取得可能です。ディレクトリ内部のファイルのメトリクスをかき集めて、最後に合算すれば算出可能ですメソッド単位でカバレッジを取る※前置きでも話しましたが、バージョンアップによって改善されている可能性もあります。古いPHPUnitについて言及します。メソッド単位も、完全な情報は出せませんいや、正確にはメソッドに関するレポートなら出せます。不完全な情報の収集ですら地味に面倒でしたlineタグのtype属性はstmtかmethodにしかならず、関数の定義開始行はtype=stmtになってしまいます関数対して判別可能な値が何もありません。methodMetrics.statements)ただし、これは不完全です例えばクラスに属さない関数がファイルに含まれている場合に対応できません完全なカバレッジを得るためにはソースコードと静的解析が必要です。PHPUnitの設定ファイルにてカバレッジ集計対象の設定をして、テストに登場しなかったファイルもカバレッジ集計対象に加えることは可能ですが、結局のところ関数には対応できませんまとめ行カバレッジの解析はXMLの構造さえ分かれば結構簡単ファイル単位、クラス単位でのカバレッジなら確実に取れる関数が1つ以上定義されているファイルに対しては、ソースと突合しないとカバレッジ集計不可能PHPには結構豊富なリフレクションのメソッドがあるので、突合は技術的には可能。今回は使ってない結果的な感想としては「ツラい」のただ一言でした。