【问题标题】:Can I exclude part of a method from code coverage?我可以从代码覆盖范围中排除部分方法吗?
【发布时间】:2014-06-08 02:03:34
【问题描述】:

我怀疑答案是否定的,但我还是会问...

TL;DR

我知道我可以使用[ExcludeFromCodeCoverage] 属性从覆盖分析中排除一个类或方法,但是有没有办法只排除方法的部分

具体例子

我有一个懒惰地生成int.MaxValue元素序列的方法:

private static IEnumerable<TElement> GenerateIterator<TElement>(Func<int, TElement> generator)
{
    for (int i = 0; i < int.MaxValue; i++)
    {
        yield return generator(i);
    }
}

在实践中,它永远不会完全枚举,因此永远不会到达方法的末尾。因此,DotCover 认为该方法的 20% 未被覆盖,并将右大括号突出显示为未覆盖(对应于生成的 MoveNext 方法中的 return false)。

我可以编写一个消耗整个序列的测试,但是运行需要很长时间,尤其是在启用覆盖的情况下。

所以我想找到一种方法告诉 DotCover 最后一条指令不需要被覆盖。

注意:我知道我真的不需要所有单元测试涵盖的代码;有些代码不能或不需要测试,我通常排除那些具有[ExcludeFromCodeCoverage] 属性的代码。但是我喜欢对我测试的代码有 100% 的报告覆盖率,因为这样可以更容易地发现代码中未测试的部分。当你知道没有什么要测试的时候,拥有一个覆盖率为 80% 的方法是很烦人的......

【问题讨论】:

  • 好吧,这个方法是静态的,但我会考虑找到一种方法来替换 int.MaxValue,当你用可管理的东西进行测试时,除非这个值实际上是相关的。
  • @AnthonyPegram,这是个好主意;该值并不真正相关,我只想要一个几乎无限的序列。
  • 另一方面,为了避免未覆盖的右大括号而使代码更复杂并不合适......
  • 当然,我反对过度设计的论点。尽管如此,具有默认值 MaxValue 的内部静态最大计数器属性可能会有所帮助,并且不会增加任何真正显着的复杂性。然后,您的测试可以通过设置一个可行的值然后在适用时重置它来设置和拆除。 (这也需要将内部结构暴露给您的单元测试项目,如果您还没有这样做的话。)无论如何,只是一个想法。
  • 如果你用延迟的 LINQ 查询替换它,这对代码覆盖也有用吗?即:return Enumerable.Range(0, int.MaxValue).Select(generator);?编辑:本质上,您会将迭代/产生自身的“责任”转嫁给不计入代码覆盖率的 LINQ 代码。

标签: c# unit-testing code-coverage dotcover


【解决方案1】:

不,无法使用 dotCover 从覆盖率分析中排除“方法的一部分”。

一般来说,您有几个选择:

  1. 将未覆盖的部分提取到自己的方法中,这样您就可以从分析中正确忽略该方法
  2. 忽略问题

在这种情况下,可能会有第三种选择。由于您的测试代码执行了您的大部分方法,也许您应该只编写一个确保代码运行完成的测试方法?

【讨论】:

  • 我有一个迭代器,它肯定会在单元测试的 foreach 循环中运行到完成;它仍然没有显示 100% 的覆盖率,没有使用 dotCover,只是内置的测试资源管理器,它突出显示具有相同效果的代码,它显示最后两个大括号突出显示为未覆盖。
【解决方案2】:

首先,虽然“代码覆盖率”可能是一个重要指标,但我们必须意识到,不可能有 100% 的“代码覆盖率”。 100% 的代码覆盖率是您应该渴望达到的指标之一,但您永远不会;即尽可能靠近。

OTOH,不要疯狂地试图获得 100% 的代码覆盖率。更重要的是,你的代码可读吗?它是否可测试(我想是这样,因为您正在查看代码覆盖率)?是否可维护?它是固体吗?您是否通过了单元、集成和端到端测试?这些事情比实现 100% 的代码覆盖率更重要。代码覆盖率将告诉您测试的范围有多大(我不确定内置的代码覆盖率分析引擎是仅包含单元测试,还是在计算其统计信息时包含所有类型的测试),这可以告诉您无论您是否有足够的测试。此外,虽然它会告诉您测试的范围有多大(即您的测试执行了多少行代码),但它不会告诉您您的测试是否有任何好处(即您的测试是否真的在测试需要测试的内容以确保您的应用程序正常运行)。

无论如何,这可能不是答案,而是值得深思的。

【讨论】:

    猜你喜欢
    • 2011-04-02
    • 1970-01-01
    • 2014-08-23
    • 2018-07-27
    • 1970-01-01
    • 2021-02-12
    • 1970-01-01
    • 2016-03-21
    • 2016-03-29
    相关资源
    最近更新 更多