CircleCIだけでも個々のビルドのコードカバレッジは見ることができますが、ビルド間のコードカバレッジの推移はCodecovやCoverallsなどのサービスを利用しなければ見ることができません。
そこで、最近v2.0.0がリリースされてAmazon Athenaとの連携が簡単になったRedashを使って、ビルド間のコードカバレッジ(ラインカバレッジ)の推移をグラフ化してみました。
S3
バケットに/phpunit/coverage/line/
というフォルダを作成しました。
このフォルダにコードカバレッジレポートを保存して、Athenaで処理します。
CircleCI
Athenaがサポートしているファイル形式でPHPUnitのコードカバレッジレポートを出力することができないため、コマンドラインオプションの--coverage-xml
を使って、いったんXML形式でコードカバレッジレポートを出力します。
そのあとで、下記のようにして雑にXML形式からJSON形式に変換します。
php -r '$xml=simplexml_load_file("/tmp/coverage.xml/index.xml");$attr=$xml->project->directory->totals->lines->attributes();$json=json_encode(["timestamp"=>time(),"total"=>(int)$attr["total"],"comments"=>(int)$attr["comments"],"code"=>(int)$attr["code"],"executable"=>(int)$attr["executable"],"executed"=>(int)$attr["executed"],"percent"=>(string)$attr["percent"]]);echo$json;' > /tmp/line_coverage.json
ラインカバレッジの情報しか必要ないので、ラインカバレッジの情報だけを含んだJSONにしています。
AthenaがJSON形式をサポートしているとはいえ、複雑な構造のJSONに対応するテーブルを作成するのは面倒なので、必要最低限の要素だけを含むJSONにあらかじめ加工しておいた方がいいと思います。
JSONにはAthenaでソートする際に使うタイムスタンプを付与しています。
Athenaでクエリを実行する際、JSONのキーに@
が含まれているとエラーになってしまうようなので、キーも自分で定義しています。
そして、このJSONファイルをS3へアップロードします。
aws s3 cp /tmp/line_coverage.json s3://{バケット名}/phpunit/coverage/line/line_coverage_`date +%Y%m%d_%H%M%S`.json
Athena
S3へアップロードしたJSONファイルを処理するためのテーブルを作成します。
phpunit_line_coverage_logs
という名前のテーブルにしました。
テーブルのカラム名と型は下記です。
カラム名 | 型 |
---|---|
timestamp | timestamp |
total | int |
comments | int |
code | int |
executable | int |
executed | int |
percent | string |
テーブルの作成方法についてはこちらの記事が参考になりました。
Redash
RedashとAthenaを連携します。
連携方法についてはこちらの記事が参考になりました。
リンク先の記事はRedash v1.0.0について書かれていますが、v2.0.0でも同じようにして設定することができました。
Athenaに作成したテーブルに対して下記のようなクエリを実行すれば、コードカバレッジの推移を取得することができます。
SELECT *
FROM {データベース名}.phpunit_line_coverage_logs
ORDER BY TIMESTAMP ASC LIMIT 100;
これをビジュアライズしてグラフ化します。
コードカバレッジの推移をグラフ化することができました。
コードカバレッジが増えていく様子が可視化されると、テストを書くモチベーションが上がっていいですね。