10

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

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% 的方法没有被覆盖,并且它突出显示右大括号为未覆盖(对应return false于生成的MoveNext方法)。

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

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

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

4

2 回答 2

6

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

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

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

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

于 2014-07-26T21:26:40.450 回答
2

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

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

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

于 2014-07-26T21:24:16.753 回答