kkAyatakaのメモ帳。

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

XcodeとgcovrでC++コードのカバレッジを計測する

Xcode単体では可視化できないブランチカバレッジを取り扱える。 Xcodeへのシームレスな統合は失われるが、設定・実行は簡単で、手順はシンプルになる。

f:id:kkAyataka:20200617210900j:plain

環境

手順

  1. Xcodeカバレッジファイルの出力設定を有効にする
  2. テストを実行する
  3. gcoverをインストールして実行する

Xcodeカバレッジファイルの出力設定を有効にする

とりあえずはXcodeの出力ロケーションを相対にしておく。 カバレッジファイルがDerivedData (の結構深いところ) にできるので、相対的に参照できるパスが何かと都合が良い。

f:id:kkAyataka:20200617211038j:plain

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で検索すると出てくる。

f:id:kkAyataka:20200617211210j:plain

Generate Legacy Test Coverage Files (GCC_GENERATE_TEST_COVERAGE_FILES)

gcc-ftest-coverage。coverageで検索すると出てくる。 Xcode 11だとLegacy扱い。標準のはclangの設定。

f:id:kkAyataka:20200617211414j:plain

テストを実行する

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

f:id:kkAyataka:20200617210900j:plain

--html-detailsをつけるとソースコードの詳細をビジュアルで確認できる。

f:id:kkAyataka:20200617210758j:plain