slatherでiOSアプリのカバレッジを可視化する

Xcodeだけでもカバレッジの数値を見ることはできますが、特定のディレクトリやファイルをカバレッジ対象から除外するなどといった細かいことはできません。

最近業務でiOSアプリのリアーキテクチャを進めているのですが、旧アーキテクチャではテストを全く書いておらず、今からテストを書くのも不可能といった感じなので、新アーキテクチャのコードだけでカバレッジを計測できないか調べていたところ、slatherというツールを見つけました。

slatherを使うと、特定のディレクトリやファイルをカバレッジ対象から外したり、HTML形式でカバレッジレポートを出力することができます。

本記事ではslatherの使い方についてご紹介します。



slatherの導入と設定

slatherはRuby Gemなので、Gemfileに追記するかgem install slatherすればインストール完了です。

gem 'slather'


slatherの設定はコマンドのオプションで指定するか、.slather.ymlに設定を書きます。

以下は私の関わっているプロジェクトの.slather.ymlの内容を若干修正したものです。
なお、設定ファイルの項目は他にもいくつかありますので、詳細はslatherのREADMEなどをご参照ください。

coverage_service: html
xcodeproj: MyApp.xcodeproj
workspace: MyApp.xcworkspace
scheme: MyApp
output_directory: slather_html_report
ignore:
  - "../Library/Developer/Xcode/DerivedData/*"
  - "../../Library/Developer/Xcode/DerivedData/*"
  - "../../../Library/Developer/Xcode/DerivedData/*"
  - "../../../../Library/Developer/Xcode/DerivedData/*"
  - "../../../../../Library/Developer/Xcode/DerivedData/*"
  - "MyApp/Legacy/*"
  - "MyApp/Generated/*"
  - "MyApp/Presentation/Feature/**/*View.swift"
  - "MyApp/Presentation/Feature/**/*Image.swift"

coverage_serviceはカバレッジレポートの出力形式です。htmlを指定すると、下記のようなレポートをブラウザで見ることができます。
output_directoryはHTMLファイルを出力するディレクトリのパスを指定します。

f:id:bamboohero:20210814013438p:plain


ignoreはカバレッジレポートに含めないディレクトリやファイルを指定します。
globのパターンマッチが使えるのが便利です。

アーキテクチャ設計をするときにディレクトリ構造やファイルの命名規則を決めますが、カバレッジ計測を正しく行う上でも適切なファイル構造にしておくのは重要だということに気づきました!!

Swift Package Managerでインストールしているライブラリをカバレッジ計測対象から外す

上記.slather.ymlignoreのところでLibrary/Developer/Xcode/DerivedData/*というパスがいくつか設定されています。

これはSwift Package Manager(SPM)でインストールしているライブラリをカバレッジ計測対象から外すための設定です。

SPMでインストールしたライブラリのコードはDerivedDataディレクトリ配下(~/Library/Developer/Xcode/DerivedData/MyApp-xxxx/SourcePackages)にあるのでこうしてるのですが、開発者の環境やCI環境によってパスが変わるので、だいたいカバーできそうなパスをいくつか書いています。

xcodebuildコマンドの-clonedSourcePackagesDirPathオプションを使うやり方もあるようなのですが、私の環境だとうまくいかなかったので、愚直にDerivedDataのパスを指定する形になってます。


カバレッジレポートを出力する

slatherはXcodeが出力したカバレッジデータファイルを基にカバレッジレポートを作成するので、先にXcodeでテストを実行しておく必要があります。

まず、Schemeの設定でカバレッジ取得をONにしておきましょう(私のプロジェクトではTestPlanを使っているのでTestPlanの画面キャプチャになってます)。

f:id:bamboohero:20210814014953p:plain


カバレッジ取得をONにしたらXcodeでテストを実行します。

テストが成功したら、以下のコマンドでカバレッジレポートを出力します。

$ bundle exec slather
Slathering...

To open the html reports, use

open '/path/to/your/MyApp/slather_html_report/index.html'

or use '--show' flag to open it automatically.

Slathered


上記のopenコマンドを実行すると、ブラウザでカバレッジレポートを見ることができます。


まとめ

slatherを使ってカバレッジレポートを出力する方法についてご紹介しました。

さらに、slatherを使うことでカバレッジ計測対象を細かく指定できることについてもご紹介しました。

カバレッジが可視化されていると、チームがカバレッジを意識するようになり、テストに対する意識が変わってきます。

テストをさらにチームに根付かせるようにするために、Pull Requestとカバレッジレポートを連動させる仕組みが有効です。

今後の記事で、Dangerとslatherを使ってPull Requestにカバレッジレポートを通知する仕組みについてご紹介したいと思います。