我有很多类似于以下课程的课程:
public class Foo
{
private readonly Ba _ba;
private Foo(Ba ba)
{
if (ba is null) throw new ArgumentNullException(ba);
_ba = ba;
}
}在其他类的内部结构中,我调用Foo的构造函数,但由于这是无意的,在每个构造函数调用中,ba不是null。
我为包含的框架编写了许多测试方法,但是我无法达到100 %的代码覆盖率,因为上面的代码片段中的异常是较新抛出的。
我认为有以下备选办法:
Foo(null)时,调试就会更加困难。Foo(Ba)实现是有效的,但是每当我更改实现时,构造函数中的新代码路径就会开发出来,并且意外地错过了测试。你将如何解决这个难题?
备注
代码示例是用C#编写的,但是这个问题可能会解决一般的单元测试/异常处理问题。
C# 8可能通过引入非空引用类型解决这个问题,但我正在寻找一个好的解决方案,直到它已经发布稳定。
发布于 2019-04-16 23:35:57
您错过了最重要的选择:不要将其视为实现100%代码覆盖率的理想目标。
严格地说,代码中的健壮性检查不能以合理的方式进行测试。这也会发生在代码的其他各个部分--这通常发生在switch语句中,其中明确覆盖了所有可能的情况,并且添加了额外的默认情况,只是为了抛出异常或以其他方式处理这种“不可能”的情况。或者,考虑一下添加到代码中的断言语句:既然断言永远不会失败,那么严格地说,永远也不可能覆盖隐藏在断言语句中的else分支--如何测试断言中的表达式是否适合实际检测您希望它出现的问题?
删除这样的健壮性代码和断言不是一个好主意,因为它们也保护您不受未来更改的不良影响。从覆盖率分析中排除代码可能是可以接受的例子,但在我提到的大多数情况下,这将不是一个好的选择。最后,您必须做出明智的决定(通过详细查看覆盖率报告,而不仅仅是总体百分比),您的代码中哪些语句/分支等确实需要覆盖,哪些不需要。
最后,请注意,高代码覆盖率并不一定表示您的测试套件具有高质量。如果您的测试套件能够检测到可能存在的代码中的错误,那么它就具有很高的质量。您可以拥有一个100%覆盖范围的测试套件,它不会检测到任何潜在的错误。
https://stackoverflow.com/questions/55562538
复制相似问题