我有一个非常古老且写得不好的Rails应用程序。大约有9000行代码和零测试。大多数代码都在控制器中,更糟糕的是,有大量的外部API调用,对随机脚本的系统调用等。
也没有开发环境,所有内容都设置为对生产数据库起作用。不仅仅是一个数据库,还有大约10个不同的数据库,因为该应用程序是一个更大的站点的管理后端。
我的第一个想法是至少对我将要处理的部分进行一些不错的测试覆盖,但是我无法在生产服务器上的任何地方工作。
此外还有大量旧宝石和不赞成警告,但在测试之前我甚至无法考虑升级宝石。重写整个不是一个选项,我将不得不尽快添加/更改内容。
我不太确定如何测试这样的应用程序,因为有太多东西可能出错。我真正想做的是编写一些集成测试,然后开始重构,但我不能在生产环境中这样做。
使用一堆存根和模拟编写单元测试似乎没有用,因为我要处理的代码基本上必须从头开始重写。
我可以采取哪些步骤来基本复制我的开发机器上的巨大复杂生产环境,所以我可以孤立地做一些事情?
编辑关于该应用的一个有趣的事实。当我第一次尝试运行它时,它一直没有任何错误消息冻结...直到大约半小时后我发现,连接到数据库(不可用)的超时设置为 90分钟!
答案 0 :(得分:9)
所以这是一个相对较新/罕见的事件,因为rails“LEGACY”应用程序还不太受欢迎(还很年轻)。
但是,我遇到了一些关于如何测试(未经测试的)传统rails应用程序的不同着作。我推荐的一些是:
最终也是最重要的是让某些测试工具正常工作。这意味着让工厂工作,让测试数据库正常工作,让rake运行(即使这意味着剥离破坏的测试)。从那时起,您可以根据需要返回并测试模块,以及确保您正在测试添加到项目中的所有新代码。
这是一项非常痛苦的任务,我赞赏你以正确的方式去做。
干杯!
答案 1 :(得分:3)
我参与了几个救援任务,主要是非常糟糕的PHP项目,但不仅仅是 - 80%的坏程序员让绝望的产品所有者为完成他们的废弃项目付出了代价:)。
答案 2 :(得分:2)
欢迎来到这种可怕的船。
上次发生在我身上的时候,我和Capybara一起写了很多测试,并且:
我在db ...
......然后一点一滴,我正在重构
在这种情况下,我没有看到任何其他方法,而不是在最高级别接近应用程序,并检查最低的结果,没有任何存根/模拟。
答案 3 :(得分:0)
的版本
Rails,
Ruby,
Mysql socket,
是否正在使用?
我不得不在这样的应用上工作。以下是我必须做的事情:
Copy DB over,
do not run the migrations,
installed gems as production environment,
do not update gems.
我的应用使用了非常具体的宝石版本(gettext v = 1.10)