【问题标题】:Rails4 - testing confused..needs recommendationRails4 - 测试困惑..需要推荐
【发布时间】:2014-02-05 07:21:10
【问题描述】:

我对 Rails 的 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 原生测试框架可以工作吗?

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

【问题讨论】:

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


    【解决方案1】:

    单元测试

    默认情况下,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 测试中)。

    端到端测试

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

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

    验收测试

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

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

    持续集成

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

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

    打破它

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

    使用 minitest(内置测试)或 rspec

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

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

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

    将水豚用于

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

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

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

    更多资源

    【讨论】:

    • 感谢 Matt 的详细解释。它确实帮助我做出决定。
    【解决方案2】:

    您可以查看此资源: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/request-spec

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-19
      • 1970-01-01
      • 1970-01-01
      • 2012-03-19
      • 2014-12-17
      • 2017-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多