結論
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%と表示されてしまうのは痛い。
手順
に記載の手順で
に記載のプログラムをコンパイルできる状態にし、内容を少し編集した。そのうえで、
に記載の手順で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
評価
特に、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にも反映されていない。