2014年2月10日月曜日

[C++] Coveralls でコードカバレッジ

iutestCoveralls の利用を始めました。

導入は簡単にできたのですが、テストコードのカバレッジだけ集計されて、本来の目的であるフレームワーク側のカバレッジが集計されず、あーだこーだやったので備忘録として書き残しておきます。


導入までに関しては以下を参考にしました。
Objective-C の記事はすぐ見つかったけど c++ の記事は少ないねぇ
はじめに
はじめに iutest の構成を説明しておきます。

  • iutest
    • doc
    • include
    • projects
    • samples
    • src
    • test
    • tools

test フォルダにテストがあり、そちらでテストを実行し gcov を出力します。
カバレッジ対象は include ディレクトリ以下のソースファイルです。

root
まず、iutest/test ディレクトリで cpp-coveralls を呼び出していたため、ルートディレクトリが iutest/test になっていました。このため、iutest/include のソースファイルへのパスが "../include/iutest_***.hpp" のようになります。 cpp-coveralls では、../ で始まるパスのソースファイルは無視するようになっているため、集計されていませんでした。

修正
iutest ディレクトリ(プロジェクトのトップ)で cpp-coveralls を呼ぶように修正

UnicodeDecodeError: 'utf8' codec can't decode byte ...
ソースファイルを utf8 に変換しようとして失敗しています。
cpp-coveralls には --encoding オプションがあり、それで別の文字コードを指定することが可能です。
ただ、iutest は UTF8-BOM有り で統一するようにしたので、どこかにそうじゃないファイルがあるようです。。。

修正
Crashes in utf8 decoder · Issue #24 · eddyxu/cpp-coveralls
こちらにも書かれているように、該当のファイルパスを print するようにして(※)問題のファイルを洗い出し、文字コードの変更を行いました。


pip install cpp-coveralls
で cpp-coveralls をインストールすると lib\python2.7\site-packages\coveralls に展開されるので、そこの coverage.py を編集して print を仕込む。

テストコードの除外
cpp-coveralls で任意のファイル/ディレクトリを除外するには、--exclude (-e) オプションを使います。
当初、
coveralls -r ./ -e test
のように除外指定をしていましたが、これだと test/*.gcov ファイルの集計が行われずなにもレポートされませんでした。
やりたいことは test/*.gcov は集計するが、テストコードの *.gcov は集計しないことです。

修正
-e オプションを使用すると *.gcov ファイルの集計まで除外してしまうので、--exclude-pattern (-E) オプションを使います。-E オプションは -e オプションと違い、正規表現が使えます。また、-E オプションでの除外指定は *.gcov ファイルの集計には影響しないようです。
coveralls -r ./ -E ".*/test/.*"

これで
これで目的のカバレッジができました。

これを書いている時点で 80% と低いので、もう少し網羅率を上げて v1.8.1 リリースといきたいところですね。

0 件のコメント:

コメントを投稿