我怀疑答案是否定的,但无论如何我都会问......
TL; DR
我知道我可以使用[ExcludeFromCodeCoverage]
属性从覆盖率分析中排除某个类或方法,但是否只能排除某个方法的 part ?
具体示例
我有一种懒惰地生成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%覆盖率的方法是非常烦人的......
答案 0 :(得分:3)
首先,虽然“代码覆盖率”可能是一个重要指标,但必须意识到它可能无法实现100%的“代码覆盖率”。 100%代码覆盖率是您应该渴望实现的指标之一,但您永远不会这样做;即尽可能接近。
OTOH,不要试图获得100%的代码覆盖率。更重要的是,您的代码是否可读?它是可测试的(我假设您正在查看代码覆盖率)吗?它可维护吗?它是SOLID吗?您是否通过了单元,集成和端到端测试?这些比实现100%代码覆盖更重要。代码覆盖率会告诉您测试的广泛程度(我不确定内置代码覆盖率分析引擎是否仅包含单元测试,还是在计算统计数据时包含所有类型的测试),这样可以指示你是否有足够的考试。此外,虽然它会告诉您测试的范围有多广(即测试执行了多少行代码),但它不会告诉您测试是否有任何好处(即您的测试是否真正测试了需要测试的内容)确保您的应用程序正常运行。无论如何,这可能不是一个答案,而是值得深思。
答案 1 :(得分:3)
不,没有办法排除&#34;方法的一部分&#34;来自使用dotCover的覆盖率分析。
一般来说,你有几个选择:
在这种情况下,可能有第三种选择。由于您的测试代码会运用您的大多数方法,或许您应该编写一个测试方法来确保代码运行完成?