ruby-on-rails - Rails4 - 测试困惑..需要推荐

标签 ruby-on-rails ruby rspec cucumber factory-bot

我在 Rails 的 TDD 方面相对较新。我已经开始从事一个项目,我想确保我的代码执行预期的操作(在后端和前端)

我看到 rails 官方确实有自己的测试框架(模型级别、 Controller 级别和集成级别,如 http://guides.rubyonrails.org/testing.html 中所述),如果是这样,那么这些有什么用:rspec、cucumber、factorygirl、capybara 等.) 为什么要使用它们而不是 Rails 自己的测试框架?

我问这个问题的目的是找出如果我使用 Rails 自己的测试方法会遗漏什么?在这种情况下,我应该从上面的列表中选择什么来对我的代码进行全面测试?

我的最终目标是(按顺序):

1) 编写模型 - 测试它是否按预期工作?
2) 编写 Controller ——它是否按预期应用业务逻辑?
3) 前端:模板是否按预期呈现
4)作为用户场景:我的网页是否按用户操作(登录或未登录场景)的预期工作。 (例如,如果我点击排序链接,数据就会排序(使用 ajax)。当用户将鼠标悬停在 div 上时,它会将颜色更改为黑色等)
5) 现在我想在 heroku/aws/engineyard 等上部署我的代码,所以我想在部署代码之前运行完整的测试(冒烟测试、集成测试?)。

那么按照我上面的步骤顺序,rails native 测试框架可以工作吗?

我是这个项目唯一的开发者和产品经理/设计师,所以这些都是我的,不给任何第三方。

最佳答案

单元测试

默认情况下,Rails 在其内置测试中使用 test/unit(现在是 minitest)。这是 ruby​​ 标准库的一部分,具有轻量级的优点,不需要进一步的依赖。

Rspec 是测试/单元的替代品,功能非常齐全,并使用不同的语言来尝试帮助插入 BDD/TDD 过程。比较示例:

# minitest
def test_new_users_should_be_active
  user = User.new
  assert_equal true, user.active?
end

# rspec
describe User do
  it 'should be active' do
    User.new.active?.should be true
  end
end

这两者都可以在任一框架中以不同的方式编写,但希望这有助于让您了解它们之间的差异。 Here is some more discussion关于 minitest 和 rspec 的区别。

工厂

Factory_girl是一个库,可以与 rspec 或 minitest 一起使用来创建工厂对象,以简化具有更复杂设置的测试。 Here is some discussion关于为什么您可能想要使用工厂库而不是固定装置(默认情况下内置在 Rails 测试中)。

端到端测试

Capybara & webrat是堆叠在 minitest 或 rspec 之上的两个库,允许您进行集成测试。因此,这些允许您针对通过浏览器运行的完整应用程序运行测试,这样您就可以执行诸如填写表格、单击链接等操作,并验证端到端您所期望的是否实际发生。

这些类型的集成测试往往比单元测试慢得多,但对于验证应用程序中的关键路径非常有帮助。 Capybara 现在得到了更定期的维护,这是我建议进行此类测试的方法。

验收测试

Cucumber位于任何这些工具之上,让您可以用简单的英语编写测试,然后通过 DSL 将其翻译成可重复的步骤来运行您的实际测试。当您的客户或项目经理不会编码,或者您希望能够轻松地用英语交流需求时,这尤其有用。

如果这个项目只有你一个人,我现在可能会跳过这个。

持续集成

您可以随时手动运行测试,也可以使用持续集成服务自动为您运行测试。有几个不错的:

我在 Travis 方面有很多经验,但也听说过其他人的好消息。如果您想运行自己的 CI 服务器,Jenkins是一个不错的选择。

分解

让我们将这些应用到您要编写的测试类型的具体示例中:

使用 minitest(内置测试)或 rspec

  • 编写模型 - 测试它是否按预期工作?
  • 编写 Controller - 它是否按预期应用业务逻辑?
  • 前端:模板是否按预期呈现

Rails 将模型测试称为单元测试,将 Controller 测试称为功能测试,但它们实际上都是单元测试。

可以通过在 Controller 测试 (example) 中生成的 body 上使用断言来测试您的 View 。 Rspec breaks out view tests进入他们自己的类型。

使用 capybara

  • 作为用户场景:我的网页是否按用户操作(登录或未登录场景)的预期工作。 (例如,如果我点击排序链接,数据就会排序(使用 ajax)。当用户将鼠标悬停在 div 上时,它会将颜色更改为黑色等。)

手动运行或(更好)使用持续集成服务

  • 现在我想在 heroku/aws/engineyard 等上部署我的代码,所以我想在部署代码之前运行完整的测试(冒烟测试、集成测试?)。

更多资源

关于ruby-on-rails - Rails4 - 测试困惑..需要推荐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21570986/

相关文章:

ruby-on-rails - 无法加载此类文件 — sqlite3/sqlite3_native (LoadError) Ruby on Rails

ruby-on-rails - 我如何将 `git diff` 更改为 rails 5.2 凭据?

ruby - ruby sqlite3插入与自动增量

Mysql::错误:指定的键太长;最大 key 长度为 767 字节:创建索引

ruby - 如何使用 rspec 测试 ruby​​ 继承

ruby-on-rails - Rails、STI 和 'becomes' - f.object.errors 未显示在 View 中

ruby-on-rails - 循环遍历拥有 rails 用户的 Teams

ruby - 在 gem 中打包预编译的二进制文件

mysql - 如何从rails中的数据库加载和制作应用程序脚手架

ruby-on-rails - Rails, stripe feature test error - 参数缺失或值为空 : charge