ruby-on-rails - RoR 野外的 RSpec 和 Cucumber

标签 ruby-on-rails testing rspec cucumber acceptance-testing

我正在学习 RSpec 和 Cucumber,这样我就可以在工作中为我们的 Rails 网站编写测试。

在学习的时候,用到了一本叫"The RSpec Book: BDD with RSpec, Cucumber and Friends"的书.在此期间,RSpec 用于粒度测试,Cucumber 用于整体可用性测试。

本书以一个简单的CLI游戏为例。

现在我正在进入web环境,想知道在web环境中测试的心态是什么。

我已经知道我将为我的模型和 Controller 编写规范测试。

我假设 Cucumber 的用武之地是全功能测试,它将使用 Controller 和模型来完成。

如果我错了请纠正我,但假设有 User、Post 和 Likes 模型。

其中每一个都会有一个模型规范 + 不管有多少 Controller 规范。

然后我会写一个单一的功能测试:

Feature: liking a post
  As a user of abc.com
  I want to like a post
  So that I can show my friends

我在哪里可以以某人的身份登录,找到帖子并点赞?

任何有经验的人都可以分享一下在 Rails 应用程序上使用这些工具进行测试的方法的角度吗?

假设我必须实现上述情况,您是否可以先充实功能测试,编写模型规范,然后编写 Controller 规范,然后编写代码?

最佳答案

[为了完整起见,重复一些别人说的话:]

一种称为 BDD(参见 )的好方法由外而内地工作

  • 通过验收测试来测试驱动功能(在 Ruby 世界中通常被编写为 Cucumber 功能或 RSpec 功能规范)
  • 在必要时通过单元测试测试驾驶细节以表达详细要求。

使用这种方法来测试 Rails 项目的功能,您首先要编写一个验收测试,然后实现它,这将产生路由、 View 、 Controller 和功能所需的模型。由于您是试驾,您还没有编写任何未通过验收测试完全测试的代码,您也不需要任何 Controller 、模型等规范。然后您可能会重新开始另一个验收测试,或者您可能想使用较低级别的规范来测试驱动一些详细的需求。

假设您的验收测试测试了用户的全名是否显示在页面上,并且您希望确保在用户未输入其姓氏时它看起来是正确的。如果 User#full_name 返回用户的全名,您可以只为该方法编写模型规范,而不是编写另一个验收测试。

根据我的经验,使用 BDD 编写的结构良好的 Rails 应用程序需要很少或不需要 Controller 规范,因为 Controller 应该尽可能多地委托(delegate)给模型和其他类,因此要通过验收测试进行全面测试。许多细节最好在模型规范中进行测试。

关于如何编写验收测试,我需要不同意其他人关于 Cucumber 的说法,或者至少给出一个警告:我已经看到 Cucumber 为大型生产应用程序生成了一个可读、可维护的验收测试套件,而 RSpec特性规范会导致一个臃肿的、不可维护的验收测试套件,所以不要忽视 Cucumber 或它解决的需求:

  • 不要被人类可读的验收测试仅适用于您的产品所有者或客户的想法所愚弄;它们对工程师来说绝对有值(value),可以让您在适当的时候进行高层次的思考,而不是迷失在代码的喧嚣中。项目越大,您就越关心。

  • Cucumber 很好地将测试中步骤的验收级别描述与这些步骤的实现(CSS 选择器、ActiveRecord 查询等)分开,几乎自动使这些步骤可重用。使用 RSpec 功能规范,一切由您决定;准备好提出自己的系统,将细节提取到方法中,这些方法的名称清楚地表明每个步骤的用户级点是什么。 (我指的不是页面对象;它们的详细程度低于我的意思,并且在 Cucumber 和 RSpec 功能规范中都很有用。)

关于ruby-on-rails - RoR 野外的 RSpec 和 Cucumber,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36956779/

相关文章:

javascript - Rails 根据集合选择的值呈现部分

ruby-on-rails - 无法删除 rake 0.9

android - Calabash-android执行iphone模拟器

ruby - RSpec:期望引发错误的方法失败

ruby-on-rails - 从 rails 2.1.1 迁移到 2.2.2

ruby-on-rails - Ruby Rubocop - 更喜欢使用 MatchData

设备上的 iPhone 测试

iis - 将开发环境限制为仅向特定域发送电子邮件以进行测试(XP smtp IIS)

ruby-on-rails - rspec Controller 测试,获取多个参数

ruby - 如何在 'context' 和 'it' block 内外调用相同的方法