如何确保代码在重构后仍然有效(即变量名称更改后)?
在静态语言中,如果一个类被重命名但其他引用类不是,那么我将得到一个编译错误。
但是在动态语言中没有这样的安全网,如果你不够仔细,你的代码可能会在重构期间破坏。您可以使用单元测试,但是当您使用模拟时,很难知道名称的变化,因此,它可能无济于事。
如何解决这个问题?
答案 0 :(得分:17)
在开始重构之前,你应该创建能够测试你将要改变的测试 - 如果你说单元测试不会被采用,或者它们很难创建,那么一定要创建更高的级别测试可能甚至超过你的整个产品。
如果您的语言具有代码覆盖率工具,请使用它们来衡量您创建的测试的质量 - 在达到相当高的值后,如果测试保持最新并延长,您将能够用非常有效的方式对你的代码做任何事情,并确保事情没有走向错误的方向。
答案 1 :(得分:10)
我一直在教授关于单元测试,重构等的课程,这可能是大多数人都错了。重构不只是更改代码。它正在改变代码而不改变外部功能行为。这是非常重要的一点。
换句话说,您需要有一些方法来验证重构后外部功能行为是否完整。由于缺乏神圣的洞察力,我发现单元测试非常有用。在他关于重构的书中,Martin Fowler强调使用自动化测试进行验证。
如果您的代码是使用TDD开发的,那么您将拥有必要的测试套件,因为它是在代码本身的开发过程中开发的。如果您需要重构没有可用测试的代码,最好的方法是在对代码进行任何更改之前设置自动化测试。我意识到为现有代码设置测试可能很难,但是在这样做时你会学到很多关于代码的知识。
您可能还想检查Bruce Eckel's essay on strong typing versus strong testing,因为它讨论了您从编译器获得的反馈与您从测试套件获得的反馈。
答案 2 :(得分:1)
即使使用编译语言,您的代码也可能在重构期间中断。单靠这一点就会让你陷入困境。自动化测试是确保程序按预期工作的最佳方式。
如果您说的是您正在使用的动态语言,我们可以提供一些可以帮助您进行测试的工具建议。一切都可以测试。
修改强>
您回复并说您使用的是PHP和Python。
如果这是一个Web应用程序,请使用selenium在浏览器中创建测试。首先,您只需要Selenium IDE。将所有测试放在一个测试套件中,以便您可以轻松地执行所有测试。随着列表的增长,您可以开始研究Selenium RC和Selenium Grid。
答案 3 :(得分:0)
1)对于Python,使用PyUnit for PHP phpunit。 2)TDD方法很好,但在编写代码后也可以进行测试。 3)还使用可用于IDE的重构工具,它们只进行安全重构。 在Python中你有绳索(这是库,但有大多数IDE的插件)。 4)好书是: “以测试为导向的开发实例”最佳 '专家Python编程'Tarek Ziade(解释TDD和重构)
谷歌tdd和数据库找到一本关于开发数据库的TDD方法的好书。
为您正在使用的模拟添加信息。仅在涉及数据库或网络时才需要AFAIK模拟。但通常单元测试应该涵盖一小部分代码(仅一个类),有时两个类,所以不需要模型!!