【问题标题】:Why should I run rspec specs on my rails app only in a test environment, not dev or prod?为什么我应该只在测试环境而不是开发或生产环境中在我的 Rails 应用程序上运行 rspec 规范?
【发布时间】:2012-09-17 14:23:56
【问题描述】:

有人告诉我,除了测试之外,我不应该在 rails_env 中运行我的 rspec 规范。

在生产或开发中运行规范有哪些潜在问题?我在两者中都运行规范。我通常在 dev 中运行规范,除非我正在测试使用资产管道的东西。我为此切换到生产环境,并花费 15 分钟预编译资产。与我目前的方法相比,使用测试环境有什么优势吗?

我搜索了答案,但没有解释为什么我不应该使用 dev 或 prod。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 testing rspec


    【解决方案1】:

    test 环境中运行测试套件(例如rspec)旨在隔离资源以解决安全问题,尤其是数据库的完整性。测试通常会损坏或完全删除数据库中的数据。

    所有资源也是如此。通过使用test 环境,您可以切断和模拟资源,从而防止您的测试破坏任何东西。

    使用分离环境的原因有很多,但从根本上说,它是一种资源分离,在test 环境的上下文中,它是为了在确保生产资源和运行系统的安全的同时启用应用程序的验证.

    【讨论】:

    • 我认为大多数人会在这里使用术语数据“完整性”而不是“安全性”。安全性通常意味着外部方的 [恶意] 更改。
    • 但是,我不认为 OP 的问题与在“生产环境”中运行测试有关 - 他们询问以 RAILS_ENV=productionRAILS_ENV=test 相比运行测试。
    • @NewAlexandria 没错。我说的是 RAILS_ENV=production 与 RAILS_ENV=test
    【解决方案2】:

    让我们明确一点,尤其是对于可能正在阅读这篇文章的 nubes:RAILS_ENV=production(本地)在“production 环境中”运行测试不同。我知道你(OP)知道这一点,但是在生产环境中运行测试的危险需要这个警告。

    只在test 环境中运行有几个原因,一般与DB的处理有关:

    • Rspec 在数据库中构建数据的自定义“版本”,并对其进行操作,将一些更改保存回磁盘。
    • 许多测试会清除现有数据,直至测试隔离结束并使事物具有幂等性。这可能会将您用于测试中的建筑物的数据混为一谈。

    其他原因与您已经推测的类似:

    1. 您的 prod 环境不应包含用于测试的 gem。为什么?:
      • 测试 gem 添加了更多代码,这些代码可能需要在实时应用中不必要地加载和运行
      • 与测试相关的 gem 可能会在您的生产应用中引入安全漏洞。
    2. 某些资产在“编译”后可能无法正确测试。
    3. 资产和其他部署管道预编译可以不同地处理/关闭/等,以服务于测试过程。
    4. 某些 API 和服务可能在测试/暂存中被沙盒化或存根,例如对按使用付费服务(如电子邮件或报告)的 API 调用。

    这些可能性过于定制(对您的应用而言),无法建议最佳实践……但不用说,rails_ENV=test 时可能需要配置许多“测试模式”设置

    【讨论】:

      【解决方案3】:

      您应该明确自己的优先事项。为什么要运行规范?

      1. 可以肯定的是,您的环境 xyz 完全运行您的代码或
      2. 可以肯定的是,您的代码可以正常工作

      我会说,大多数人都运行 2. 的规范,这确实应该在测试环境中进行,只是出于 NewAlexandrias 回答中给出的原因。

      当您想检查 1. 部署后,运行规范对我来说似乎有点牵强。应该有更简单的方法。

      当您部署时,您不确定 2. ... 那是过早的部署,您不应该这样做。

      【讨论】:

        猜你喜欢
        • 2013-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-24
        • 1970-01-01
        • 1970-01-01
        • 2014-07-25
        相关资源
        最近更新 更多