首页 文章

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

提问于
浏览
5

我怀疑答案是否定的,但无论如何我都会问...

TL;DR

我知道我可以使用 [ExcludeFromCodeCoverage] 属性从覆盖率分析中排除类或方法,但是 is there a way to exclude only part of a method?

Concrete example

我有一个懒惰地生成一系列 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%覆盖率的方法是非常烦人的...

2 回答

  • 3

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

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

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

    • 忽略问题

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

  • 2

    首先,虽然“代码覆盖率”可能是一个重要的指标,但必须意识到它可能无法实现100%的“代码覆盖率” . 100%代码覆盖率是您应该渴望实现的指标之一,但您永远不会这样做;即尽可能接近 .

    OTOH,不要试图获得100%的代码覆盖率 . 更重要的是,您的代码是否可读?它是可测试的(我假设您正在查看代码覆盖率)?它可维护吗?它是SOLID吗?您是否通过了单元,集成和端到端测试?这些比实现100%代码覆盖更重要 . 代码覆盖率会告诉您测试的广泛程度(我不确定内置代码覆盖率分析引擎是否仅包含单元测试,还是在计算统计数据时包含所有类型的测试),这样可以指示你是否有足够的考试 . 此外,虽然它会告诉您测试的范围有多广(即测试执行了多少行代码),但它不会告诉您测试是否有任何好处(即您的测试是否真正测试了需要测试的内容)确保您的应用程序正常工作) .

    无论如何,这可能不是一个答案,而是值得深思 .

相关问题