MSTest显示复合布尔表达式的部分代码覆盖率

luk*_*fer 10 c# unit-testing mstest code-coverage

从微软的文档中,部分覆盖的代码是"......其中一些代码块没有被执行." 我非常难过这个(简化为简洁):

鉴于此方法:

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

而这个测试:

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

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

Sha*_*lde 14

条件AND运算符(&&)执行其bool操作数的逻辑AND,但仅在必要时才计算其第二个操作数.

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

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

也许它抱怨的是你没有测试-ve路径,即你的收藏是否

var collection = new List<string> { "test1", "test2", "test3", "not_this_one" };
Run Code Online (Sandbox Code Playgroud)

这样你就可以测试x.StartsWith("t")T/F,因为目前只有T路径正在测试该条件.

  • @lukiffer,这是正确的.Visual Studio的覆盖工具通过[basic block](http://en.wikipedia.org/wiki/Basic_block)分析工作.基本上,每个基本块的开头都有一个探测器,用于记录它是否在测试期间执行.在诸如这些语句的情况下,多个基本块映射到同一行.如果任何基本块没有执行(例如通过条件评估短路,正如您所注意到的那样),那么该线将显示为部分覆盖.资料来源:我是VS2012之前的覆盖工具的开发者. (4认同)
  • 所以在经过一些挖掘之后,当使用`&&`时,似乎它不会考虑完全覆盖的代码,除非给出:`A && B`,代码测试`{A = true,B = false}`(false),` {A = false,B =未评估}`(false)和`{A = true,B = true}`(true).但只有在复合时.单独给出"A"或"B",无论它们是真还是假都没关系. (2认同)