見出し画像

Xcodeのコードカバレッジを定期的に知りたい

現在社内で有志が集まって品質を向上する活動をしているのですが、その中で「カバレッジを定期的に知りたいよね」という話が出ました。
サーバーサイドの方は既に実装済みだったので、アプリの方も対応したいなと思っており、ゆるく調べながら対応を進めていました。

Xcodeでカバレッジを集計する

Xcodeでカバレッジを集計するにはスキームのTestOptionsにカバレッジを集計するかどうかのチェックがあるのでここでチェックを入れます。
カバレッジを集計するターゲットも任意で選ぶこともできます。

Code CoverageのGather coverage for を選択する

xcresultファイルを保存する

集計したカバレッジはxcresultファイルに記録されています。
まずはこれを任意の場所に保存する必要があります。
xcodebuildコマンドでテストを実行する場合には -resultBundlePath オプションを設定します。
fastlane scanを利用する場合には result_bundle true を設定し output_directory オプションに出力ディレクトリのパスを設定します。

CircleCIのARTIFACTSからダウンロードできるようにする

CircleCIでは store_artifacts ステップを利用すれば出力したものを保存し、後でダウンロードすることができます。

しかし、xcresultファイルをそのまま指定するとただのフォルダ形式なので下記のように全てのファイルが見えてしまいます。

xcresultの中身が全部見えてしまっている様子

そこでxcresultファイルが生成された後でzipで固めるように対応しました。

  - &zip_xcresult
    command: |
      zip -r output/app.xcresult.zip output/app.xcresult
      rm -rf output/app.xcresult/
    when: always

これでARTIFACTSからzipファイルをダウンロードして解凍すればCI上のテスト結果がXcodeで見れるようになります。

カバレッジの値を取得する

xcresultファイルが手に入ったらカバレッジの値を取得するだけです。
下記のコマンドを実行すればカバレッジの概要を取得することができます。

xcrun xccov view --report ./output/app.xcresult --only-targets

xcresultのパスなどは適宜変更してください。
--only-targetsを外せばより細かいファイルごとのカバレッジが取得できますが、そこは用途によって使い分けるのがいいと思います。

あとはこの値をSlackなどで通知するだけです。
今回はCircleCI上のUnit Testが終わったあとで下記のようなコマンドを実行してZapierに結果を渡すようにしました。

#!/bin/sh

COVERAGE=`xcrun xccov view --report ./output/app.xcresult --only-targets 2>/dev/null`
curl -X POST -d "coverage=$COVERAGE" https://hooks.zapier.com/hooks/catch/xxxxxxxxxx/

Zapierの方は受け取った値をSlackに流すだけなので簡単ですね。
CircleCIから直接SlackのAPIを叩いてもよかったのですが、Zapierの方が後々カスタマイズしやすいので今回はZapierを選びました。

カバレッジの結果が通知された様子(一応数字は伏せています)

まとめ

これでCircleCI上でユニットテストが実行されたらSlackにカバレッジが通知されるようになりました。
とはいえカバレッジの値をどのように解釈するのかはまだちゃんと決まっていません。
(が、想像以上にカバレッジが低かったのでカバー率をあげる活動は少しずつしていきたいなと思っています)
定期的に数字を見ることでカバレッジへの意識も少しずつ変わるかもしれません。
まずは今の自分たちの状況を知るところから始めるのはよさそうですね。

P.S.

noteのアプリチームでは絶賛エンジニア、PdMを募集していますので、少しでも興味を持ってくれた方は見ていただけると嬉しいです。

この記事が気に入ったらサポートをしてみませんか?