我最近在工作中的导师介绍下了解到了测试驱动开发的方法,并且他鼓励我在“有意义”的情况下编写单元测试。我理解对于回归测试和重构来说拥有一套完整的单元测试套件的一些好处,但我确实想知道我们应该多频繁、多详尽地编写单元测试。
我的导师/开发负责人要求我为一个已经由现有测试类测试的方法中新增的控制流编写新的单元测试用例,我认为这是过度设计。您通常编写单元测试的频率如何,您认为单元测试应该有多详细?谢谢!
我最近在工作中的导师介绍下了解到了测试驱动开发的方法,并且他鼓励我在“有意义”的情况下编写单元测试。我理解对于回归测试和重构来说拥有一套完整的单元测试套件的一些好处,但我确实想知道我们应该多频繁、多详尽地编写单元测试。
我的导师/开发负责人要求我为一个已经由现有测试类测试的方法中新增的控制流编写新的单元测试用例,我认为这是过度设计。您通常编写单元测试的频率如何,您认为单元测试应该有多详细?谢谢!
技术上讲,如果你严格遵循测试驱动开发(TDD)的方法,那么在规划应用程序的任何部分之后,你都应该编写单元测试。应该按以下顺序进行:
用户需求 -> 功能设计 -> 单元测试 -> 代码
记住,在TDD中测试先于代码。
每当你编写任何代码时,都应该编写单元测试。正如其他人指出的那样,在TDD中,你在编写代码之前编写测试。
如果你认为这是过度的,那就问问自己:“如果我不测试这段代码,我怎么知道它能正常工作呢?”
单元测试应该让你有信心,你所编写的代码能够按照你的意愿运行。因此,你应该编写尽可能多的测试来获得这种信心。
编写测试,尤其是可测试的代码,是一种独立的技能,就像学习每种新语言编程一样,都是一种独立的技能。
阅读 Miško Hevery 的博客,读一些书籍(我喜欢 Lasse Koskela 的 Test Driven),使用一些代码覆盖工具,如Clover,然后编写一些测试。
随着您编写测试,您的测试技能将得到改善,并且您将逐渐理解编写可测试代码所涉及的内容。然后,您将能够确定特定项目所需的代码覆盖水平。
我最近也成为了TDD的信徒,发现它非常有帮助。其核心思想是一旦你有了规范,就开始编写单元测试。一旦你编写了测试,你的大部分代码都可以来自这些测试。剩下的就是你测试中的断言基础,然后你就有了一个非常好的可重复模式:编写测试、实现代码、通过断言进行确认、继续。真是太棒了!
正如Justin所说,你应该在编写代码之前编写单元测试。
虽然这可能是最好的做法,但有时会过度。根据项目的不同,我有时仅为每个发现(并解决)的错误编写一个单元测试。
当然,我可能会错过其中一些,但随着时间的推移,我的单元测试变得越来越有效,并且我非常确定我永远不会错过已经纠正的错误。
单元测试将会:
正如您的导师所提到的,您应该只编写有意义的单元测试。我使用的经验法则是,尝试为执行业务逻辑的代码片段编写单元测试。我通常不为仅具有getter和setter的bean类编写单元测试。
随着时间的推移,单元测试通常变得更有价值,因为它们被扩展和增强以处理初始交付后进行的错误修复和其他代码增强。
在进行测试驱动开发时,单元测试的一个基本原则是它们描述功能。如果测试没有定义如何处理 null 输入等内容,那么就不能期望其能够正常工作。
如果您现有的测试套件不足,则应始终编写测试。最好的迹象是,您的测试不足会导致出现错误。因此,一个好的实践是为遇到的每个错误编写单元测试。使用测试驱动开发,您应该从一些测试开始,定义类的功能。测试覆盖工具可以为您提供一些提示,哪些部分可能需要更多的测试。