Visual Studio ProfessionalでC++コードカバレッジを取る方法|OpenCppCoverage・Microsoft.CodeCoverage.Console・VS2026対応

Visual Studio ProfessionalでC++のコードカバレッジ(テストで実行された行・関数の可視化)を取りたいのに、Enterprise限定に見えて困るケースは珍しくありません。いまはVS 2026で状況が変わった一方、VS 2022以前でも現実的に回せる手段があります。IDE派・CLI派の両方に向けて、選び方と運用のコツをまとめます。

日程Fit。無料・登録不要。「いつ空いてる?」を、ひとつのリンクで。リンクを送って、○△×でかんたん日程調整。無料で日程を作る。
目次

Visual Studio Professionalで「C++のコードカバレッジが無い」と見えてしまう理由

結論から言うと、混乱の原因は「バージョン差」と「情報の更新タイミング」です。

  • Visual Studio 2022以前は、IDEからのコードカバレッジ機能がEnterprise中心だったため、Professional利用者は「ボタンがない/メニューが見つからない」状態になりがちでした。
  • 一方でVisual Studio 2026では、コードカバレッジがCommunity / ProfessionalでもIDEから利用できる旨がリリースノートで明記されています。

つまり、「今のVSがどの世代か」で、最短ルートが変わります。まずはそこを切り分けるのが最重要です。

最初に押さえる基礎知識:C++カバレッジは“ビルド設定”で精度が変わる

C++(ネイティブ)のコードカバレッジは、.NETよりも「ビルド・リンク条件」の影響が大きいです。ツール選定の前に、次の条件を満たすだけで「0%になる」「変な結果になる」事故が大きく減ります。

ポイントなぜ重要か推奨
PDB(シンボル)ソース行と実行コードの対応付けに必須。PDB内には元のソースパスも入るため、パスが変わると期待どおり出ないことがある。必ず生成(通常はDebug)
最適化(/O2 など)最適化によりインライン化・分岐削除・ループ展開が起き、ソース行と実行の対応が崩れやすい。基本は最適化OFF(Debug推奨)
/PROFILE(リンク)ネイティブの「静的インストルメンテーション」を安定して使うために必要になるケースがある。静的方式を使うなら有効化
静的/動的インストルメンテーション静的(バイナリを書き換える)と動的(実行時注入)で安定性・要件が変わる。静的が推奨される場面が多い。静的を優先、必要時のみ動的フォールバック

選択肢の全体像:Professionalで現実的に使えるルートは大きく3つ

「いまの環境」と「欲しいアウトプット(IDEで見たい/CIに流したい)」で最適解が変わります。

選択肢向いている人強み注意点
Visual Studio 2026 のIDE機能IDEで完結したい/標準機能が良いCommunity/ProfessionalでもIDEからコードカバレッジが利用可能になったVS 2022以前だと同じ体験にならない(世代差)
Microsoft.CodeCoverage.Console(CLI)Microsoft純正でCLI運用したい/CIに組み込みたいC++とC#の収集、レポートのマージ/変換に対応静的方式では/PROFILE要件などが出る。設定XMLの理解が必要。
OpenCppCoverage(CLI)オープンソースで手軽に始めたい/レポートをHTMLで見たい実行ファイルを“そのまま”実行してHTMLレポート出力。PDBベースでソース行対応。フィルタやマージも可能。最終更新が古めのため、運用はCLI中心で割り切るのが安定
OpenCppCoveragePlugin(VS拡張)VS内からワンクリックで回したいVSメニューから実行できる導線がある最終リリースが2020年で、VS 2013/2015/2017向けの記載が中心。VS 2022/2026では動かない可能性あり。

方法1:Visual Studio 2026でIDEからC++コードカバレッジを取る

Visual Studio 2026では、コードカバレッジがCommunity/Professionalでも利用できることがリリースノートで明確に案内されています。IDEでの可視化を最優先するなら、これが最短ルートです。

