繁体   English   中英

测试中的代码覆盖率

[英]Code coverage in Testing

我最近开始使用TDD,或者可以说对我的项目进行测试,然后发现了一些新东西(对我来说是新东西),称为“代码覆盖率”,它显示了在测试过程中覆盖了多少代码。 据我所知,大多数前辈都说不可能有100%的代码覆盖率或获得100%的代码覆盖率不是很好的做法。 这件事让我感到奇怪,就像这段代码覆盖率是如何工作的,我的意思是说它们覆盖了基于哪些基础的代码? 请说明测试的主要用法。

我在这个问题上附加了代码覆盖率的图像。 在此处输入图片说明

实际上,可以实现100%的代码覆盖率,但在某种程度上取决于语言:

  • 有时不考虑导入或包含语句,因此不可能100%
  • 这主要取决于所使用的工具(就像上面的行是否被忽略)
  • 如果由于没有测试异常而没有达到100%,那不是很好。 另外,应进行恶劣的天气测试

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

  • 当然,越高越好
  • 至少应该测试所有行,尤其是在不那么强大的tyep语言(如Python)中。 在C / C#等程序中,编译器会找到更多,但即使这样,仍然欢迎高代码覆盖率

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

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

加成:

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

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

  • 从逻辑代码中分离(G)UI。 (G)UI代码通常更难进行单元测试。
  • 使用小的功能可以简化单元测试(并进行清晰的设计)。
  • 使代码尽可能松散地连接。 这样可以得到清晰的设计,还可以帮助简化单元测试(不需要使用大量存根)。
  • 考虑一个测试“框架”,例如使用存根,包括向存根中注入值以测试好天气和坏天气。

首先,为了了解代码覆盖率的价值,您必须了解要使用它实现的目标。 代码覆盖率可帮助您确定程序代码的质量,例如它是否健壮或容易出错,是否具有凝聚力或是否具有隐藏的依赖性,是否易于更改等。

具有较高代码覆盖率的代码往往是更好的代码,但不能保证它是好的代码。 这是因为代码质量在很大程度上取决于测试用例的构建方式,例如,如果您正在良好地测试预期的行为,是否输入了错误或破坏性的输入,是否遇到了极端情况或其他特殊情况,等等。编写后,您仍然可以实现较高(或100%)的代码覆盖率,但是您的代码质量较低。

其次,不需要大多数有经验的开发人员告诉您100%的测试覆盖率甚至是一种不好的做法的原因是,为了使代码覆盖率达到100%,您需要投入更多的时间来投资更完整的测试套件。 与编写良好的测试套件相比,编写不良的测试套件通常甚至更容易实现100%的代码覆盖率。

第三,由于您(几乎)永远不会拥有完整的测试套件,仅因为我不认识许多人,他们可以考虑所有可能导致代码出错的情况,因此,您应该紧急地不断修改您的测试套件(不是无限地)而不是解决整个代码覆盖率的虚假下降。

我希望这种关于代码覆盖率的观点能帮助您使其对您更有用。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM