我可以从代码覆盖中排除方法的一部分吗?

本文关键字:一部分 方法 排除 代码 覆盖 我可以 | 更新日期: 2023-09-27 18:07:33

我怀疑答案是否定的,但我还是要问一下……

TL;博士

我知道我可以用[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%的覆盖率是很烦人的…

我可以从代码覆盖中排除方法的一部分吗?

不,没有办法将"方法的一部分"从dotCover的覆盖率分析中排除。

一般来说,你有两个选择:

  1. 将未覆盖的部分提取到其自己的方法中,以便您可以适当地从分析中忽略该方法
  2. 忽略问题

在这种情况下,可能有第三个选项。既然您的测试代码执行了方法的大部分内容,也许您应该只编写一个测试方法来确保代码运行到完成?

首先,虽然"代码覆盖率"是一个重要的度量标准,但人们必须意识到,100%的"代码覆盖率"可能是不可能的。100%的代码覆盖率是您应该渴望达到的指标之一,但您永远不会实现;也就是说,尽可能靠近。

OTOH,不要疯狂地试图获得100%的代码覆盖率。更重要的是,您的代码是否可读?它是可测试的吗(我认为是这样,因为你在看代码覆盖率)?它是否可维护?它是坚固的吗?您有通过单元测试、集成测试和端到端测试吗?这些事情比实现100%的代码覆盖率更重要。代码覆盖率将告诉您测试的范围有多广(我不确定内置的代码覆盖率分析引擎在计算其统计数据时是否只包括单元测试,还是包括所有类型的测试),这将指示您是否有足够的测试。此外,虽然它会告诉你你的测试有多广泛(例如,你的测试执行了多少行代码),但它不会告诉你你的测试是否很好(例如,你的测试是否真的测试了需要测试的东西,以确保你的应用程序正常工作)。

无论如何,这可能不是一个答案,但值得思考。