C# 代码覆盖率中未考虑委派开关
在使用开关箱时,我发现了以下问题。R#向我展示了switch语句的简化,它在分配变量时基本上将委托绑定到case标签C# 代码覆盖率中未考虑委派开关,c#,visual-studio,resharper,code-coverage,switch-expression,C#,Visual Studio,Resharper,Code Coverage,Switch Expression,在使用开关箱时,我发现了以下问题。R#向我展示了switch语句的简化,它在分配变量时基本上将委托绑定到case标签 var shape = shapeType switch { ShapeType.Ellipse => new Ellipse(), ShapeType.Polygon => new Polygon(), _ => new Rectangle() }; 这样做的好处是对于大型开关案例的可读性,因为分配开关基本上可以节省三分之二的行 我的
var shape = shapeType switch
{
ShapeType.Ellipse => new Ellipse(),
ShapeType.Polygon => new Polygon(),
_ => new Rectangle()
};
这样做的好处是对于大型开关案例的可读性,因为分配开关基本上可以节省三分之二的行
我的问题是:我非常喜欢这种类型的开关,因为它提高了可读性,但VisualStudio的代码覆盖工具(VS Enterprise 2019-16.4.4)没有考虑到这一点。由于我们的政策致力于90%的代码覆盖率,因此每一个百分比都是有价值的
是否有可能将这些开关包括在代码覆盖范围内?Kate在这里有一个观点。
我的项目有一个硬100%的代码覆盖率阈值,开关表达式永远不会被完全覆盖,即使等效的开关语句是
以下是一个例子:
以下switch语句在我的项目中提供了100%的代码覆盖率:
switch (values[3])
{
case "F": return new string(Convert.ToString(value, 2).Reverse().ToArray()).PadRight(max, '0');
case "G": return $"{value} of {max}";
case "R" when value == 0: return $"none of {max}";
case "R" when value == 1: return $"1st of {max}";
case "R" when value == 2: return $"2nd of {max}";
case "R" when value == 3: return $"3rd of {max}";
default: return $"{value}th of {max}";
}
等效开关表达式仅给出99.91%,基于Jenkins的构建失败:
return values[3] switch
{
"F" => new string(Convert.ToString(value, 2).Reverse().ToArray()).PadRight(max, '0'),
"G" => $"{value} of {max}",
"R" when value == 0 => $"none of {max}",
"R" when value == 1 => $"1st of {max}",
"R" when value == 2 => $"2nd of {max}",
"R" when value == 3 => $"3rd of {max}",
_ => $"{value}th of {max}"
};
代码覆盖率着色并不表示哪个分支没有被覆盖,因为它标记了整个语句
我认为这是编译器如何生成表达式的最终IL的问题。
应将其作为C#bug解决,并提交给Microsoft进行修复。使用属性
[ExcludeFromCodeOverage]
?在这种情况下,我们不允许使用[ExcludeFromCodeOverage]。否则,人们会发送垃圾邮件,这会降低代码覆盖率的价值。我们可以修改“CodeCoverage.runsettings”,但只能排除整个函数、类或名称空间。它实际上被称为a。如果您对此有很好的修改,您应该针对该工具提交错误/问题。这可能是语言特性和编译器团队领先于代码覆盖团队的结果。请务必描述它对您的开发流程的影响,这回答了我的问题-具有相同的问题,带有新的C#8.0交换机功能,并且它稍微降低了代码覆盖率