单元测试的合理代码覆盖率是多少(以及为什么)?

如果你要为单元测试规定一个最小百分比的代码覆盖率,甚至可能作为对存储库提交的要求,那么它会是什么?

请解释你是如何得到你的答案的(因为如果你所做的只是选择一个数字,那么我可以自己完成这一切;)


阿尔贝托萨沃亚的这篇散文恰恰回答了这个问题(以一种很好的娱乐方式):

http://www.artima.com/forums/flat.jsp?forum=106&thread=204677

测试覆盖面上的Testivus

一天早上,一位程序员问大师:

“我准备写一些单元测试。 我应该瞄准哪些代码覆盖范围?“

大师答道:

“不要担心报道,只需写一些好的测试。”

程序员微笑着,鞠躬,然后离开。

...

当天晚些时候,第二位程序员问了同样的问题。

这位大师指着一壶沸水说道:

“我应该在锅里放多少粒米饭?”

程序员看起来很疑惑,回答道:

“我怎么可能告诉你? 这取决于你需要喂养多少人,他们多饿,你正在服用什么其他食物,你有多少大米可用,等等。“

“确切地说,”大师说。

第二位程序员笑了,低头,离开了。

...

即将结束的时候,第三位程序员来到并询问关于代码覆盖的相同问题。

“百分之八十,不能少!”主人用严厉的声音回答道,在桌子上敲着拳头。

第三位程序员微笑着,鞠躬,然后离开。

...

在最后一次回复后,一位年轻的学徒走近这位大师:

“伟大的主人,今天我听到你用三种不同的答案回答关于代码覆盖率的相同问题。 为什么?”

这位大师从他的椅子上站了起来:

“来和我一起喝点新鲜茶吧,让我们来谈谈吧。”

在他们的杯子里放满了吸绿色的热茶后,这位大师开始回答:

“第一个程序员是新手,刚刚开始测试。 现在他有很多代码并且没有测试。 他还有很长的路要走; 在这个时候专注于代码覆盖将会令人沮丧并且毫无用处。 他习惯于编写和运行一些测试。 之后他可以担心报道。“

“另一方面,第二位程序员在编程和测试方面都非常有经验。 当我回答她问我应该投入多少米时,我帮助她意识到必要的测试数量取决于许多因素,而且她比我更了解这些因素 - 毕竟这是她的代码。 没有单一的,简单的答案,而且她足够聪明,能够处理事实并与之合作。“

“我明白了,”这位年轻的学徒说,“但是如果没有简单的答案,那么为什么你回答第三位程序员'百分之八十而且不会少'?”

这位大师笑得如此强烈和大声,以至于他的腹部,证明他喝的不仅仅是绿茶,而是上下翻倒。

“第三位程序员只需要简单的答案,即使没有简单的答案,然后也不会跟着他们。”

这位年轻的学徒和那位花白的大师终于在沉思中喝完了他们的茶。


如果100%覆盖率是您的目标(而不是所有功能的100%测试),则代码覆盖率是一个误导性指标。

  • 你可以通过一次击中所有线来获得100%。 然而,你仍然可能错过了测试这些行命中的特定序列(逻辑路径)。
  • 你无法获得100%,但仍然测试了所有80%/ freq使用的代码路径。 测试每一个'抛出ExceptionTypeX'或类似的防守编程后卫,你已经投入是一个'很高兴'不是'必须有'
  • 因此,请相信自己或您的开发人员要彻底,并通过他们的代码覆盖每条路径。 务实,不要追求神奇的100%覆盖率。 如果你使用TDD代码,你应该获得90%的覆盖率作为奖励。 使用代码覆盖来突出显示你错过的代码块(尽管你不是TDD,但是不应该发生这种情况,因为你编写代码只是为了进行测试通过,没有代码就不存在它的合作伙伴测试。)


    代码覆盖率很高,但功能覆盖率更高。 我不相信我会写每一行。 但我确实相信要编写所有我想提供的功能的100%测试覆盖率(即使对于我自己提供的以及未在会议期间讨论过的额外酷功能)。

    我不在乎是否有代码在测试中没有涉及,但是我会在意我是否会重构我的代码并最终导致不同的行为。 因此,100%的功能覆盖率是我唯一的目标。

    链接地址: http://www.djcxy.com/p/21399.html

    上一篇: What is a reasonable code coverage % for unit tests (and why)?

    下一篇: controls and convert to XPS