OpenCover中表达式的分支覆盖率

4

分支覆盖适用于以下语句吗?

我期望看到一个红色指示器,因为第一个表达式只有在假的情况下才进行测试,而不是真的情况下。

tax.Voided = P_tax.Amount == 1012312870000.42M || P_tax.Amount < 0.00M;

第一个表达式总是错误的,第二个表达式有时是正确的:ReportGenerator快照
2个回答

13
不要将ReportGenerator报告与OpenCover XML输出混淆; 尽管在OpenCover开始开发自己的报告可视化之前,目前ReportGenerator是您能找到的最佳工具。 你在这里遇到的问题是报告工具不基于分支覆盖率仅基于序列覆盖率进行(红/绿)覆盖率报告。 您需要查看方法的分支覆盖概述(在报告顶部汇总)-对于更详细的查看,您应该查看方法的XML报告数据,并将其与IL进行比较(此处OpenCover获取覆盖信息)。 注意:OpenCover不知道您使用的编程语言,它只能看到生成的IL代码。

2
我不确定为什么会有人对OpenCover的创建者的回答进行负投票... - Igal Tabachnik
谢谢你指出这个问题,@Shaun。我在 XML 中找到了分支信息:<Method visited="true" cyclomaticComplexity="2" sequenceCoverage="100" branchCoverage="50"> ... <BranchPoints> <BranchPoint vc="1" uspid="1348" ordinal="0" offset="64" path="0" /> <BranchPoint vc="0" uspid="1349" ordinal="1" offset="64" path="1" /> </BranchPoints> ... </Method> 我找不到解释这些属性的文档,你能告诉我正确的方向吗? - Ryan Andres
@ryan-andres - 目前还没有太多的文档,因为我还没有写 :) 我最接近的是 http://scubamunki.blogspot.com/2011/08/problem-with-sequence-coverage.html(以及涵盖 switch 的第二部分)。所有的信息都是从生成的 IL 中获取的 - 所以你可能需要 ILSpy 或 Reflector。 - Shaun Wilde
我刚意识到分支覆盖率不是我想要的。假设我只有一个表达式,var voided = amount < 0.00M;,我该如何检查其真值和假值是否都经过了两次测试。分支覆盖率会有访问计数,但不能保证已测试了真值和假值。我的解决方法是这样的:bool voided; if(amount < 0.00M) {voided = true;} else {voided = false},因为在这里序列覆盖率可以起作用。 - Ryan Andres
我认为唯一的方法是编写一个脚本,检查共享相同偏移量(IL指令)的每个分支点,并检查每个路径是否具有vc>0(请注意,switches可以有多个路径)。 - Shaun Wilde

0

如果您的覆盖率工具无法理解一行代码中可能有多个有趣的“可覆盖”实体,那么当该行中任何一个覆盖实体被覆盖时,您可能会收到报告称该行已被覆盖。

据我所知,仪器化类文件的工具在这方面受到限制,因为类文件只包含将类代码与源代码行相关联的信息,而不包含部分行信息。

我们的Java测试覆盖工具(以及我们测试覆盖工具家族的其他成员)不会对类代码文件进行仪器化。相反,它们会对源代码进行仪器化,并准确跟踪部分行信息(起始行/列,结束行/列)。

我们的工具可以轻松显示语句各个部分的覆盖情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接