单元测试应该和不应该包含哪些内容?

时间:2010-08-28 17:27:33

标签: unit-testing

显然,I don't understand unit testing。这很好,考虑到我以前从未这样做过。我正在开始一个新项目,并希望从一开始就对其进行单元测试,所以我希望学习。

我一直把单元测试与代码覆盖等同起来,认为你应该有单元测试来覆盖应用程序中的每个函数/方法,但显然情况并非如此,我完全误解了这个概念。

所以,

  • 哪些功能可以从单元测试中受益?
  • 哪些功能不应进行单元测试?

4 个答案:

答案 0 :(得分:2)

我没有完整的答案(我很乐意听到任何人这样做,老实说),但至少可以抛出几点......

  1. 首先,通过测试推动开发,你已经走上了正确的道路。对现有应用程序进行改进的单元测试很困难,并且很少提供真正的好处(相反,通常会给出错误的代码覆盖感)。适当的TDD始终是一个深思熟虑的,从来都不是事后的想法。
  2. 我不打扰测试私人功能。各种代码覆盖工具可能会说它未经测试,但如果它是私有的,则应通过测试公共方法来测试其功能。私有方法是内部的,不是API的一部分,类之外的任何东西(甚至测试)都不应该知道或关心它们,因为如果更改了该类的实现,它们很容易改变。
  3. 专注于代码的公开API。针对您的接口编写测试,而不是针对您的类。这些类本身后来实现并针对测试进行测试。
  4. 最后,非常重要的是,研究你正在做的事情以及它的好处。编写单元测试不是一个棕色和服务过程。通过简单地编写测试,但通过了解TDD以及如何实现它,一个人无法获得良好的测试覆盖率。这需要练习。我要提出的一个建议是做一个正确的TDD项目,并尝试将测试改编成现有项目。我们可以整天告诉对方前者比后者好,但通过这两者你可以真正辨别出差异并更好地理解为什么它更好。这将使您不仅仅是编写测试,而且更像是TDD的专家以及它真正带来的内容。任何人都可以写测试,但他们常常只是在浪费时间,除非他们真正了解正在发生的事情。

答案 1 :(得分:1)

根据TDD(测试驱动开发)方法,我们应该测试每个公共函数,以及该函数中的每个执行路径。

答案 2 :(得分:0)

单元测试是一种工具,有许多方法可以使用它。这是我的方法:

我针对服务和DAO签名编写单元测试,而不是针对DTO和实体类型。大多数值类型将被间接测试。应该测试DTO和实体类型中的equals和hashCode方法。

我使用带有模拟依赖项的纯单元测试和带有完整后端的集成测试。为了获得适当的覆盖,人们需要两者。

答案 3 :(得分:0)

  

我一直把单元测试等同于代码覆盖范围

那不是完全错误。单元测试/任何其他类型的测试自动化在100%的情况下都只有一个真正不可否认的好处:它们实际上运行了代码,即它们涵盖了代码。编译器不会运行代码。静态代码分析不会运行代码。显然,阅读代码不会使其运行。自动化测试会运行代码(以及手动调试)。

任何其他声称的好处仅是潜在的,并且完全取决于编写测试的人的能力和最佳意图。

  

认为您应该具有涵盖所有内容的单元测试   功能/方法在您的应用程序中,但显然并非如此

正确,并不是值得在构建过程中自动运行每一行代码。

  

所以

     
      
  • 哪些功能可以从单元测试中受益?
  •   
  • 哪些类型的功能不应该进行单元测试?
  •   

请牢记以上至少两个条件:

  • 不可能静态消除错误的可能性(尝试以无法表示无效状态和场景的方式设计代码,并避免从单元测试堆中拯救自己)

  • 发生错误的可能性不低,例如代码不是琐碎的/内聚的等等。

OR

这是关键任务组件/部署错误会带来严重后果。在这种情况下,即使出现错误的可能性极低,也应该保持偏执。

OR

代码是已发布/外部可见合同的一部分,例如库接口。在那种情况下,即使是原始的重言式测试也很有用,因为它们会作为可执行的要求/防止您无意间更改已发布的合同(某种上一类关键任务测试的特定情况)。

OR

编写测试实际上比手动编写代码容易,这在大型整体式庞然大物中非常正确。这并不意味着您必须永远保持测试状态,以后如果需要大量维护,可以随时删除它。但是,当然必须在部署之前运行代码,并且必须至少观察一次并接受结果。

就我所知,以上是对的,但前提是要务实。如果优先考虑为草率的工作找个好借口,那么就争取100%覆盖率,并且其他宗教测验做法也完全合理(认为“这不是我的错-所有测验都是绿色的!”)