XcodeとgcovrでC++コードのカバレッジを計測する
Xcode単体では可視化できないブランチカバレッジを取り扱える。 Xcodeへのシームレスな統合は失われるが、設定・実行は簡単で、手順はシンプルになる。
環境
手順
Xcodeでカバレッジファイルの出力設定を有効にする
とりあえずはXcodeの出力ロケーションを相対にしておく。 カバレッジファイルがDerivedData (の結構深いところ) にできるので、相対的に参照できるパスが何かと都合が良い。
2つのビルド設定を有効にする。
- Instrument Program Flow (GCC_INSTRUMENT_PROGRAM_FLOW_ARCS)
- Generate Legacy Test Coverage Files (GCC_GENERATE_TEST_COVERAGE_FILES)
Instrument Program Flow (GCC_INSTRUMENT_PROGRAM_FLOW_ARCS)
gccの-fprofile-arcs
。flowとかarcsで検索すると出てくる。
Generate Legacy Test Coverage Files (GCC_GENERATE_TEST_COVERAGE_FILES)
gccの-ftest-coverage
。coverageで検索すると出てくる。
Xcode 11だとLegacy扱い。標準のはclangの設定。
テストを実行する
unit_testに設定したので、単純にunit_testを実行する。 失敗するようならクリーンにするとかDerivedDataを消すとかすれば解消されると思われ。
gcovrをインストールして実行する
Pythonのツールなので、pip
でインストール。
% pip install gcovr
試した時はプロジェクト以下に仮想環境を作ったけど、流石にグローバルインストールでいい気がしてる。
gcovr
を適当に呼び出すだけで検出してくれる
(この時DerivedDataにできるカバレッジファイルを参照するのに、相対だと都合が良い)。
ただ、不必要な (例えばテストコード自体の) カバレッジまで出力されるので、
適当にフィルタされるようにオプションを指定して実行する。
% gcovr -f '.*plusaes.hpp' -r . ------------------------------------------------------------------------------ GCC Code Coverage Report Directory: . ------------------------------------------------------------------------------ File Lines Exec Cover Missing ------------------------------------------------------------------------------ include/plusaes/plusaes.hpp 372 365 98% 212,222,407,432,451,558,712 ------------------------------------------------------------------------------ TOTAL 372 365 98% ------------------------------------------------------------------------------
HTML形式にも出力できる。結果を見て何か作業する時はこっち。ブランチカバレッジの数値も自動で出る。
% gcovr -f '.*plusaes.hpp' -r . --html --html-details -o cov/coverage.html
--html-details
をつけるとソースコードの詳細をビジュアルで確認できる。