基本手順(IDE)

  1. テストがTest Explorerで実行できる状態にする(C++ならMicrosoftのC++ユニットテスト、Google Testなど)。
  2. メニューから Test > Analyze Code Coverage for All Tests を実行する。
  3. 実行後、Code Coverage Resultsで対象のモジュール/ファイル別の結果を確認し、必要に応じてコード上のハイライト表示を有効にする。

CIで使うなら「Cobertura/XML出力」を最初から意識する

IDEで見るだけなら既定の形式でも困りませんが、CIで集計したり、SonarQube/レポート可視化に渡したい場合は「Cobertura」や「XML」で出せるようにしておくと運用が楽です。Visual Studioのコードカバレッジは既定で .coverage に保存されますが、設定でXMLやCoberturaも選べます。

例:runsettingsで出力形式を指定する(WordPress貼り付け用にXMLはエスケープしています)

<RunSettings>
  <DataCollectionRunSettings>
    <DataCollectors>
      <DataCollector friendlyName="Code Coverage">
        <Configuration>
          <Format>Cobertura</Format>
        </Configuration>
      </DataCollector>
    </DataCollectors>
  </DataCollectionRunSettings>
</RunSettings>

この「Format」はrunsettings側で指定できます。コマンドラインで回す場合も、vstestやdotnet testの収集パラメータで上書きできる仕様です。

C++で安定させるコツ:静的インストルメンテーションと/PROFILE

Visual Studioのコードカバレッジは、ネイティブ(C++)に対して静的/動的インストルメンテーションを使い分けます。静的方式は安定しやすい反面、プロジェクト側で /PROFILE を有効にする必要があります。runsettingsで静的方式を明示することもできます。

<RunSettings>
  <DataCollectionRunSettings>
    <DataCollectors>
      <DataCollector friendlyName="Code Coverage">
        <Configuration>
          <CodeCoverage>
            <EnableStaticNativeInstrumentation>True</EnableStaticNativeInstrumentation>
            <EnableDynamicNativeInstrumentation>False</EnableDynamicNativeInstrumentation>
          </CodeCoverage>
        </Configuration>
      </DataCollector>
    </DataCollectors>
  </DataCollectionRunSettings>
</RunSettings>

「動的を完全に無効化する」と、/PROFILEが未設定のプロジェクトでは取得できなくなる可能性があります。まずは静的を優先しつつ、状況により動的フォールバックを許可する、という順序で調整するのが安全です。

方法2:VS 2022 Professionalでも使えるMicrosoft純正CLI「Microsoft.CodeCoverage.Console」

「IDEにボタンがない」「でもMicrosoft純正でやりたい」という場合に強いのが Microsoft.CodeCoverage.Console です。Microsoft Learnのドキュメントで、C++とC#のコードカバレッジ収集、レポートのマージ/変換に対応するCLIとして説明されています。

どこにある?(VS 2022 17.3の配置)

ドキュメントでは、Visual Studio 2022 17.3環境で Common7\IDE\Extensions\Microsoft\CodeCoverage.Console 配下にある旨が案内されています。Developer Command Prompt / Developer PowerShellから利用できます。

C++の収集は「静的インストルメンテーション」が前提になりやすい

Microsoft.CodeCoverage.Consoleでは、C++に対して静的インストルメンテーションでカバレッジを取る説明があり、例として /PROFILE でリンクされたC++アプリが登場します。

代表的な3パターン(ドキュメント準拠)

パターンA:設定ファイルで対象ディレクトリを指定してcollect

instrumentコマンドを使わず、設定ファイル側でインストルメント対象を指定して収集する流れです。

<!-- coverage.config の例(XMLはエスケープ) -->
<ModulePaths>
  <IncludeDirectories>
    <Directory>D:\ConsoleApplication\x64\Debug</Directory>
  </IncludeDirectories>
