Rails4 - 测试混淆......需要推荐

JVK*_*JVK 5 ruby rspec ruby-on-rails cucumber factory-bot

我对 Rails 的 TDD 比较陌生。我已经开始从事一个项目,我想确保我的代码按预期执行(在后端和前端)

我看到 rails 官方确实有自己的测试框架(模型级别、控制器级别和集成级别,如http://guides.rubyonrails.org/testing.html 所述),如果是这样,那么这些有什么用:rspec,黄瓜、工厂女工、水豚等)以及为什么使用它们而不是 Rails 自己的测试框架?

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

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

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

那么按照我上面的步骤顺序,rails 原生测试框架是否有效?

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

Mat*_*ers 4

单元测试

默认情况下,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
Run Code Online (Sandbox Code Playgroud)

这两种框架都可以在任一框架中以不同的方式编写,但希望这有助于让您了解它们的差异。这里有一些关于 minitest 和 rspec 之间差异的更多讨论。

工厂

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

端到端测试

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

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

验收测试

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

如果这个项目只有你一个人参与,我可能会暂时跳过这个项目。

持续集成

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

我对特拉维斯有很多经验,但也听说过其他人的好话。如果你想运行自己的 CI 服务器,Jenkins是一个不错的选择。

分解它

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

使用 minitest (内置测试)或 rspec

  • 编写模型 - 测试它是否按预期工作?
  • 编写控制器 - 它是否按预期应用业务逻辑?
  • 前端:模板是否按预期渲染

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

测试您的视图可以通过使用控制器测试中生成的主体断言来完成(示例)。Rspec将视图测试分解为自己的类型。

使用水豚

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

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

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

更多资源