Unit testing 什么时候我应该觉得我的单元测试完成了?

Unit testing 什么时候我应该觉得我的单元测试完成了?,unit-testing,Unit Testing,我最近一直被这个打击。我应该在什么时候感觉到单元测试已经完成?也就是说,在进行单元测试时,您对done的定义是什么?代码覆盖率(函数覆盖率、语句覆盖率、分支覆盖率、条件覆盖率)是否也一样 您无法测试所有可能的场景,但考虑到这是一个系统学问题,我想我应该在这里发布它。我的方法是记住,单元测试是为了发现某些类型的bug。一旦您充分确信单元测试捕获了所有这些bug,您就完成了。您所需要的置信度水平可能因被测系统而异,甚至可能需要其他技术,如正式证明等 有一些系统化的方法可以帮助您派生测试用例,特别是为

我最近一直被这个打击。我应该在什么时候感觉到单元测试已经完成?也就是说,在进行单元测试时,您对done的定义是什么?代码覆盖率(函数覆盖率、语句覆盖率、分支覆盖率、条件覆盖率)是否也一样


您无法测试所有可能的场景,但考虑到这是一个系统学问题,我想我应该在这里发布它。

我的方法是记住,单元测试是为了发现某些类型的bug。一旦您充分确信单元测试捕获了所有这些bug,您就完成了。您所需要的置信度水平可能因被测系统而异,甚至可能需要其他技术,如正式证明等

有一些系统化的方法可以帮助您派生测试用例,特别是为了找到可能存在的bug,比如边界测试(有助于发现许多错误),或者等价划分

覆盖率分析可以帮助您识别您错过的运行时场景(及其相应的潜在bug)——但达到一定的覆盖率水平可能不是一个有用的目标,原因有几个:

  • 并不是每个bug都可以或者应该通过单元测试发现。例如,对于内存泄漏,您宁愿使用内存检查器。对于越界访问,您可以使用静态分析或内存检查器。对于测试与其他组件或硬件的交互,您更愿意进行集成测试:只处理交互的代码应该包含在集成测试中,但不一定包含在单元测试中

  • 可以确定,某些bug不太可能花费您的时间为它们创建测试。记住,你每小时只能花一次,你应该做最有可能被发现的事情。因此,与为琐碎的getter和setter编写测试用例相比,运行静态分析并处理结果可以更好地利用您的时间-尽管这是增加测试覆盖率的简单方法


当测试完全验证系统的已知预期功能时。是的。这是单元测试的主要思想。我更关注的是:步骤1)我检查这个,步骤2)这个,等等……在这种情况下,“这个”仍然只是“系统的功能”。现在还不清楚你在寻找什么样的答案。没有一套测试来验证每个系统的全部甚至部分。测试和被测试的代码一样是定制的。