Lazy Diary @ Hatena Blog

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

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

結論

https://docs.microsoft.com/ja-jp/dotnet/core/testing/unit-testing-code-coverage では「Coverlet とは、C# 用のクロスプラットフォームのコード カバレッジ フレームワーク」と言っているが、実際にはCoverletでVB.NETのコードカバレッジも取れる。ちゃんと行単位でのC1 coverage(branch coverage, 分岐網羅)も取れる。ただし、VB.NETに限った話ではないかもしれないが、C1の計測のされかたや、実行回数のカウントに変な箇所が見うけられる。特にC1が100%されていないのに100%と表示されてしまうのは痛い。

手順

zenn.dev

に記載の手順で

github.com

に記載のプログラムをコンパイルできる状態にし、内容を少し編集した。そのうえで、

docs.microsoft.com

に記載の手順でmyApp.vbprojを参照させ、テストを実行・レポートを出力した。

コードおよび結果

テストクラスの内容は以下。

using Xunit;

namespace Xunit.Coverlet.Collector;

public class UnitTest1
{
    [Fact]
    public void Test1()
    {
        myApp.Program.Main(new string[] {});
    }
}

得られたXMLのレポートファイルは以下。 Coverlet VB.NET coverage result · GitHub

評価

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

f:id:satob:20211202013132p:plain f:id:satob:20211202013142p:plain

特に、31行目のC1は1 of 2 branches are coveredとなっており、行単位でbranch coveredが取得できていることを意味する。JaCoCoのように、Branches (C1 Coverage)が取れると言っておきながら、実際には条件網羅(condition coverage, C2)しか取れないということはない。

ただし、結果にところどころ妙なところが見受けられる。

  • 23行目と35行目のC1は、真のルートしか通っていないため1 of 2 branches are coveredとなるべきところ、2 of 2 branches are coveredと表示されている。
    • これは、C1が100%になるようなテストケースを設定していないのに、レポート上ではC1が100%と表示されてしまっているわけで、テスト実施レベルの統一を目的にコードカバレッジを取得している場合は致命的……
  • 25行目と37行目は、1回しか実行していないのに2 visitsになっている。
  • 44行目からの条件分岐は、本当はx=10, y=10のようにどの条件にも該当しないケースがあるはずなのだが、それがC0にもC1にも反映されていない。