12

有人可以使用一个简单的用户故事来阐明 Cucumber 将用于什么以及 RSpec 将用于什么的完整部分吗?前几天我购买了 RSpec 书,并且一直在阅读它。作者有时似乎很模糊。

如果用户故事是这样的,我在想什么(请原谅语法不正确,这只是为了让您明白这一点):

当用户输入无效的电话号码时,他们会收到一条消息,提示“无效的电话号码”

如果我写出 Cucumber 的所有代码来检查这一点,然后编写 rspec 的东西,我基本上是在复制我的测试。是否有一个场景可以解释黄瓜测试与 rspec 测试有何不同?

我觉得你会一直在两个级别上重复测试。

如果对此没有明确的答案,我将开始认为 Cucumber 人只是不想踩到 RSpec 人的脚趾。

请帮忙。我感觉我的头快要爆炸了。

谢谢!

4

6 回答 6

13

查看BDDCasts.com上的截屏视频可能会有所帮助。他们将引导您创建应用程序的故事和规范。它真的帮助了我。还拥有 rspec 书,但仍然感到困惑。您甚至可能只想在 github 上查看他们的源代码。

对我来说是这样的:

  • Cucumber 来测试用户会看到什么。(全栈测试)

  • Rspec 来测试其他一切。(模型,控制器)

于 2009-11-09T14:11:12.150 回答
12

Cucumber 用于解释(描述)应用程序的一部分(故事)而不是单元测试或行为测试(这是 RSpec 的重点)

因此,恕我直言黄瓜测试(故事)不能替代 RSpec 测试。

RSpec 测试倾向于推动模型和控制器的开发,而故事倾向于推动视图的开发。

根据您的描述,您似乎正在使用黄瓜来测试故事和行为。

于 2009-11-09T13:34:52.363 回答
6

将 Cucumber 视为从外向内测试整个应用程序,其中 RSpec 是特定模块的单元测试。您首先指定您希望应用程序在 Cucumber 中具有哪些行为,然后下拉到 RSpec 并描述使该行为起作用的类和模块。

我花了一段时间才弄明白,但我发现 Cucumber 非常适合从广义上描述您希望您的应用程序执行哪些功能,而 RSpec 非常擅长描述它应该如何实际执行。

所以你会在你的黄瓜故事中说你想要什么样的功能,并编写超级简单的步骤来提供输入和查看输出。然后你下拉到 RSpec 并写下它应该如何做的规范。

假设您的功能是能够在网站上搜索用户名。您可能会编写一个黄瓜功能和第一个(也是第一个)场景,如下所示:

Feature: Search users
  In order to find people with similar interests as myself
  As a user
  I want to search for people

Scenario: Search for similar hobbies
  Given there is a search page
    And there is a list of hobbies
    And one of the hobbies is "full contact ironing"
   When I select "full contact ironing"
    And press search
   Then a list of users with the hobby "full contact ironing" are shown

您运行 Cucumber,它会告诉您缺少的步骤,您复制这些步骤并创建简单的步骤来检查这些内容,但不要编写任何代码。

完成步骤定义后,您可以进入 RSpec 并开始编写有关您希望它如何工作的规范。(黄瓜当然应该失败)

describe "SearchController" do

  it "should respond to searches" do
    sc = SearchController.new
    sc.should respond_to(:search)
  end

end

您运行 RSpec 并观察它失败,然后开始编写代码:

class SearchController

  def search
  end

end

就是这样。现在再次运行您的测试。它应该通过,所以开始变得更具体,并开始描述您将如何实际使用搜索功能。我不想深入研究它,我只是想给你一个想法,即你在 Cucumber 中描述你想要什么,然后描述它应该如何在 RSpec 中实际工作。

当然,您可以在 Cucumber 或 RSpec 中做所有事情,但我真的发现 Cucumber 可以帮助我以非常简单的方式说出我想要的东西,如果我尝试在 RSpec 中这样做,我会陷入细节中。如果我首先使用 Cucumber 来描述我想要的基本功能以及原因,那么我可以进入 RSpec 并说明我希望该功能如何实际工作。

有时您的测试中会出现重复,这不是很干燥,但如果您将其视为一个详细程度的问题,它可能不会那么困扰您。一开始我做了很多重复的工作,直到我意识到我应该在 Cucumber 中概括地说我想要什么,然后在 RSpec 中具体说我想要什么。

这只是一个新手关于如何使用这些工具的想法,但到目前为止它似乎对我来说效果很好。我可能给你举了一个可怕的例子,但我只是想从一般细节到我发现在使用这些工具时有用的具体细节。

于 2010-12-03T06:23:16.173 回答
5

Rspec 和 Cucumber 是独立的,您可以使用 Cucumber 和另一个测试框架进行测试(测试单元、should 等)。

关键是,你想用黄瓜测试什么?因为确实您可以结束重复测试,但这并没有真正的用处,不是吗?:)

黄瓜有不同的哲学。

使用 Cucumber,您可以:

DMA(直接模型访问的意思,是的,您可以像在 rspec 中那样完全测试您的模型)

模拟浏览器(访问整个 MVC 堆栈,无 javascript)

自动化浏览器(使用 webrat 和 selenium 访问您的视图,使用 javascript,速度较慢,真正的浏览器)

我喜欢做的是使用 cucumber 检查返回给用户的内容。当我定义我的故事时,这通常对我有意义,因为我并没有真正想到我要编写的代码。所以我正在使用 Cucumber -> 视图测试最终结果(使用模拟或自动浏览器)

然后我使用 rspec 测试我在控制器和模型中编写的任何代码。

因此,在你的情况下,

当用户输入无效的电话号码时,他们会收到一条消息,提示“无效的电话号码”

我将使用 Webrat 检查用户是否在视图中收到Invalid Telephone Number消息。我会使用 Rspec 来测试我的控制器动作和模型。

于 2009-11-09T13:57:45.397 回答
2

Cucumber 可用于运行几乎任何代码,这就是我认为您感到困惑的原因。但是 cucumber 没有提供其他类型的测试工具,例如使单元测试更加具体的模拟和存根方法。

rspec 的东西实际上是为了解决一些小行为并使一切都非常离散。如果您熟悉单元测试及其框架,这应该更有意义。

Cucumber 实用程序能够将高级描述转换为系统上的一组顶级操作。

于 2009-11-09T13:51:08.687 回答
0

这篇文章可能会给你一些观点:什么时候在测试中重复自己 - 什么时候不

于 2010-05-14T21:56:58.793 回答