Lazy Diary @ Hatena Blog

PowerShell / Java / miscellaneous things about software development, Tips & Gochas. CC BY-SA 4.0/Apache License 2.0

OpenCoverでVB.NETのコードカバレッジが取れるか?

結論

OpenCover VB.NETとかでググってもぜんぜん事例が出てこないので心配になるが、OpenCoverでVB.NETのコードカバレッジも取れる。ちゃんと行単位でのC1 coverage(branch coverage, 分岐網羅)も取れる。Coverletと違って、C1が100%実行されていないのに100%と表示されてしまうといった問題もなく、便利に使えそう。

手順

手元の環境ではなぜかInstall-PackageでOpenCoverがインストールできなかったので、nugetのOpenCoverのページからOpenCoverのnupkgファイルをダウンロードしてきて、管理者権限のあるPowerShellコンソールから以下のコマンドでインストールした。

Install-Package OpenCover -Source .\

そのうえで、

satob.hatenablog.com

で作成したテスト対象のプログラムを

docs.microsoft.com

に記載の手順で作ったテスト用プロジェクトXUnit.OpenCover.Collectorから参照させる。またXUnit.OpenCover.slnを、作成し、XUnit.OpenCover.Collectorとテスト対象のプロジェクト両方を追加する。そのうえで

kuttsun.blogspot.com

に記載の「.NET Core + xUnit の場合」に記載の手順に従い、以下のようにコマンドを実行。-filterカバレッジ取得対象の名前空間を絞っておかないと、coverage.xmlが数MBのサイズになってしまう(関係ないDLLのカバレッジも取得してしまう模様)。

C:\Program` Files\PackageManagement\NuGet\Packages\OpenCover.4.7.1221\tools\OpenCover.Console.exe -register:user -target:"dotnet.exe" -targetargs:"test .\XUnit.OpenCover.Collector\XUnit.OpenCover.Collector.csproj" -filter:"+[myApp*]*" -oldstyle -output:"coverage.OpenCover.xml"

出力されたcoverage.xmlに対して

reportgenerator.exe -reports:.\coverage.OpenCover.xml -targetdir:OpenCover

を実行すると、OpenCoverフォルダ以下にHTMLファイルが出力される。

コードおよび結果

テストクラスの内容はCoverletのときに使ったものと同じ。得られたXMLのレポートファイルは以下。

OpenCover VB.NET coverage result · GitHub

評価

結果、VB.NETのプログラムのカバレージも取得できた。

f:id:satob:20211204192144p:plain f:id:satob:20211204192147p:plain

  • 31行目のC1は1 of 2 branches are coveredとなっており、行単位でbranch coveredが取得できていることを意味する。JaCoCoのように、Branches (C1 Coverage)が取れると言っておきながら、実際には条件網羅(condition coverage, C2)しか取れないということはない。
  • そのうえで、Coverletと異なり、23行目や35行目のC1(真のルートしか通っていない)が正しく1 of 2 branches are coveredとなっている。また、44行目からの条件分岐で通っていないケース(x=10, y=10のような)も50行目のC1に反映されている。
  • 25行目と37行目が、1回しか実行していないのに2 visitsになっているのはCoverletと同じ。