代码覆盖范围内未考虑委派 Switch

Posted

技术标签:

【中文标题】代码覆盖范围内未考虑委派 Switch【英文标题】:Delegating Switch not considered in Code Coverage 【发布时间】:2020-06-11 11:58:26 【问题描述】:

我在使用开关盒时发现了以下问题。 R# 向我展示了 switch 语句的简化,它在分配变量时基本上将委托绑定到 case 标签。

var shape = shapeType switch

    ShapeType.Ellipse => new Ellipse(),
    ShapeType.Polygon => new Polygon(),
    _ => new Rectangle()
;

这样做的好处是大型开关案例的可读性,因为您基本上节省了三分之二的行来分配开关。

我的问题:我真的很喜欢这种类型的开关,因为它提高了可读性,但这在 Visual Studio 的代码覆盖工具(VS Enterprise 2019 - 16.4.4)中没有考虑。由于我们的政策力求实现约 90% 的代码覆盖率,因此每个百分比都很有价值。

是否有可能将这些开关包含在代码覆盖范围中?

【问题讨论】:

使用属性[ExcludeFromCodeCoverage] ? 我们不允许在这种情况下使用 [ExcludeFromCodeCoverage]。否则人们会向它发送垃圾邮件,这会降低代码覆盖率的价值。我们可以修改“CodeCoverage.runsettings”,但只能排除整个函数、类或命名空间。 其实叫switch expression 如果您对此有很好的重现,您应该针对该工具提交错误/问题。这可能是语言特性和编译器团队领先于代码覆盖率团队的结果。请务必描述它对您的开发流程的影响 【参考方案1】:

凯特在这里有一个观点。 我的项目有一个硬 100% 的代码覆盖率阈值,并且 switch 表达式永远不会被完全覆盖,即使等效的 switch 语句是。

这是一个例子:

以下 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 $"valueth of max";

等效的switch表达式只给出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",
    _ => $"valueth of max"
;

并且代码覆盖率着色并不表示哪个分支没有被覆盖,因为它标记了整个语句。

我认为这是编译器如何生成表达式的最终 IL 的问题。 它应该作为一个 C# 错误解决并提交给 Microsoft 进行修复。

【讨论】:

好的,这回答了我的问题 - 与新的 C# 8.0 开关功能有相同的问题,并且它略微降低了代码覆盖率

以上是关于代码覆盖范围内未考虑委派 Switch的主要内容,如果未能解决你的问题,请参考以下文章

java扩展或覆盖switch案例

如何配置 SonarQube 让我们增加覆盖范围?

MySQL ---- 索引类型 & 使用规则 & 回表覆盖索引 & 设计索引考虑因素

MySQL ---- 索引类型 & 使用规则 & 回表覆盖索引 & 设计索引考虑因素

SonarQube 是不是总是需要外部代码覆盖工具来显示声纳服务器上的覆盖范围?

从 .net 6 的代码覆盖范围中排除 Program.cs [重复]