Pragmatic ball boy

iOSを中心にやってる万年球拾いの老害エンジニアメモ

Swiftでコマンドラインでカバレッジを取る方法

Objective-Cのときはgcov使ってUnitTestのカバレッジを取っていましたが、 Xcode7から(?)llvm-covが使えるようになったのでこれを使ってみます。

ドキュメントを見ると使い方としては結構単純で、 レポートを出力するには、以下のようにPROFILEとBINを与えてやればレポートが出力されます。

llvm-cov report [options] -instr-profile PROFILE BIN [SOURCES]

PROFILEとBINは、コードカバレッジをONにしてテストを実行するとお馴染みのDerived Data以下に出力されます。

以上のことを踏まえてコマンドラインで実行すると以下のようにすることでカバレッジのレポートを出力させることができます。

注:{}内はプロジェクトによって変更してください。

xcodebuild test -scheme {SchemeName} -configuration Debug -destination 'platform=iOS Simulator,name=iPhone 6' -derivedDataPath build -enableCodeCoverage YES
xcrun llvm-cov report -instr-profile build/Build/Intermediates/CodeCoverage/{SchemeName}/Coverage.profdata build/Build/Intermediates/CodeCoverage/{SchemeName}/Products/Debug-iphonesimulator/{ProductName}.app/{ProductName}

結果はこんな感じで出力されます。

Filename                    Regions    Miss   Cover Functions  Executed
-----------------------------------------------------------------------
.../Headers/NSException.h         0       0    nan%         0      nan%
...eaders/NSObjCRuntime.h         0       0    nan%         0      nan%
...usr/include/MacTypes.h         0       0    nan%         0      nan%
...sdk/usr/include/math.h         0       0    nan%         0      nan%
...sr/include/objc/objc.h         0       0    nan%         0      nan%
...r/include/sys/_types.h         0       0    nan%         0      nan%
..._iOS/AppDelegate.swift        26      21  19.23%        14    21.43%

ただこれファイル名が長いと...省略されて見えなかったりするのがちょっと微妙。。

あと、CIと連動させて表示したいとかだとこのままだと厳しいですね