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

Yasuo's Notebook

ソフトウェア開発の話題が中心の備忘録です。

.NETでのカバレッジ計測ツールOpenCover

2011年のうちに記事を書こうと思います。

C#で開発する際のカバレッジ測定ツールとしては、NCoverやPartCoverが有名ですが、今回はOpenCoverというツールを紹介します。
OpenCoverは、@scubamukiさんが開発しているカバレッジツールで以下から入手可能です。

https://github.com/sawilde/opencover

インストールは、セットアップを実行するだけです。
OpenCoverの他にレポート生成ツールも導入しておきましょう。
以下から入手可能です。

http://www.palmmedia.de/Net/ReportGenerator

ダウンロードしたファイルを適当な場所に解凍しましょう。
日本語の紹介はまだないようなので、ここで紹介しておきます。

サンプル:OpenCoverSample.dll
ファイル:Class1.cs
namespace OpenCoverSample
{
    public class Class1
    {
        public int func1(int a,int b)
        {
            if (a == 0 || b == 0){
                return 0;
            }
            else if (a == 1 || b == 1){
                return 1;
            }
            else if (a == 1 && b == 1){
                return 2;
            }
            else{
                return -1;
            }
        }
    }
}
テスト:OpenCoverSampleTest.dll
ファイル:UnitTest1.cs
namespace OpenCoverSampleTest
{
    [TestClass]
    public class UnitTest1
    {
        public UnitTest1()
        {

               (省略)
         [TestMethod]
        public void func1Test()
        {
            Class1 obj = new Class1();
            Assert.AreEqual(0, obj.func1(0, 1));
            Assert.AreEqual(1, obj.func1(2, 1));
            Assert.AreEqual(1, obj.func1(1, 2));
        }
    }
}

テストはカバレッジを確認するために、わざと不十分にしています。
では早速、OpenCoverでカバレッジを計測してみましょう。
OpenCoverはコマンドラインで実行しますが、オプションが長いのでバッチファイルを作成しておくのが良いでしょう。
今回のサンプルをカバレッジ計測する場合のバッチファイルの例を以下に示します。実行する環境に合わせてディレクトリ名は変えてください。

バッチファイル例

rem VS2010のインストール先
set vs2010_home=C:\Program Files (x86)\Microsoft Visual Studio 10.0

rem OpenCoverのインストール先
set opencover_home=C:\Program Files (x86)\OpenCover

rem 実行するテストのアセンブリ
set target_test=OpenCoverSampleTest.dll

rem 実行するテストのアセンブリの格納先
set target_dir=C:\Users\ユーザ名\Documents\Visual Studio 2010\Projects\OpenCoverSample\OpenCoverSampleTest\bin\Debug

rem レポート生成ツールのインストール先
set reportgen_dir=C:\Tools\ReportGenerator_1.2.3.0

rem カバレッジ計測対象の指定
set filters=+[OpenCoverSample]*

rem パスの設定
set path=%path%;%opencover_home%;%reportgen_dir%\bin

rem OpenCoverの実行
OpenCover.Console -register:user -target:"%vs2010_home%\Common7\ide\mstest.exe" -targetargs:"/noisolation /testcontainer:%target_test%"  -targetdir:"%target_dir%" -filter:"%filters%" -output:result.xml -mergebyhash

rem レポートの生成
reportgenerator "result.xml" %reportgen_dir%\html

OpenCoverのオプションの詳細については、以下に説明があります。
https://github.com/sawilde/opencover/wiki/Usage

バッチファイルを実行すると、レポート生成ツールのインストール先にhtmlというフォルダが生成されているはずです。
index.htmlを開く以下のようなレポートが表示されます。
f:id:yasuo99:20111231215346j:plain

カバレッジを見ると61.5%になっています。
OpenCoverSample.dllのOpenCoverSample.Class1をクリックすると、詳細が見れます。

f:id:yasuo99:20111231220912j:plain

カバレッジは、Sequence CoverageとBranch Coverage、カバレッジの他にCyclomatic Complexityも計測できています。
各行には実行の有無を示す色付けと実行回数が表示されます。

このようにバッチファイルを作っておくと、簡単にカバレッジを測定できるだけではなく、Team Foundation Serverの自動ビルドでも活用することができます。

OpenCoverはまだまだ使っている人は少なそうですが、アップデートは活発に行われていますので今後に期待しています。