</ModulePaths>
Microsoft.CodeCoverage.Console collect --settings coverage.config .\ConsoleApplication.exe

パターンB:instrumentしてからcollect

事前にバイナリをinstrumentし、その後にcollectで収集します。

Microsoft.CodeCoverage.Console instrument ConsoleApplication.exe
Microsoft.CodeCoverage.Console collect .\ConsoleApplication.exe

パターンC:server mode(収集と実行を分離)

長時間動くプロセス(サービス相当)や、実行と収集を分けたい場合に使える手順です。セッションIDを指定してinstrumentし、collectorをserver-modeで起動し、アプリを別途起動して最後にshutdownします。

Microsoft.CodeCoverage.Console instrument --session-id 73c34ce5-501c-4369-a4cb-04d31427d1a4 ConsoleApplication.exe
Microsoft.CodeCoverage.Console collect --session-id 73c34ce5-501c-4369-a4cb-04d31427d1a4 --server-mode
.\ConsoleApplication.exe
Microsoft.CodeCoverage.Console shutdown 73c34ce5-501c-4369-a4cb-04d31427d1a4

なお、instrumentしたネイティブバイナリが参照するDLL(例:static_covrun64.dll)の配置/Pathの扱いについて注意が書かれています。CIなどで「実行はできるのに収集できない」場合、まずここを疑うのが近道です。

フィルタリング(外部ライブラリを除外する)

Microsoft.CodeCoverage.Consoleのinstrumentには--settingsがあり、除外設定をXMLで渡せます。形式はrunsettings内のデータコレクター設定と同じ、と説明されています。つまり、VSのコードカバレッジ調整で使う知識がそのままCLIにも流用できます。

レポート形式(.coverage / XML / Cobertura)

Visual Studioのコードカバレッジは既定で .coverage 形式ですが、XMLやCoberturaで収集・出力することもできます。CI連携やレポートサービスに載せるなら、Coberturaが扱いやすい場面が多いです。

方法3:オープンソースで割り切るならOpenCppCoverage(CLI運用が安定)

ProfessionalユーザーがC++カバレッジを取りたいとき、現実解としてよく挙がるのが OpenCppCoverage です。Microsoft Q&Aでも、Professional利用者向けの代替としてOpenCppCoverage(およびVSプラグイン)が案内されています。

OpenCppCoverageは「PDBを使って、再コンパイル不要で実行プログラムを計測し、HTMLレポートを生成する」タイプのツールです。まずはCLIで回せる状態を作り、必要なら後からIDE連携(拡張)を検討する順番が安全です。

最速で1回回す(まずは動かしてみる)

WikiのGetting Startedでは、オプション無しでも OpenCppCoverage -- 対象プログラム でレポートが生成される流れが説明されています。

OpenCppCoverage -- .\Debug\ConsoleApplication1.exe

ただしこのままだと、実行に関与するWindows/VC++ランタイム等のファイルまで大量に出ます。そこで次の「–sources」が重要になります。

実務で必須のフィルタ:–sources(自分のコードだけに絞る)

OpenCppCoverageは既定で「PDBから辿れるソース」を広く拾うため、外部コードも混ざりやすいです。Wikiでは --sources を使ってパスにマッチするソースだけを対象にする方法が紹介されています。

OpenCppCoverage --sources C:\Dev\MyProject -- .\x64\Debug\MyTests.exe

さらに高速化する:–modules(対象モジュールを絞る)

外部DLLが多いプロジェクトでは、起動時の走査が重くなることがあります。Wikiでは、モジュール(exe/dll)側も --modules で絞ると高速化できる、と説明されています。

OpenCppCoverage --sources C:\Dev\MyProject --modules C:\Dev\MyProject -- .\x64\Debug\MyTests.exe

CIで便利:Cobertura出力

Jenkins等で扱いやすいCobertura形式は、OpenCppCoverage側の --export_type=cobertura で出力できる旨がWikiにあります。

