XcodeでC++のカバレッジを計測する
厳密にはラインカバレッジらしい。また、ブランチカバレッジは取れない。
環境
ヘッダーオンリーライブラリとして開発したファイルの単体テストのカバレッジを測ります。
測定方法
- Test TargetをObjective-Cで作る
- テストコードを作成する
- カバレッジ計測オプションを有効にする
- hppファイルをコンパイル対象にする
- 実行して結果を見る
Test TargetをObjective-Cで作る
Test Navigatorから新しいTest Targetを作成する。
Test言語はObjective-C。あとで設定を変えるが、実行するのはObjective-C++としてビルドする。単体テストはGoogle Testで記述してあるので、それをなるべくそのまま実行できるようにする。
テストコードを作成する
テストコードを編集します。ここではGoogle Testのメイン実行関数をそのまま呼び出すようにしています。また、この時Unit Testのコードが実行されるように、Test Targetの設定 (ソースファイルの追加やヘッダー検索パスの設定) なども行います。
- (void)testExample { NSArray * args = [[NSProcessInfo processInfo] arguments]; int argc = (int)args.count; char const * argv[10] = {}; for (int i = 0; i < argc; ++i) { argv[i] = [[args objectAtIndex: i] cStringUsingEncoding: NSUTF8StringEncoding]; } // Google Testを実行 testing::InitGoogleTest(&argc, (char**)argv); RUN_ALL_TESTS(); }
この時、C++のコードをそのまま呼び出すことになるため、テストソースのファイルタイプをObjective-C++に設定します。
カバレッジ計測オプションを有効にする
Unit Testのスキーマ設定画面を開いて、テストのところに作成したTest Targetを追加します。
そして、カバレッジ計測を有効にするためにOptionsを開いて、Code Coverageを有効にします。
hppファイルをコンパイル対象にする
計測対象がhppなどのヘッダファイルの場合は、コンパイル対象として設定します。コンパイル対象にしないとカバレッジ計測の対象となりません。
実行して結果を見る
Unit Test (Test Targetではなく) を実行します。Build・実行ボタンを長押しすると実行方法が選べるので、ここでテストを選ぶと、スキーマで設定したテストが実行されます。
実行後、結果画面から結果を見ます。「By Group表記」の方が個人的には見やすい。
「Show Test Bundles」を有効にすると、Test Targetで実装したコードのカバレッジを確認できます。C++ソースのカバレッジが計測されていることが確認できます。
この状態でソースコードをひらけば、実行されていない箇所をハイライトで確認することができます。