如何确保代码在重构后(即变量名更改后)仍然有效?
在静态语言中,如果一个类被重命名但其他引用类没有,那么我会得到一个编译错误。
但是在动态语言中没有这样的安全网,如果你不够小心,你的代码可能会在重构过程中中断。您可以使用单元测试,但是当您使用模拟时,很难知道名称的变化,因此可能无济于事。
如何解决这个问题呢?
如何确保代码在重构后(即变量名更改后)仍然有效?
在静态语言中,如果一个类被重命名但其他引用类没有,那么我会得到一个编译错误。
但是在动态语言中没有这样的安全网,如果你不够小心,你的代码可能会在重构过程中中断。您可以使用单元测试,但是当您使用模拟时,很难知道名称的变化,因此可能无济于事。
如何解决这个问题呢?
在开始重构之前,您应该创建能够测试您将要更改的内容的测试——如果您说单元测试不够,或者它们很难创建,那么无论如何都要创建更高级别的测试,甚至可能锻炼整个产品。
如果您有针对您的语言的代码覆盖工具,请使用它们来衡量您创建的测试的质量——在达到相当高的值之后,如果测试保持最新并扩展,您将能够做任何事情非常有效地使用您的代码,并确保事情没有朝着错误的方向发展。
我一直在教一门关于单元测试、重构等的课程,这可能是大多数人犯错的地方。重构不仅仅是改变代码。它正在更改代码而不更改外部功能行为。这是非常重要的一点。
换句话说,您需要有某种方法来验证重构后外部功能行为是否完好无损。由于缺乏神圣的洞察力,我发现单元测试对此非常有用。在他关于重构的书中,Martin Fowler 强调了使用自动化测试来进行验证。
如果您的代码是使用 TDD 开发的,那么您将拥有必要的测试套件,因为它是在代码本身开发期间开发的。如果您需要重构没有可用测试的代码,最好的方法是在对代码进行任何更改之前设置自动化测试。我意识到为现有代码设置测试可能很困难,但是在这样做的过程中你会学到很多关于代码的知识。
您可能还想查看Bruce Eckel 关于强类型与强测试的文章,因为它讨论了您从编译器获得的反馈与您从测试套件获得的反馈。
即使使用编译语言,您的代码也可能在重构期间中断。仅仅依靠这一点会让你陷入困境。自动化测试是确保程序正常运行的最佳方式。
如果您说您使用的是哪种动态语言,我们可能会提供一些有关可以帮助您进行测试的工具的建议。一切都可以测试。
编辑:
你回应说你使用 PHP 和 Python。
如果这是一个 Web 应用程序,请使用selenium在浏览器中创建测试。一开始你只需要 Selenium IDE。将所有测试放在一个测试套件中,以便您可以轻松地执行所有测试。随着列表的增长,您可以开始研究 Selenium RC 和 Selenium Grid。
1) 对于 Python,将 PyUnit 用于 PHP phpunit。2) TDD 方法很好,但在编写代码后进行测试也是可以接受的。3) 还使用可用于您的 IDE 的重构工具,它们只执行安全重构。在 Python 中你有绳子(这是库,但有大多数 IDE 的插件)。4) 好书是:'Test-Driven Development by example' Best 'Expert Python Programming' Tarek Ziade(解释 TDD 和重构)
google tdd and database 找到一本关于开发数据库的 TDD 方法的好书。
添加您正在使用的模拟的信息。只有在涉及数据库或网络时才需要 AFAIK 模拟。但通常单元测试应该覆盖一小段代码(只有一个类),有时是两个类,所以不需要模型!