测试中的代码覆盖率

时间:2013-10-03 09:59:02

标签: c# .net testing tdd code-coverage

我最近开始使用TDD,或者你可以说测试我的项目,在那里我发现了一些新东西(对我来说是新的东西),被称为"代码覆盖率"它显示了在测试过程中您的代码覆盖了多少。而且我知道大多数老年人都会说它不可能拥有100%的代码覆盖率或者不是很好的做法来获得100%的代码覆盖率。这件事让我想知道这个代码覆盖如何工作我的意思是他们涵盖了哪些基础的代码?请告诉我们测试的主要用法。

我附上了这个问题的代码覆盖率图像。enter image description here

4 个答案:

答案 0 :(得分:5)

实际上,100%的代码覆盖率是可能的,但取决于语言:

  • 有时不考虑导入或包含语句,因此不可能100%
  • 主要取决于所使用的工具(如上面的行被忽略)
  • 如果由于未测试异常而未达到100%,则表示不好。还应该进行恶劣天气测试

关于100%代码覆盖率的实用性:

  • 当然,越高越好
  • 至少应测试所有行,尤其是在像Python这样不太强大的类型语言中。在C / C#等中,编译器会找到更多,但即使这样,也欢迎高代码覆盖率

即使100%的代码覆盖率也不意味着代码是完美的:

  • 测试一行,并不意味着执行完整的行(就像'如果x&& y'只有if语句的一半...如果x导致False,则不再检查y
  • 由于循环和程序流的顺序,变量的值可能不同,从而导致异常。 因此,检查值的组合也很重要。

增加:

如果不需要100%的代码覆盖率(因为一切都需要时间,因此需要花钱),首先要关注代码中的高风险区域。首先跳过琐碎的方法,然后从复杂/高风险函数开始。

使用设计模式或代码结构来“帮助”单元测试也很重要:

  • 从逻辑代码中拆分(G)UI。 (G)UI代码更难以进行单元测试。
  • 使用小功能,简化单元测试(以及制作清晰的设计)。
  • 使代码尽可能松散地连接。这样可以实现清晰的设计,也有助于简化单元测试(不需要使用大量存根)。
  • 考虑测试'框架',例如使用存根(包括向存根注入值来测试好坏天气情况)。

答案 1 :(得分:4)

首先,为了理解代码覆盖的价值,您必须了解您希望用它实现的目标。代码覆盖率可帮助您确定程序代码的质量,例如:它是健壮的还是容易出错,是它有凝聚力还是有隐藏的依赖关系,是否易于改变等等。

具有高代码覆盖率的代码往往是更好的代码,但不能保证它是好的代码。这是因为代码质量很大程度上取决于您的测试用例的构建情况,例如:如果你正在测试你的预期行为,或是对于错误或破坏性的输入,对于角落案件或其他特殊情况等。 如果您的测试套件写得不好,您仍然可以实现高(或100%)代码覆盖率,但您的代码质量会很差。

其次,大多数有经验的开发人员会告诉您100%测试覆盖率的原因并不是必需的,甚至是一个不好的做法是,您需要投入100%代码覆盖率的时间更好地投入到更完整的测试套件中。使用编写得不好的测试套件比使用精心设计的测试套件更容易实现100%的代码覆盖率。

第三,因为你(几乎)从来没有一个完整的测试套件,只是因为我不知道很多人可以考虑所有可能的代码可能出错的情况,你应该迫切需要修改你的测试套装持续(不是无限)而不是解决完整代码覆盖率的错误砍伐。

我希望这段关于代码覆盖率的观点可以帮助您使它对您更有用。

答案 2 :(得分:2)

代码覆盖率很重要,越高越好,因为它表明您的单元测试是彻底的并且已经涵盖了代码区域,从而减少了错误。

您可能不会为您的应用程序达到100%的代码覆盖率,因为MSTest不提供分支,状态覆盖和测试void方法可能很困难。您看到的统计数据基于声明/功能覆盖率。

答案 3 :(得分:0)

我所发现的是代码覆盖率很重要但不必运行100%。如果您获得了大约70%的代码覆盖率,那么它也很好,如果您获得100%的代码覆盖率,那么您的代码也没有必要100%正确