新手问题 某个类里面如果写错代码,开发环境不报错,但是部署到生产环境就无法启动了,如何在开发环境上提前暴露呢?

Insub · 2020年05月06日 · 最后由 zhengpd 回复于 2020年05月12日 · 3619 次阅读

比如有一个业务类 plan.rb,如果里面写错了代码,比如:

class Plan < ApplicationRecord
    has_many :events, xxxxxx: :some
end

这种情况下,开发环境中是可以正常启动 puma 的,如果不访问到 plan 的控制器,页面上也不会报错。 但是如果这时候部署到生产环境中,那么 puma / passgener 都会检查到这个类里某一行有代码错误,而导致 puma / passgener 无法启动。 但是从部署过程看,nginx 已经正常启动了,没有报错。如果不检查 passgener 的日志,根本就发现不了这个问题。

请问有什么好的解决办法?怎么能让开发环境也暴露出这个错误呢?

建立一个跟生产环境一样的测试环境。

把 development.rb 中的config.eager_load设置成true

config.eager_load = true

测试覆盖不足。

3 楼正解,2 楼也是解决方案

rails s -e production

楼主说的问题靠测试覆盖能很容易解决。

不过鉴于这个,顺带说说 Rails 某些问题只会在 production 环境发生,哪怕你测试覆盖够了。

某些特定复杂场景,在 test、development 环境是没法重现的,我们可以用 config.eager_load = true 模拟 production 的加载机制来启动,才能还原 production 的场景。

最稳妥的方法还是配置一个跟 production 同样运行环境的 staging,所有跟数据无关的参数都一样(比如 eager_load)。这样只要在 staging 测试过既无代码错误也无业务错误,那在 prod 就 95% 没问题了,剩下 5% 常常是特殊数据或者网络导致的问题。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号