Rails4 - 测试confused..needs推荐

时间:2014-02-05 07:21:10

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

我对TDD的TDD相对较新。我已经开始研究一个项目,在那里我想确保我的代码完成预期的工作(在后端和前端)

我看到rails正式拥有自己的测试框架(模型级别,控制器级别和集成级别,如http://guides.rubyonrails.org/testing.html所述),如果是这样,那么这些是什么用途:rspec,cucumber,factorygirl,capybara等等)为什么要使用它们而不是rails自己的测试框架?

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

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

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

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

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

2 个答案:

答案 0 :(得分: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

这两种方法都可以在任何一种框架中以各种方式编写,但希望这有助于让您了解其差异的味道。 Here is some more discussion关于minitest和amp;之间的差异RSpec的。

工厂

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

端到端测试

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

这些类型的集成测试往往比单元测试慢得多,但对于验证应用程序中的关键路径非常有用。 Capybara现在更经常地维护,我建议进行这种测试。

验收测试

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

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

持续整合

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

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

分解

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

使用minitest(测试内置)或rspec

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

Rails调用模型测试单元测试和控制器测试功能测试,但它们实际上是两种类型的单元测试。

可以通过在控制器测试中生成的主体上使用断言来完成对视图的测试(example)。 Rspec breaks out view tests为他们自己的类型。

使用水豚

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

手动运行或(更好)使用

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

更多资源

答案 1 :(得分:0)

您可以查看此资源:https://www.relishapp.com/rspec/rspec-rails/docs 对我来说非常有用。

  • 模型测试:https://www.relishapp.com/rspec/rspec-rails/v/3-0/docs/model-specs
  • 控制器测试:relishapp.com/rspec/rspec-rails/v/3-0/docs/controller-specs
  • 查看测试:relishapp.com/rspec/rspec-rails/v/3-0/docs/view-specs
  • 场景 - 功能,要求:relishapp.com/rspec/rspec-rails/v/3-0/docs/feature-specs,relishapp.com/rspec/rspec-rails/v/3-0/docs/request -specs /请求规格