【问题标题】:TDD/BDD Rails Cucumber / RSpec duplicationTDD/BDD Rails Cucumber / RSpec 复制
【发布时间】:2009-11-09 13:22:58
【问题描述】:

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

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

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

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

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

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

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

谢谢!

【问题讨论】:

    标签: ruby-on-rails tdd rspec cucumber bdd


    【解决方案1】:

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

    对我来说是这样的:

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

    • Rspec 来测试其他所有内容。 (模型、控制器)

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 我完全同意,这也是我的经验。
      【解决方案3】:

      将 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 中具体说出我想要什么。

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

      【讨论】:

        【解决方案4】:

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

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

        Cucumber 有不同的理念。

        使用 Cucumber,您可以:

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

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

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

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

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

        因此在你的情况下,

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

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

        【讨论】:

          【解决方案5】:

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

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

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

          【讨论】:

            【解决方案6】:

            这篇文章可能会给你一些看法:When to repeat yourself in tests - and when not to

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-06-26
              • 1970-01-01
              • 2011-06-10
              • 2011-05-22
              • 2012-07-31
              • 1970-01-01
              相关资源
              最近更新 更多