読者です 読者をやめる 読者になる 読者になる

Visual Studio + gtest 環境でカバレッジ計測を試そうとした。(失敗談)

自動テストを書いてて、カバレッジ計測したいと思うことが良くあります。
Jenkinsにカバレッジ計測を表示させてたいと常々思います。

Linuxであれば、gcovを使えばいいけど、
自分はC++の開発でVisualStudioとgtestを使うことが多いので、
Windows環境でVisualStudio+gtestの組み合わせでカバレッジ計測の仕方を調べてみました。

環境はVS2010 Professional.
結論から言って、カバレッジ計測結果をJenkinsに表示させるところまでできていません。

参考URL:
http://blogs.msdn.com/b/cellfish/archive/2008/11/16/native-c-code-coverage-reports-using-visual-studio-2008-team-system.aspx
http://blogs.msdn.com/b/jsocha/archive/2011/08/16/capturing-c-code-coverage-with-visual-c.aspx

プロジェクトの設定

計測対象となるDLLのプロジェクトで以下のように設定して、ビルド。

構成プロパティ→リンカー→最適化→参照→いいえ(/OPT:NOREF)
構成プロパティ→リンカー→詳細設定→プロファイル→はい(/PROFILE)

カバレッジ計測

Visual Studio 2010 Performance Toolsを使用します。以下からDL可能。
http://www.microsoft.com/ja-JP/download/details.aspx?id=23205


以下、コマンドプロンプトにて実行。Visual Studio コマンドプロンプトを使用するとパスが設定されていて便利。

1.DLLのインストルメント化

vsinstr <対象DLL名> /coverage

2.パフォーマンス モニターの起動

start vsperfmon /coverage /output:<出力ファイル名>

出力ファイル名の拡張子は.coverageにするのが一般的?

3.テストの実行

インストルメント化したDLLが呼ばれるテストを実行する。
カバレッジ結果が出ないと思ったら、DLLが呼ばれないテストを実行してました…

4.パフォーマンス モニターの終了

vsperfcmd /shutdown

パフォーマンスモニタ―を終了されないとカバレッジ計測結果が正しく出力されない。

カバレッジ計測後(問題発生により手詰まり中)

妥当そうなカバレッジ結果が取得できるところまでできましたが、その後色々な問題にぶつかりました。

得られた出力結果がみれない

.coverageのデータを取得できましたが、バイナリデータのため、適切な結果を得られたかが確認できていません。
色々検索した結果、バイナリデータをxmlに変換する必要があるのですが、そこでまた問題がありました。

vscoveragetoxmltask?

いろんなサイトを見ると、.coverageバイナリデータをxmlに変換するために、以下のサイトにあるDLLを使うと書かれています。
http://code.msdn.microsoft.com/vscoveragetoxmltask

で、クリックするとhttp://archive.msdn.microsoft.com/に飛ばされます。
vscoveragetoxmltaskはどこにあるんでしょうか?

microsoft.visualstudio.coverage.symbols.dll?

仕方がないので、.coverageバイナリデータを変換する他の手法を探しました。
githubにて、.coverageバイナリデータをhtmlに変換してくれるコードをを発見しましたので、試してみました。
https://github.com/jsargiot/visual-coverage
ちなみに、VS2010ではビルドできなかったので、ビルドするためにVS2013Expressをインストール。
で、実行すると“microsoft.visualstudio.coverage.symbols.dllがない”とのエラーメッセージが出て、変換に失敗します。
これをWebで検索してみると、VisualStudioのインストールディレクトリの中にある、との回答があったんですが、
自分の環境ではどこを探しても見つかりませんでした。
もしかしたら、VSのより上位のエディションでないと含まないファイルかもしれない、と思い調査終了。

結論

結局のところ、今回の調査ではカバレッジ計測ができませんでした。
カバレッジ計測したかったら、マルチプラットフォーム対応してgcov使え、ってことでしょうか。