RoR野生中的RSpec和黄瓜

时间:2016-04-30 15:32:28

标签: 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环境中测试的心态是什么。

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

我认为Cucumber的用武之地是完整的功能测试,它将使用控制器和模型来完成。

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

每个都有一个型号规格+许多控制器规格。

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

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

我会以某人的身份登录,找一个帖子并喜欢它?

有经验的人在Rails应用程序上使用这些工具分享测试方法的角度吗?

让我们说我必须实现上面的情况,你会先充实功能测试,编写模型规格,然后编写控制器规格然后编写代码吗?

3 个答案:

答案 0 :(得分:2)

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

在BDD中,您经常使用验收测试,不仅仅是像TDD一样在蛋糕上结霜,而是在开发中称为外部的驱动力。

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

将此与传统的TDD方法进行比较,首先将其分解为最小单位,以获得快速的红 - 黄 - 绿循环。然后你会开始将这个块叠放在彼此顶部,测试逐渐覆盖越来越多的堆栈。

然而,这并不意味着验收规范是唯一有用的规范形式 - 它们具有相当大的开销,并且可能难以测试边缘情况。因此,仅使用黄瓜不是一个非常有吸引力的解决方案。

答案 1 :(得分:2)

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

一种称为BDD的好方法(见)通过

进行外向作用
  • 使用验收测试来测试驱动功能(在Ruby世界中通常将其编写为黄瓜功能或RSpec功能规范)
  • 通过单元测试测试驾驶细节,以在必要时表达详细要求。

使用此方法来测试Rails项目的一个功能,您首先要编写一个验收测试,然后实现它,这将产生路径,视图,控制器(s)和功能所需的模型。由于您是测试驾驶,您还没有编写任何未经验收测试完全测试的代码,您还不需要任何控制器,型号等规格。然后,您可以重新开始另一个验收测试,或者您可能希望使用较低级别的规范来测试一些详细的需求。

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

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

关于如何编写验收测试,我需要不同意其他人关于Cucumber的陈述,或者至少发出警告:我已经看到Cucumber导致了一个可读的,可维护的大型生产应用程序验收测试套件,以及RSpec功能规范导致一个膨胀的,不可维护的验收测试套件,所以不要忽视Cucumber,或它解决的需求:

  • 不要被人类可读的验收测试只针对您的产品所有者或客户的想法所迷惑;它们对于工程师来说绝对有价值,允许您在适当的时候进行高级思考,而不是迷失在代码的噪音中。项目越大,你就越关心。

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

答案 2 :(得分:1)

首先,这是比其他任何事情更多的意见,但是这里有。通常,对于TDD,我尝试从外部工作(在开发之外)。换句话说,编写功能规格,然后编写控制器规格(如果需要),然后编写规格。这里的基本原理是您的功能测试是面向用户的应用程序方面。预先关注高级用户行为有助于减少浪费时间和构建您不需要的东西。此外,如果您从功能测试开始,您可以根据需要模拟/存储应用程序的较低级别,例如控制器中的模型交互,从而产生更快速隔离的测试。

最后,再一次,这更像是一种意见 - 我认为同时使用Cucumber和RSpec是一种过度杀伤力。 RSpec工作正常,可以更好地处理单元测试,并且比Cucumber更容易维护。每当我使用两者创建一个项目时,我最终会废弃Cucumber并坚持使用RSpec。

具体来说,为了测试用户登录,我建议同时使用Devise登录助手,这样可以更快,更轻松地登录用户{。{3}}。