LoginSignup
3
3

More than 5 years have passed since last update.

CircleCI + PHPUnitで解析したコードカバレッジの推移をRedash + Amazon Athenaでグラフ化する

Last updated at Posted at 2017-08-13

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;

これをビジュアライズしてグラフ化します。

newplot.png

コードカバレッジの推移をグラフ化することができました。
コードカバレッジが増えていく様子が可視化されると、テストを書くモチベーションが上がっていいですね。

参考

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3