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

C# 我可以从代码覆盖范围中排除方法的一部分吗?,c#,unit-testing,code-coverage,dotcover,C#,Unit Testing,Code Coverage,Dotcover,我想答案是否定的,但我还是会问 TL;DR 我知道我可以使用[ExcludeFromCodeCoverage]属性从覆盖率分析中排除类或方法,但是有没有办法只排除方法的一部分? 具体例子 我有一个方法,可以懒洋洋地生成int.MaxValue元素序列: private static IEnumerable<TElement> GenerateIterator<TElement>(Func<int, TElement> generator) { for

我想答案是否定的,但我还是会问

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);
    }
}
专用静态IEnumerable生成器(Func生成器)
{
对于(int i=0;i
在实践中,它永远不会被完全枚举,因此永远不会到达方法的末尾。因此,DotCover认为20%的方法未被覆盖,并突出显示未覆盖的右大括号(对应于生成的
MoveNext
方法中的
return false

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

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

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

首先也是最重要的,虽然“代码覆盖率”可能是一个重要的指标,但你必须意识到,拥有100%的“代码覆盖率”是不可能的。100%的代码覆盖率是您应该渴望实现的指标之一,但您永远不会实现;i、 尽可能靠近

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


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

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

一般来说,您有两种选择:

  • 将未覆盖的部分提取到它自己的方法中,这样您就可以从analsysis中正确地忽略该方法
  • 忽略问题

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

    好吧,这个方法是静态的,但我想在您使用可管理的东西进行测试时,找到一种替代
    int.MaxValue
    的方法,“除非那个值真的有什么关系,”AnthonyPegram说,这是个好主意;这个值并不是真的相关,我只是想要一个实际上是无限的序列。另一方面,仅仅为了避免一个未覆盖的右括号而使代码更复杂是不对的……当然,我得到了反对过度工程的论点。不过,默认值为MaxValue的内部静态max counter属性可能会有所帮助,并且不会增加任何实际的复杂性。然后,您的测试可以通过设置一个可行的值,然后重置它(如适用)来设置和删除。(如果还没有,这还需要将内部构件公开给单元测试项目。)总之,只是一个想法。如果要用延迟的LINQ查询替换它,这对代码覆盖率也有效吗?即:
    return Enumerable.Range(0,int.MaxValue)。选择(generator)?编辑:本质上,你会“推卸”迭代的责任/将自己交给LINQ代码,这不会被代码覆盖率计算在内;它仍然没有显示100%的覆盖率,没有使用dotCover,只是内置的测试资源管理器,并且它突出显示代码,具有相同的效果,它显示最后两个大括号突出显示为未覆盖。