29
Feb 2016
by
奥村 健一
前回投稿した記事でカバレッジの確認はできるようになりましたが納品などが絡む場合はやはりレポート形式で出力したくなります。
今回まさにそんな事例に行き当たったので備忘録がてら共有いたします。
※本記事は2016年02月29日時点での内容となります。
実行環境
- OSX Yosemite 10.10.5
- Xcode 7.2 (7C68)
- CocoaPods 0.39.0
- Homebrew 0.9.5
対象となるケース
- CocoaPodsでパッケージ管理している
- Unitテストを書いている
- カバレッジレポートをHTMLで出力したい
利用するツール等々
対象プロジェクト
https://github.com/KenichiOkumura/CoverageReportSample.git
こちらのプロジェクトは下記の手順で作成されています。
- Wellcome to Xcode > Create a new Xcode project
- iOS > Application > Single View Application
- 各種設定は下記な感じ
- TargetClass.h TargetClass.m 追加&編集
- CoverageReportSampleTests.m 編集
- Project > CoverageReportSample > Generate Legacy Test Coverate Files > YES
- Project > CoverageReportSample > Instrument Program Flow > YES
- TARGETS > Build Phases > + > New Run Script Phase > Pods/XcodeCoverage/exportenv.sh
- pod init > PodfileにXcodeCoverage追加
レポート生成手順
1.Homebrewでlcovをインストール&パス確認
$ brew install lcov ==> Downloading https://homebrew.bintray.com/bottles/lcov-1.12.yosemite.bottle.tar.gz Already downloaded: /Library/Caches/Homebrew/lcov-1.12.yosemite.bottle.tar.gz ==> Pouring lcov-1.12.yosemite.bottle.tar.gz /usr/local/Cellar/lcov/1.12: 16 files, 533.3K $ which lcov /usr/local/bin/lcov $ lcov --version lcov: LCOV version 1.12
2.pod install
$ cd {PROJECT_ROOT} $ pod install Updating local specs repositories CocoaPods 1.0.0.beta.4 is available. To update use: `gem install cocoapods --pre` [!] This is a test version we'd love you to try. For more information see http://blog.cocoapods.org and the CHANGELOG for this version http://git.io/BaH8pQ. Analyzing dependencies Downloading dependencies Installing XcodeCoverage (1.2.2) Generating Pods project Integrating client project Sending stats Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed.
3.envcov.shの中身をbrewでインストールしたlcovのパスに書き換え
CocoaPodsに取得したXcodeCoverage内のenvcov.shに記載されているlcovの実行パスをHomebrewでインストールしたものに書き換えます。
この記事を書いている時点でのenvcov.shではXcodeCoverageに内蔵されているlcov-1.11で実行するように書かれていますがXcode7環境では上手く動作しませんでした(参考)。
$ cd {PROJECT_ROOT} $ vi Pods/XcodeCoverage/envcov.sh 8 - LCOV_PATH="${scripts}/lcov-1.11/bin" 8 + LCOV_PATH="/usr/local/bin/"
4.テスト実行
CoverageReportSample.xcworkspaceを開きテストを実行します。 CoverageReportSample.xcworkspaceを開く CoverageReportSample > 適当なエミュレーターを選択 > Product > Test
5.XcodeCoverage実行
CocoaPodsに取得したXcodeCoverage内のgetcovを実行します。
$ cd {PROJECT_ROOT} $ ./Pods/XcodeCoverage/getcov --show -o ~/Desktop/ Show HTML Report output_dir = /Users/user/Desktop/ ~/Desktop ~/Desktop/CoverageReportSample ~/Desktop/CoverageReportSample Capturing coverage data from /Users/user/Library/Developer/Xcode/DerivedData/CoverageReportSample-clwbjkiwcxqjnnaikakwgjmwcgtc/Build/Intermediates/CoverageReportSample.build/Debug-iphonesimulator/CoverageReportSample.build/Objects-normal/x86_64 Found gcov version: 7.0.2 Found LLVM gcov version 3.4, which emulates gcov version 4.2 Scanning /Users/user/Library/Developer/Xcode/DerivedData/CoverageReportSample-clwbjkiwcxqjnnaikakwgjmwcgtc/Build/Intermediates/CoverageReportSample.build/Debug-iphonesimulator/CoverageReportSample.build/Objects-normal/x86_64 for .gcda files ... Found 4 data files in /Users/user/Library/Developer/Xcode/DerivedData/CoverageReportSample-clwbjkiwcxqjnnaikakwgjmwcgtc/Build/Intermediates/CoverageReportSample.build/Debug-iphonesimulator/CoverageReportSample.build/Objects-normal/x86_64 Processing x86_64/AppDelegate.gcda Processing x86_64/main.gcda Processing x86_64/TargetClass.gcda Processing x86_64/ViewController.gcda Finished .info-file creation Reading tracefile Coverage.info Deleted 0 files Writing data to Coverage.info Summary coverage rate: lines......: 64.0% (16 of 25 lines) functions..: 60.0% (9 of 15 functions) branches...: no data found Reading tracefile Coverage.info Removing /Users/user/Desktop/CoverageReportSample/CoverageReportSample/main.m Deleted 1 files Writing data to Coverage.info Summary coverage rate: lines......: 57.1% (12 of 21 lines) functions..: 57.1% (8 of 14 functions) branches...: no data found Reading data file Coverage.info Found 4 entries. Found common filename prefix "/Users/user/Desktop/CoverageReportSample" Writing .css and .png files. Generating output. Processing file CoverageReportSample/ViewController.m Processing file CoverageReportSample/TargetClass.m Processing file CoverageReportSample/AppDelegate.h Processing file CoverageReportSample/AppDelegate.m Writing directory view page. Overall coverage rate: lines......: 57.1% (12 of 21 lines) functions..: 57.1% (8 of 14 functions)
あとがき
結果はこんな感じにできあがります。
通っていない所は赤く表示され非常にわかりやすいですね!
なお、Pod内で書き換えているenvcov.shは当然の事ながらPodが更新されると消える可能性があります。
自分は手間だったのでgnu-sedで置換するようにスクリプト作りました。
$ cd {PROJECT_ROOT} $ touch coverage.sh $ chmod +x coverage.sh $ vi coverage.sh #!/bin/bash # brewでlcoveとgnu-sedをインストール brew install lcove gnu-sed # brew でのインストール先確認 # which lcov # envcov.shのlcov参照先をbrewへ向ける gsed -i '8c LCOV_PATH="/usr/local/bin/"' Pods/XcodeCoverage/envcov.sh # カバレッジレポートをデスクトップへ出力 ./Pods/XcodeCoverage/getcov --show -o ~/Desktop/