首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内部安全检查,如何达到100 %的代码覆盖率?

内部安全检查,如何达到100 %的代码覆盖率?
EN

Stack Overflow用户
提问于 2019-04-07 18:54:37
回答 1查看 64关注 0票数 0

我有很多类似于以下课程的课程:

代码语言:javascript
复制
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 %的代码覆盖率,因为上面的代码片段中的异常是较新抛出的。

我认为有以下备选办法:

  • 删除null检查:--这对于当前的项目实现是有效的,但是每当我可能添加意外调用Foo(null)时,调试就会更加困难。
  • 使用[ExcludeFromCodeCoverage]来修饰构造函数--这对于当前的Foo(Ba)实现是有效的,但是每当我更改实现时,构造函数中的新代码路径就会开发出来,并且意外地错过了测试。

你将如何解决这个难题?

备注

代码示例是用C#编写的,但是这个问题可能会解决一般的单元测试/异常处理问题。

C# 8可能通过引入非空引用类型解决这个问题,但我正在寻找一个好的解决方案,直到它已经发布稳定。

EN

回答 1

Stack Overflow用户

发布于 2019-04-16 23:35:57

您错过了最重要的选择:不要将其视为实现100%代码覆盖率的理想目标。

严格地说,代码中的健壮性检查不能以合理的方式进行测试。这也会发生在代码的其他各个部分--这通常发生在switch语句中,其中明确覆盖了所有可能的情况,并且添加了额外的默认情况,只是为了抛出异常或以其他方式处理这种“不可能”的情况。或者,考虑一下添加到代码中的断言语句:既然断言永远不会失败,那么严格地说,永远也不可能覆盖隐藏在断言语句中的else分支--如何测试断言中的表达式是否适合实际检测您希望它出现的问题?

删除这样的健壮性代码和断言不是一个好主意,因为它们也保护您不受未来更改的不良影响。从覆盖率分析中排除代码可能是可以接受的例子,但在我提到的大多数情况下,这将不是一个好的选择。最后,您必须做出明智的决定(通过详细查看覆盖率报告,而不仅仅是总体百分比),您的代码中哪些语句/分支等确实需要覆盖,哪些不需要。

最后,请注意,高代码覆盖率并不一定表示您的测试套件具有高质量。如果您的测试套件能够检测到可能存在的代码中的错误,那么它就具有很高的质量。您可以拥有一个100%覆盖范围的测试套件,它不会检测到任何潜在的错误。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55562538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档