2009-11-09 100 views
11

有人可以澄清使用一个简单的用户故事全面切片什么黄瓜将用于和RSpec将用于什么?我有一天购买了RSpec的书,并且一直在经历它。作者有时似乎很模糊。TDD/BDD Rails黄瓜/ RSpec复制

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

当用户输入的电话号码无效 然后他们得到一个消息说“无效的电话号码”

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

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

如果对此没有确切的答案,我会开始认为黄瓜人员不想踩在RSpec人的脚趾上。

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

谢谢!

回答

12

黄瓜用于解释(作说明)应用程序,而不是单元测试或行为测试(这是RSpec的焦点)的一部分(故事)的

所以,IMHO黄瓜测试(故事)不要替代rspec测试。

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

通过你的描述好像你正在使用黄瓜两个测试的故事和行为

+0

我完全同意,这一直是我的经历。 – 2009-11-10 16:58:08

2

黄瓜可用于运行几乎任何代码,这就是为什么我认为你得到困惑。但是黄瓜没有提供其他类型的测试设施,如嘲笑和剔除方法,这使得单元测试更加具体。

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

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

5

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

问题是,你想用黄瓜测试什么? 因为你确实可以结束重复测试,而这不会真的有用,不是吗? :)

黄瓜有不同的哲学。

黄瓜,你可以这样做:

DMA(直接模式访问的意义,是的,你可以充分测试你的模型,就像您在rspec的做)

模拟browzer(接入整个MVC栈,不需要JavaScript)

自动浏览器(使用webrat和硒来访问你的看法,与JavaScript,速度较慢,真正browzer)

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

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

你的情况

因此,

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

我会用Webrat检查用户获得在视图中无效的电话号码消息。我会使用Rspec来测试我的控制器动作和模型。

13

查看屏幕录像BDDCasts.com可能很有用。他们引导您创建应用程序的故事和规格。它真的帮助了我。还拥有rspec书,但仍然困惑。你甚至可能只想在github上查看它们的源代码。

对我来说是这样的:

  • 黄瓜要考什么,用户将看到。 (全栈测试)

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

6

黄瓜看作测试你的整个应用程序,从外到内,其中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 

你跑黄瓜,它会告诉你你缺少的步骤,你复制这些并创建简单的步骤来检查对于这个东西,但不写任何代码呢。

当你与你的步骤定义做了你下拉到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。

这是如何使用这些工具都只是一个新手的想法,但它似乎很好地为我工作至今。我可能给了你一个可怕的例子,但我只是想把整个细节的重点放到我在使用这些工具时发现有用的特定细节上。