代码覆盖率中未考虑委派开关
Delegating Switch not considered in Code Coverage
我在处理 switch case 时发现了以下问题。 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% 的代码覆盖率,因此每个百分比都很有价值。
是否有可能将这些开关包含在代码覆盖率中?
凯特说得有道理。
我的项目有一个硬性 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 $"{value}th 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}",
_ => $"{value}th of {max}"
};
并且代码覆盖着色不会指示哪个分支未被覆盖,因为它标记了整个语句。
我认为这是编译器如何生成表达式的最终 IL 的问题。
它应该作为 C# 错误解决并提交给 Microsoft 进行修复。
我在处理 switch case 时发现了以下问题。 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% 的代码覆盖率,因此每个百分比都很有价值。
是否有可能将这些开关包含在代码覆盖率中?
凯特说得有道理。 我的项目有一个硬性 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 $"{value}th 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}",
_ => $"{value}th of {max}"
};
并且代码覆盖着色不会指示哪个分支未被覆盖,因为它标记了整个语句。
我认为这是编译器如何生成表达式的最终 IL 的问题。 它应该作为 C# 错误解决并提交给 Microsoft 进行修复。