JaCoCoはC1 Coverageが取れると言っておきながら実際に取れるのはC1(分岐網羅)でなくC2(条件網羅)という問題がある。
この問題に対して、JaCoCo組込みのReportGeneratorを改造するか、またはReportGeneratorを改造するかして、コードカバレッジのデータから分岐網羅の情報を取ってこれば行単位の分岐網羅を示すレポートが作れるのでは?と思って調べたのだが、無理なことが分かった。
ReportGenerator
→CoverageBuilder
→IClassCoverage
→IMethodCoverage
→ISourceNode
→ILine
と辿ったところ、各行にはC0用のinstruction counterとC1(C2)用のbranches counterがあり、それぞれのcounterの情報を持っているICounter
には各行の総カウント数・通過済みカウント数・未通過カウント数などしか保存されていないということが分かった。
条件網羅の情報から行単位のC1 coverageを復元するには、各条件が真だった・偽だったときにそれぞれどの行へ飛ぶのか、またその結果論理OR/AND等で結合された複合条件だと分かった場合はそれぞれの条件の真偽が1回の実行中でどうだったかが分かる必要がある。どうやらJaCoCoのカバレッジ情報にはそのようなデータは含まれておらず、行単位のC1 coverageを復元することはできないようだ。