【问题标题】:MSTest Shows Partial Code Coverage on Compound Boolean ExpressionsMSTest 显示复合布尔表达式的部分代码覆盖率
【发布时间】:2012-10-18 05:08:53
【问题描述】:

从 Microsoft 的文档中,部分覆盖的代码是 “...该行中的一些代码块没有被执行。” 我很困惑这个(为简洁起见):

鉴于此方法:

public List<string> CodeUnderTest()
{
    var collection = new List<string> { "test1", "test2", "test3" };
    return collection.Where(x => x.StartsWith("t") && x == "test2").ToList();
}

还有这个测试:

[TestMethod]
public void Test()
{
    var result = new Class1().CodeUnderTest();
    CollectionAssert.Contains(result, "test2");
}

代码覆盖结果显示表达式x.StartsWith("t") &amp;&amp; x == "test2 仅被部分覆盖。我不确定这怎么可能,除非编译器或 CLR 有某种急切的条件匹配的东西,但也许我只需要解释一下。

【问题讨论】:

  • 值得注意的是,在多个布尔条件下使用||也是如此。
  • 当然|| 有意义,但&amp;&amp; 没有意义——如果&amp;&amp; 语句的计算结果为真,它怎么可能跳过任何条件? - 我现在遇到这个问题,这很疯狂。零意义。

标签: c# unit-testing mstest code-coverage


【解决方案1】:

条件与运算符 (&&) 对其布尔操作数执行逻辑与,但仅在必要时计算其第二个操作数。

http://msdn.microsoft.com/en-us/library/2a723cdk(v=vs.100).aspx

所以你会期望双方都被覆盖

也许它抱怨的是你没有测试 -ve 路径,即如果你的集合是

var collection = new List<string> { "test1", "test2", "test3", "not_this_one" };

这样您可以测试 x.StartsWith("t") 是否为 T/F,因为目前仅针对该条件测试 T 路径。

【讨论】:

  • 所以经过一番挖掘,当使用&amp;&amp; 时,它似乎没有考虑完全覆盖代码,除非:A &amp;&amp; B,代码测试{A=true,B=false} (false),{A=false,B=not evaluated} (假)和{A=true,B=true}(真)。但仅在复合时。分别给定AB,它们的真假并不重要。
  • @lukiffer,这是正确的。 Visual Studio 的覆盖工具通过basic block 分析工作。基本上,每个基本块的开头都有一个探针来记录它是否在测试期间被执行。在这样的语句的情况下,多个基本块映射到同一行。如果任何基本块没有执行(例如通过条件评估短路,正如您所注意到的),那么该行将显示为部分覆盖。资料来源:我是 VS2012 之前的覆盖工具的开发者。
  • 但是,如果 A 为真,B 为真——那么 I 编写的两个代码块都会被执行——(它必须评估它们,是的?) - 但你是说我必须测试所有组合,因为编译器生成的块? - 似乎有点疯狂,我应该测试编译器生成的代码。 :-/
  • @BrainSlugs83 您不必这样做,但如果您正在寻找完整的分支覆盖率而不仅仅是语句覆盖率,那么您会这样做
  • 那么如何部分覆盖:if (x.Collection != null &amp;&amp; x.Collection.Count != 0) { },而这个完全覆盖:if (x.Collection != null) if (x.Collection.Count != 0) { } 使用相同的测试集。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-08
  • 2012-01-18
  • 2017-05-31
  • 1970-01-01
相关资源
最近更新 更多