OpenCppCoverage --sources C:\Dev\MyProject --export_type=cobertura:coverage.xml -- .\x64\Debug\MyTests.exe

テストが複数ある:カバレッジのマージ

ユニットテストexeが複数に分かれている場合、テストごとに計測し、最後に統合して全体像を見るのが現実的です。Wikiでは、--export_type=binary で中間ファイルを作り、--input_coverage で読み込んでマージする手順が紹介されています。

OpenCppCoverage --sources=C:\Dev\MyProject --export_type=binary:Test1.cov -- .\x64\Debug\Test1.exe
OpenCppCoverage --sources=C:\Dev\MyProject --export_type=binary:Test2.cov -- .\x64\Debug\Test2.exe
OpenCppCoverage --sources=C:\Dev\MyProject --input_coverage=Test1.cov --input_coverage=Test2.cov -- .\x64\Debug\Test3.exe

精度の注意点:基本はDebug推奨

OpenCppCoverageは「Debug推奨」で、Release最適化ではソースと実行コードが大きく変わるため、結果に違和感が出る可能性があることがGetting Startedで説明されています。まずはDebugで取得し、Releaseで必要なら「どの程度誤差が出るか」をプロジェクト固有に検証してから運用に載せるのが安全です。

OpenCppCoveragePlugin(VS拡張)を検討する場合の現実的な判断

「VSのメニューから実行したい」という要望に対して、OpenCppCoverageには公式のVisual Studio拡張(OpenCppCoveragePlugin)があります。

ただし運用上は次の点に注意が必要です。

  • Visual Studio Marketplace上の更新が古く、最終リリースが2020年頃で止まっています。
  • GitHub側の説明では、ビルドや互換対象がVisual Studio 2013/2015/2017中心の記載になっています。

そのため、VS 2022/2026の環境で「入らない」「入っても動かない」場合は、素直にCLI(OpenCppCoverage本体)で回す運用に寄せたほうが、再現性と保守性が高いです。

目的別おすすめ:どれを選ぶべきか

あなたの状況おすすめ理由
VS 2026が使える/IDEで確認したいVS 2026の標準コードカバレッジCommunity/ProfessionalでもIDE内で可視化できる
VS 2022 Professionalで、CIに載せたいMicrosoft.CodeCoverage.ConsoleMicrosoft純正でC++収集に対応、collect/instrument/サーバーモード等がある
費用ゼロで、まず結果を見たいOpenCppCoverage(CLI)再コンパイル不要でHTMLレポート、–sourcesで絞り込みやすい
VS内ワンクリックに強いこだわりがあるOpenCppCoveragePlugin(ただし要検証)拡張の更新が古く、現行VSでは非対応の可能性があるため“動けばラッキー”の位置付けが安全

つまずきやすい症状とチェックリスト

最後に、「カバレッジが取れない」「数字がおかしい」時に確認するポイントを表で整理します。

症状よくある原因対処
0%になる/対象ファイルが出ないPDBが無い、パスが変わっている、Release最適化で対応が崩れているDebugで再ビルド、PDB出力確認、ソースパス変更後はPDB再生成
外部ライブラリ/標準ライブラリが大量に混ざる対象の絞り込み不足OpenCppCoverageなら–sources/–modules、Microsoft系ならrunsettings/settingsで除外
静的インストルメンテーションが効かない/PROFILE未設定C++プロジェクトに/PROFILEを付与、runsettingsで静的有効化
instrumentしたexeが実行時にDLL不足実行時に必要なcovrun系DLLが見つからないツールの説明どおり、DLL配置またはPathに追加(collect/connectが自動調整するケースも)
VS拡張がインストールできない/表示されない拡張が古く、対応VSが合っていないCLI運用へ切り替える(OpenCppCoverage本体/Microsoft.CodeCoverage.Console)

参考リンク

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次