【问题标题】:How to Make sure the code is still working after refactoring ( Dynamic language)如何确保重构后代码仍然有效(动态语言)
【发布时间】:2010-10-15 21:09:42
【问题描述】:

如何确保代码在重构后(即变量名更改后)仍然有效?

在静态语言中,如果一个类被重命名但其他引用类没有,那么我会得到一个编译错误。

但是在动态语言中没有这样的安全网,如果你不够小心,你的代码可能会在重构过程中中断。您可以使用单元测试,但是当您使用模拟时,很难知道名称的变化,因此可能无济于事。

如何解决这个问题?

【问题讨论】:

    标签: php python dynamic-languages


    【解决方案1】:

    在开始重构之前,您应该创建能够测试您将要更改的内容的测试 - 如果您说单元测试不够,或者它们很难创建,那么一定要创建更高级别测试甚至可能对您的整个产品进行测试。

    如果您有适用于您的语言的代码覆盖率工具,请使用它们来衡量您创建的测试的质量 - 在达到相当高的价值并且如果测试保持最新并扩展您将能够非常有效地对您的代码执行任何操作,并确保事情没有朝着错误的方向发展。

    【讨论】:

      【解决方案2】:

      我一直在教授单元测试、重构等方面的课程,这可能是大多数人都犯错的地方。重构只是更改代码。它正在更改代码而不更改外部功能行为。这是非常重要的一点。

      换句话说,您需要有某种方法来验证重构后外部功能行为是否完好无损。由于缺乏神圣的洞察力,我发现单元测试对此非常有用。在他关于重构的书中,Martin Fowler 强调使用自动化测试进行验证。

      如果您的代码是使用 TDD 开发的,那么您将拥有必要的测试套件,因为它是在代码本身的开发过程中开发的。如果您需要重构没有可用测试的代码,最好的方法是在对代码进行任何更改之前设置自动化测试。我意识到为现有代码设置测试可能很困难,但在此过程中你会学到很多关于代码的知识。

      您可能还想查看Bruce Eckel's essay on strong typing versus strong testing,因为它讨论了您从编译器获得的反馈与您从测试套件获得的反馈。

      【讨论】:

        【解决方案3】:

        即使使用编译语言,您的代码也可能在重构期间中断。仅仅依靠这一点会让你陷入困境。自动化测试是确保程序正常运行的最佳方式。

        如果您说您使用的是哪种动态语言,我们可能会提供一些可以帮助您进行测试的工具的建议。一切都可以测试。

        编辑:

        你回复说你使用 PHP 和 Python。

        如果这是一个网络应用程序,请使用selenium 在浏览器中创建测试。一开始你只需要 Selenium IDE。将所有测试放在一个测试套件中,以便您可以轻松地执行所有测试。随着列表的增加,您可以开始研究 Selenium RC 和 Selenium Grid。

        【讨论】:

          【解决方案4】:

          1) 对于 Python,将 PyUnit 用于 PHP phpunit。 2) TDD 方法很好,但在编写代码后进行测试也是可以接受的。 3) 还使用可用于您的 IDE 的重构工具,它们只进行安全重构。 在 Python 中你有绳子(这是库,但有大多数 IDE 的插件)。 4)好书是: “示例测试驱动开发”最佳 “专家级 Python 编程”Tarek Ziade(解释 TDD 和重构)

          google tdd and database 可以找到一本关于开发数据库的 TDD 方法的好书。

          为您正在使用的模拟添加信息。只有在涉及数据库或网络时才需要 AFAIK 模拟。但通常单元测试应该覆盖一小段代码(只有一个类),有时是两个类,所以不需要模型!!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-03-05
            • 2011-02-19
            • 1970-01-01
            • 1970-01-01
            • 2021-06-17
            • 2017-06-24
            • 1970-01-01
            • 2015-08-06
            相关资源
            最近更新 更多