kkAyatakaのメモ帳。

誰かの役に立つかもしれない備忘録。

XcodeでC++のカバレッジを計測する

厳密にはラインカバレッジらしい。また、ブランチカバレッジは取れない。

f:id:kkAyataka:20200614170723j:plain

環境

ヘッダーオンリーライブラリとして開発したファイルの単体テストカバレッジを測ります。

測定方法

  1. Test TargetをObjective-Cで作る
  2. テストコードを作成する
  3. カバレッジ計測オプションを有効にする
  4. hppファイルをコンパイル対象にする
  5. 実行して結果を見る

Test TargetをObjective-Cで作る

Test Navigatorから新しいTest Targetを作成する。

f:id:kkAyataka:20200614163744j:plain

Test言語はObjective-C。あとで設定を変えるが、実行するのはObjective-C++としてビルドする。単体テストGoogle Testで記述してあるので、それをなるべくそのまま実行できるようにする。

f:id:kkAyataka:20200614164121j:plain

テストコードを作成する

テストコードを編集します。ここでは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++に設定します。

f:id:kkAyataka:20200614165507j:plain

カバレッジ計測オプションを有効にする

Unit Testのスキーマ設定画面を開いて、テストのところに作成したTest Targetを追加します。

f:id:kkAyataka:20200614213640j:plain

そして、カバレッジ計測を有効にするためにOptionsを開いて、Code Coverageを有効にします。

f:id:kkAyataka:20200614165057j:plain

hppファイルをコンパイル対象にする

計測対象がhppなどのヘッダファイルの場合は、コンパイル対象として設定します。コンパイル対象にしないとカバレッジ計測の対象となりません。

f:id:kkAyataka:20200614170443j:plain

実行して結果を見る

Unit Test (Test Targetではなく) を実行します。Build・実行ボタンを長押しすると実行方法が選べるので、ここでテストを選ぶと、スキーマで設定したテストが実行されます。

実行後、結果画面から結果を見ます。「By Group表記」の方が個人的には見やすい。

「Show Test Bundles」を有効にすると、Test Targetで実装したコードのカバレッジを確認できます。C++ソースのカバレッジが計測されていることが確認できます。

f:id:kkAyataka:20200614213750j:plain

この状態でソースコードをひらけば、実行されていない箇所をハイライトで確認することができます。

f:id:kkAyataka:20200614171016j:plain