【问题标题】:Working on a legacy Rails application处理遗留的 Rails 应用程序
【发布时间】:2012-01-26 10:47:47
【问题描述】:

我有一个非常陈旧且编写不佳的 Rails 应用程序。大约有 9000 行代码和零测试。大部分代码都在控制器中,更糟糕的是,还有大量的外部 API 调用、对随机脚本的系统调用等。

也没有开发环境,一切都设置为针对生产数据库。嗯,不仅仅是一个数据库,大约有 10 个不同的数据库,因为该应用程序是一种大型网站的管理后端。

我的第一个想法是至少在我将要处理的部分上获得一些不错的测试覆盖率,但是除了在生产服务器上之外,我无法让该东西在其他任何地方工作。

还有大量旧宝石和已弃用的警告,但在进行测试之前,我什至无法考虑升级宝石。完全重写不是一种选择,我将不得不尽快添加/更改内容。

我不太确定如何测试这样的应用程序,因为有太多东西可能会出错。我真正想做的是编写一些集成测试然后开始重构,但我不能在生产环境中这样做。

使用一堆 stub 和 mock 编写单元测试似乎没有多大帮助,因为我要处理的代码基本上必须从头开始重写。

我可以采取哪些步骤来在我的开发机器上复制一个巨大的复杂生产环境,这样我就可以单独做一些事情了?

编辑:关于该应用的一些有趣的事实。当我第一次尝试运行它时,它一直冻结而没有任何错误消息......直到大约半小时后我发现,连接到数据库的超时(不可用)设置为90 分钟

【问题讨论】:

  • 找一个创造这个的人,把他的家人当作人质,让他帮助你(或者至少解释一下这个东西是如何工作的)。
  • 您可以拍摄生产机器的快照并在实验室将其拆开。

标签: ruby-on-rails ruby testing refactoring legacy


【解决方案1】:

所以这是一个相对较新/罕见的情况,因为 Rails“LEGACY”应用程序还不太流行(还很年轻)。

但是,我遇到了一些关于如何测试(未经测试)遗留 Rails 应用程序的不同著作。我推荐的几个是:

  1. This slideshare
  2. Pragmatic Programmers 的“Rails Test Presciptions”第 18 章。

最终也是最重要的事情是让某种测试工具发挥作用。这意味着让工厂正常工作,让你的测试数据库正常工作,让 rake 运行(即使这意味着去除损坏的测试)。从那时起,您可以根据需要返回并测试模块,并确保您正在测试您添加到项目中的所有新代码。

这是一项非常痛苦的任务,我为你寻求正确的方式而鼓掌。

干杯!

【讨论】:

  • 哈哈,我这样做不是因为纪律,而是因为我太害怕了,甚至不敢碰没有一些绿点的该死的东西。我想 TDD 太宠我了。
  • 你是对的,确实如此。但是,TDD 还为您提供了从可测试的思维方式处理此问题的智能。坚持下去 - 但最重要的是,让某种可用的安全带运行起来,这样你就可以随着时间的推移开始添加它。
【解决方案2】:

我参与了几个救援任务,大部分是非常糟糕的 PHP 项目,但不仅如此——糟糕的 80% 程序员留下的绝望产品所有者为完成他们放弃的项目付出了高昂的代价:)。

  • 我的方法是使用蛮力。
  • 在开发中启动它并修复一些东西,直到你让它运行,通过绝对的力量 - 修复,尝试,修复,尝试。
  • 最终让它发挥作用。
  • 9000 行代码并不是 太多 代码,我会说它对于糟糕的遗留代码来说是合理的大小,它可能会更糟。
  • 一点一点开始慢慢重构。
  • 这些任务需要时间,所以不要指望它会立即完成。

【讨论】:

    【解决方案3】:

    欢迎乘坐这种可怕的船。

    上次发生在我身上时,我用 Capybara 编写了许多测试,并且:

    • 我检查了预期在 db 中创建或不创建的内容...

    • ...然后一点一点,我在重构

    在这种情况下,除了在最高级别接近应用程序并在最低级别检查结果外,我没有看到任何其他方法,没有任何存根/模拟。

    【讨论】:

      【解决方案4】:

      什么版本

      Rails,
      Ruby,
      Mysql socket,
      

      在用吗?

      我必须开发这样的应用程序。这是我必须做的:

      Copy DB over, 
      do not run the migrations, 
      installed gems as production environment, 
      do not update gems. 
      

      我的应用使用了一个非常具体的 gem 版本 (gettext v=1.10)

      【讨论】:

      • Rails 2.3.something。哦,是的,这是另一个问题,我没有直接访问生产服务器的权限,所以我不知道安装了哪些版本的 gems ......而且它们甚至没有在配置/环境中指定。 rb,所以到目前为止我基本上做的是运行应用程序,等待它在丢失的 gem 上崩溃,然后安装一些与依赖项匹配的随机版本并祈祷它可以工作......
      • 我也忘了提一下,并不是所有的数据库都是 MySQL,其中一些是 MS SQL Server ...耶
      • 比我的情况更糟。我只有 2 个 mysql 数据库。他们使用什么网络服务器??
      猜你喜欢
      • 2011-08-02
      • 2012-07-20
      • 1970-01-01
      • 2011-03-08
      • 1970-01-01
      • 2020-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多