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ファイルを出力するディレクトリのパスを指定します。
ignore
はカバレッジレポートに含めないディレクトリやファイルを指定します。
globのパターンマッチが使えるのが便利です。
アーキテクチャ設計をするときにディレクトリ構造やファイルの命名規則を決めますが、カバレッジ計測を正しく行う上でも適切なファイル構造にしておくのは重要だということに気づきました!!
Swift Package Managerでインストールしているライブラリをカバレッジ計測対象から外す
上記.slather.yml
のignore
のところで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の画面キャプチャになってます)。
カバレッジ取得を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にカバレッジレポートを通知する仕組みについてご紹介したいと思います。