RSpec和RoR野生黄瓜



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

在学习期间,我用了一本名为《RSpec书:与RSpec、Cucumber和Friends的BDD》的书。在此期间,RSpec用于粒度测试,Cucumber用于总体可用性测试。

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

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

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

我认为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应用程序上使用这些工具进行测试的方法角度吗?

假设我必须实现上面的情况,你会从充实功能测试开始,编写模型规范,然后编写控制器规范,然后写代码吗?

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

一种被称为BDD(参见BDD)的好方法在中起作用

  • 通过验收测试来测试驱动一个特性(在Ruby世界中,它通常被写为Cucumber特性或RSpec特性规范)
  • 如有必要,通过单元测试来测试驾驶细节,以表达详细要求

使用这种方法来测试驱动Rails项目的一个功能,您首先要编写一个验收测试,然后实现它,这将带来该功能所需的路由、视图、控制器和模型。由于您正在测试驾驶,您还没有编写任何未经过验收测试的代码,也不需要任何控制器、型号等规格。然后,您可能会从另一个验收测试开始,或者您可能想使用较低级别的规范来测试驱动一些详细的需求。

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

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

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

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

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

cucumber在这里的作用是作为验收规范。它们从用户的角度测试整个应用程序的行为。它们涵盖了从管线到控制器、模型和视图的整个堆栈。

在BDD中,您经常使用验收测试,而不仅仅是像在TDD中那样在蛋糕上结霜,而是在开发过程中作为所谓的的驱动力

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

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

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

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

最后,再一次,这更多的是一种观点——我认为同时使用Cucumber和RSpec太过分了。RSpec运行良好,能够更好地处理单元测试,并且比Cucumber更易于维护。每次我使用两者创建一个项目时,我最终都会放弃Cucumber,而只使用RSpec。

具体来说,为了测试用户登录,我建议同时使用Devise登录助手,这会使登录用户更快、更容易https://github.com/plataformatec/devise#test-助手。

最新更新