为什么我应该只在测试环境而不是开发或生产环境中运行我的Rails应用程序的rspec规范?

9

我被告知不应该在除了测试环境以外的Rails环境下运行RSpec测试用例。

在生产环境或开发环境下运行测试用例可能会导致哪些潜在问题? 我通常在两个环境下运行测试用例。除非我要测试使用资源管道的内容,否则我通常在开发环境下运行测试用例。为此,我会切换到生产环境并花费15分钟预编译资产。使用测试环境是否比我当前的方法更有优势呢?

我搜索了答案,但没有找到解释为什么不应该使用开发环境或生产环境。

3个回答

8
在一个名为“test”的环境中运行测试套件(例如rspec)旨在隔离资源以确保安全,特别是确保数据库的完整性。测试通常会破坏或完全删除数据库中的数据。
对于所有资源都适用同样的原则。通过使用“test”环境,您可以切断和模拟资源,从而防止您的测试破坏任何内容。
使用不同的环境有很多原因,但基本上它是一种资源分离,在“test”环境的上下文中,它是为了确保应用程序的验证,同时又保证生产资源和正在运行的系统的安全。

我认为这里大多数人会使用数据“完整性”这个术语,而不是“安全性”。安全通常意味着外部方的[恶意]更改。 - New Alexandria
这是一个常见的问题,在SO上有一些关于RSpec在生产环境中使用的背景信息。此链接提供了更多相关内容。 - New Alexandria
1
然而,我认为OP的问题与在“生产环境”中运行测试无关 - 他们正在询问将测试作为RAILS_ENV = production运行与RAILS_ENV = test相比有何区别。 - New Alexandria
@NewAlexandria 是的,你说得对。我在谈论RAILS_ENV=production和RAILS_ENV=test之间的区别。 - Spencer

3
让我们明确一点,特别是对于可能阅读此帖子的新手:在本地运行RAILS_ENV=production与在“production环境”中运行测试不是同一回事。我知道你(OP)知道这一点,但在生产环境中运行测试的危险需要警告。

只在test环境下运行测试有几个原因,通常涉及处理数据库:

  • Rspec构建了一个自定义的数据库数据版本,并在其上运行,将一些更改持久化到磁盘中。
  • 许多测试会清除现有数据,以实现测试隔离和使事物幂等。这可能会影响您在测试中使用的数据。

其他原因与您已经推测的线路相同:

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

这些可能是太具体(针对您的应用程序)而无法建议最佳实践...但是,不用说,在rails_ENV=test时可能需要配置许多“测试模式”设置。


0

你应该明确你的优先事项。你为什么要运行规格?

  1. 为了确保你的环境 xyz 能够运行你的代码,或者
  2. 为了确保你的代码按照预期工作

我认为,大多数人运行规格是为了第二点,这真的应该在测试环境中进行,正如 NewAlexandrias 的回答所述。

当你想在部署后检查第一点时,对我来说运行规格似乎有些牵强。应该有更简单的方法。

当你部署时,如果你不确定第二点...那就是过早地部署,这是你不应该做的事情。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接