重构和测试驱动开发

K2J*_*K2J 5 testing refactoring unit-testing

我目前正在阅读两本优秀的书籍"有效地使用遗留代码"和"清洁代码".

他们让我思考我以全新的方式编写和使用代码的方式,但其中一个常见的主题是测试驱动的开发以及在进行更改或实现之前通过测试和测试来扼杀所有内容的想法一个新的功能.

这导致了两个问题:

问题1:如果我正在使用遗留代码.根据书籍,我应该进行测试,以确保我没有破坏任何东西.考虑一下我的方法有500行.我假设我将有一套等效的测试方法来测试该方法.当我拆分此功能时,是否为每个新的方法/类创建新的测试结果?

根据"清洁代码",任何超过1/10秒的测试都需要花费太长时间.试图测试一个500长线遗留方法进入数据库并且上帝知道还有什么可能需要超过1/10秒.虽然我理解你需要打破依赖关系,但我遇到的问题是初始测试创建.

问题2:当代码被重新分解以至于在结构上它不再像原始代码(添加/删除到方法等的新参数)时会发生什么.那么测试还需要重新分解吗?在这种情况下,您可以在允许测试继续通过的同时改变系统的功能吗?在这种情况下,重新分解测试是否适合做?

虽然我可以通过假设继续下去,但我想知道从集体经验中是否有任何关于此类问题的想法/建议.

egl*_*ius 4

  1. 这就是处理遗留代码时的情况。遗留意味着没有测试且紧密耦合的系统。为该代码添加测试时,您实际上是在添加集成测试。当您重构并添加避免网络调用等的更具体的测试方法时,这些将是您的单元测试。您想保留两者,然后将其分开,这样您的大多数单元测试都会快速运行。
  2. 您可以通过非常小的步骤来做到这一点。实际上,您在测试和代码之间不断切换,并且您是正确的,如果您更改签名(小步骤),则需要更新相关测试。

另请检查我的“更新 2”,了解如何改进我的 junit 测试。它不是关于遗留代码和处理它已经存在的耦合,而是关于如何在涉及外部系统(即数据库、电子邮件等)的情况下编写逻辑+测试。