2016-04-30 119 views
1

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

在学习时,我用了一本名为"The RSpec Book: BDD with RSpec, Cucumber and Friends"的书。在此期间,RSpec用于粒状测试,Cucumber用于整体可用性测试。

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

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

我已经知道我将为我的模型和控制器编写规格测试。

我假设黄瓜进来的地方是全功能测试,它将使用控制器和模型来完成。

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

其中每一个都有一个模型spec +但是很多控制器规格。

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

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

在那里我会登录为一个人,找到一个职位,并喜欢它?

任何有经验的人都会分享使用这些工具测试Rails应用程序的方法吗?假设我必须实现上面的情况,您是否会开始充实特性测试,编写模型规范,然后编写控制器规范,然后编写代码?

+0

您是否在使用Capybara?设计? –

+0

是的,我正在使用设计和水豚。 – fbelanger

回答

2

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

称为BDD(见)一个好的方法作品外,由

  • 试驾的特征与验收测试(在Ruby世界中通常写成黄瓜功能或RSpec功能规范)
  • 测试驾驶详细信息和单元测试以在必要时表达详细的要求。

使用这种方法来测试Rails项目的特性,你首先要写一个验收测试然后实现它,这会产生路由,视图,控制器(s)和模型(s)所需的功能。由于您正在进行测试驾驶,您还没有编写任何未通过验收测试完全测试的代码,您也不需要任何控制器,型号等规格。然后,您可能会重新开始另一个验收测试,或者您可能需要使用较低级别的规格测试一些详细的需求。

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

在我的经验中,使用BDD编写的合理的Rails应用程序需要很少或没有控制器规格,因为控制器应该尽可能地委托给模型和其他类,因此完全通过了验收测试。很多细节都在模型规格中得到了最好的测试。

关于如何编写验收测试,我需要不同意他人关于Cucumber的声明,或者至少给出警告:我已经看到Cucumber为大型生产应用程序提供可读,可维护的验收测试套件,并且RSpec的功能规格导致机构臃肿,难以维护的验收测试套件,所以不排除黄瓜,或需要它解决:

  • 不要的想法,人类可读的验收测试是唯一被愚弄为您的产品所有者或客户;它们对于工程师来说绝对是有价值的,可以让您在适当的时候高度思考,而不是迷失在代码中。项目越大,你就会越关心。

  • 黄瓜很好地将这些步骤的实现(CSS选择器,ActiveRecord查询等)的测试步骤的验收级别描述分开,几乎可以自动将这些步骤重新使用。使用RSpec功能规格,完全取决于您。准备提出自己的系统,将详细信息提取到方法的名称中,以明确每个步骤的用户级别点。 (我不是指页面对象;它们的含义低于我的意思,并且在Cucumber和RSpec功能规格中都很有用。)

2

黄瓜在这里的作用是作为验收规范。他们从用户的角度测试整个应用程序的行为。它们覆盖从路由到控制器,模型和视图的整个堆栈。

在BDD中,您经常使用验收测试,而不仅仅是像在TDD上的蛋糕顶部的糖霜,而是作为发展之外的的驱动力。

外部开发您将创建一个失败的规范,在设置路由,控制器或任何基础之前详细说明用户故事。

将此与传统的TDD方法相比较,您可以先将其分解为最小单位以获得快速的红黄绿循环。然后你会开始将堆叠在一起,测试逐渐覆盖越来越多的堆栈。

但是,这并不意味着验收规格是唯一有用的规格形式 - 它们有相当大的开销,并且可能很难测试边缘案例。因此只使用Cucumber并不是一个非常有吸引力的解决方案。

+1

不可否认,我从来没有真正明白过要使用黄瓜 - 所有这些额外的抽象层仅仅是为了客户真正阅读测试的错误前提。我只是使用RSpec功能规格。 – max

1

首先,这是比别的更多的意见,但在这里。一般来说,在TDD中,我试图从外部开展工作(外部开发)。换句话说,编写功能规格,然后写入控制器规格(如果需要),然后编写规格。这里的基本原理是您的功能测试是您的应用程序面向用户的方面。专注于高层次的用户行为,有助于减少浪费时间和构建不需要的东西。此外,如果您从功能测试开始,则可以根据需要模拟/存根较低的应用程序级别(例如控制器中的模型交互),从而产生更快速的独立测试。

最后,再次,这是更多的意见 - 我认为这同时使用黄瓜和RSpec是矫枉过正。 RSpec正常工作,更好地处理单元测试,并且比黄瓜更容易维护。每次我使用两种方法创建项目时,我最终都会废弃Cucumber,并坚持使用RSpec。

具体来说,对于测试用户登录,我建议包括使用Devise登录助手,这使登录用户更快,更容易https://github.com/plataformatec/devise#test-helpers