TDD/BDD Rails Cucumber/RSpec重复

Phi*_*hil 12 tdd bdd rspec ruby-on-rails cucumber

有人可以使用SIMPLE用户故事澄清Cucumber将用于什么以及RSpec将用于什么的全部内容?我前几天购买了RSpec书,并且已经完成了它.作者似乎有时候很模糊.

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

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

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

我觉得你会一直在复制两个级别的测试.

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

请帮忙.我觉得我的脑袋即将爆炸.

谢谢!

cor*_*ell 13

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

对我来说,它是这样的:

  • 黄瓜测试用户会看到什么.(全栈测试)

  • Rspec测试其他一切.(型号,控制器)


Die*_*ias 12

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

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

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

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


小智 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
Run Code Online (Sandbox Code Playgroud)

你运行Cucumber,它会告诉你你缺少的步骤,你复制它们并创建简单的步骤来检查这些东西但是还没有编写任何代码.

当您完成步骤定义后,您将进入RSpec并开始编写有关如何使用它的规范.(黄瓜当然应该失败)

describe "SearchController" do

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

end
Run Code Online (Sandbox Code Playgroud)

您运行RSpec并观察它失败然后关闭并编写您的代码:

class SearchController

  def search
  end

end
Run Code Online (Sandbox Code Playgroud)

而已.现在再次运行测试.它应该通过,所以开始变得更具体,并开始描述你将如何实际使用搜索功能.我不想深入了解它我只想给你一个想法,你在Cucumber中描述你想要的东西然后描述它应该如何在RSpec实际工作.

当然你可以用黄瓜或RSpec中的所有东西做任何事情但我真的发现Cucumber帮我用非常简单的方式说出我想要的地方如果我试着在RSpec中做到这一点我陷入了细节之中.如果我首先使用Cucumber描述我想要的基本功能,为什么然后我可以进入RSpec并说出我希望该功能如何实际工作.

有时你的测试会有重复,这不是很干,但如果你认为它是一个细节问题,它可能不会打扰你.我一开始就做了很多重复工作,直到我意识到我应该在黄瓜中一般说出我想要的东西,然后在RSpec中具体说出我想要的东西.

这只是一个新手如何使用这些工具的想法,但它似乎对我来说效果很好.我可能给了你一个可怕的例子,但我只是试图将一般细节的重点放在我发现使用工具时有用的具体细节上.


Aur*_*ini 5

Rspec和Cucumber是独立的,你可以使用Cucumber和另一个测试框架进行测试(Test Unit,shoulda等).

关键是,你想用黄瓜测试什么?因为确实你可以结束复制测试,那不是真的有用不是吗?:)

黄瓜有不同的哲学.

使用黄瓜,您可以:

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

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

自动浏览器(使用webrat和selenium访问您的视图,使用javascript,更慢,更真实的浏览器)

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

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

因此在你的情况下,

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

我会使用Webrat来检查用户是否在视图中收到了无效的电话号码消息.我会使用Rspec来测试我的控制器动作和模型.