RSpec 测试(请求规范、功能规范和集成规范)

RSpec Testing (Request Specs, Feature Specs & Integration Specs)

我是 Rails 开发人员 Ruby,目前正在学习 RSpec。我已经完成了 http://guides.rubyonrails.org/testing.html 中涵盖的基本 Rails 测试,该测试使用 Rails 内置测试框架 ActiveSupport::TestCase。在那里我看到了集成测试。

然后当我开始学习 RSpec 并阅读 rspec-rails 关于 http://rspec.info/documentation/3.3/rspec-rails/ 的文档时,有关于请求规范的讨论,许多 Rails 开发人员更喜欢使用 Capybara和工厂女郎。但 Capybara 规格放在 spec/features 目录下。

所以我真的对请求规范、集成测试和功能规范感到困惑。他们做什么?它们等价吗? Request/integration/feature 规格测试了哪些类型的功能?

如果有人清除它会有所帮助,

谢谢。

首先,重要的是要了解 Rails 默认使用 minitest。 话虽这么说,你也有请求规格。

RSpec 和 minitest 只是两个测试框架:它们提供了一组实用程序(本机或通过插件)来帮助您编写测试,例如 available assertions 由 minitest 提供Rails 本身提供了一些补充。

到目前为止,根据我的理解,集成测试、功能规范和请求规范是一回事。他们确实有不同的names/directories,但他们实际上可以被认为是e2e测试,我认为更明确:端到端测试 表示你执行测试就像你是用户一样,所以你打开浏览器,单击一堆按钮,填写一些字段,按确定,查看结果。

也就是说,Capybara 被认为更适合集成测试,因为它 运行 在真实的浏览器实现上(Selenium 基于 Firefox),因此它可以像现代浏览器一样正确处理 html/javascript/css,虽然我相信默认的 Rails 实现有点落后(我不确定最后一句话,我已经有一段时间没有使用它了)。

FactoryGirl 是一个完全独立于您提到的所有内容的库,它只是一个使用虚拟数据快速实例化对象的工具,有助于任何类型的测试,甚至是单元测试。

RSpec 是一个不同的框架,我使用它是因为当我开始时,minitest 不是一个东西(虽然我最近正在重新考虑它),我非常喜欢 rspec-mocks,所以现在我会坚持下去。不过,这是个人选择,主要基于语法。

总结

到目前为止,我自己想出了一些测试规则:使用水豚作为 integration/feature/request 规格(是的,它们都是一样的),所以你使用正确的浏览器解析是安全的。 使用默认 Rails 请求规范 (在 Rspec 中意味着您将测试标记为 type: :request 并将其放在 requests 目录中) 如果您使用 Rails 作为 JSON API(因此,没有真正的浏览器交互),在这种情况下它比水豚快得多并且已经达到任何要求。 其他一切都是单元测试,这是你主要使用的(e2e 测试可能写起来很长而且慢到 运行),它将允许你在没有 F5 驱动开发的情况下编程(实际上,我不当我为 Rails 应用程序开发某些东西时检查浏览器,除了当我完成代码时),你应该测试你编写的每个 class 的每个 public 方法,以及所有可能的路径.如果你让每个方法都长 ~5 行,那么它既简单又快速,你的代码会改进很多,更不用说你的测试了。

Capybara is no longer supported in request specs as of Capybara 2.0.0. The recommended way to use Capybara is with feature specs.

以上内容来自 3.3 的 RSpec 文档:

https://relishapp.com/rspec/rspec-rails/v/3-3/docs/request-specs/request-spec (3.3)

https://relishapp.com/rspec/rspec-rails/docs/request-specs/request-spec(最新版本)

目前: 在您的功能规范中使用 Capybara。

我认为您的问题是由于阅读较早的文章而产生的困惑。事情变了。阅读此处了解更多详情:http://blog.plataformatec.com.br/2012/06/improving-the-integration-between-capybara-and-rspec/