19.4 测试驱动的开发
测试驱动开发是一种软件开发的方法,程序员在写代码之前先写单元测试。当创建一个新的类时,开发人员首先根据其预期行为为该类写单元测试。没有一个测试通过,因为该类没有代码。然后,开发人员一次完成一个测试,为该测试编写足够多的代码来通过。当所有的测试都通过时,这个类就完成了。
尽管我是单元测试的坚定拥护者,但我并不喜欢测试驱动的开发。测试驱动开发的问题在于,它把注意力集中在让特定的功能正常工作上,而不是找到最佳的设计。这是纯粹的战术性编程,有其所有的弊端。测试驱动的开发过于增量了:在任何时间点上,都倾向于仅仅破解下一个特性以使下一个测试通过。没有明显的时间来做设计,所以很容易以一团糟而告终。
正如第19.2节中提到的,开发的单位应该是抽象,而不是功能。一旦你发现对抽象的需求,就不要在一段时间内零碎地创建抽象,而要一次性设计好(或至少足以提供一组还算得上全面的核心功能)。这更有可能产生一个简洁的设计,其各个部分可以很好地结合在一起。
在修复bug时,先写测试是有意义的。在修复一个bug之前,写一个因为这个bug而失败的单元测试。然后修复bug,并确保单元测试现在能通过。这是确保你真的修复了bug的最好方法。如果你在写测试之前修复了这个bug,那么新的单元测试有可能并没有真正触发这个bug,在这种情况下,它不会告诉你你是否真的修复了这个问题。
Last updated