RSpec vs黄瓜(RSpec故事)


136

什么时候应该在Rails应用程序中使用规格,何时使用Cucumber(以前的rspec-stories)?我当然知道如何工作并积极使用规范。但是使用黄瓜仍然感觉很奇怪。我目前对此的看法是,在为客户端实现应用程序时使用Cucumber很方便,而且还不了解整个系统应该如何工作。

但是,如果我正在做自己的项目呢?在大多数情况下,我知道系统各部分之间的交互方式。我需要做的就是编写一堆单元测试。那我需要黄瓜的可能情况是什么?

并且,作为第二个相应的问题:如果我写黄瓜的故事,我是否必须写规范?难道不是对同一件事进行双重测试吗?


12
为什么 [关闭]问题,我遇到由比尔蜥蜴,并在问题被upvoted同时多次封闭,“没有建设性”!?!我想念什么?
Ashkan Kh。Nazary

4
我完全同意。我仍然很困惑在哪里发布诸如“做XXX的最佳做法”之类的问题。
院长

3
我同意,关于SO的问题一直都以有见地,有用的答案遇到好问题,但由于某种原因而被关闭。
罗素·席尔瓦

我在2017年发现了这个问题,因为它仍然很重要,仍然是一个很好的问题,而且答案很好。它也不会引起意见,因为所讨论的框架主要是由同一个人针对两个完全独立的问题设计的……但是您需要一些专业知识才能知道这一点。
Lunivore

Answers:


114

如果还没有,您可能想看看Dan North的出色文章,《故事里有什么?作为起点。

黄瓜的故事有两个主要用途。首先,由于故事形式非常具体,因此有助于使产品所有者明确表达其要构建的功能。这是故事的“对话令牌”,对于无论我们是否在代码中实现故事都非常有价值。其次,当流程运行良好,开始编写功能之前,我们已经有了完整的故事(比起日常现实,我们更追求的是理想状态),您会清楚地说明接受标准,并且确切地知道什么以及如何做有很多需要建立的。

在我们的Rails工作中,Cucumber故事不能替代rspec单元测试。两者齐头并进。在实践中,单元测试倾向于驱动模型和控制器的开发,而故事则倾向于驱动视图的开发(我们倾向于不为视图编写rspec),并从总体上为整个应用程序提供良好的测试。用户的观点。

如果您是独自工作,则交流方面可能对您而言并不那么有趣,但您可能会从Cucumber获得集成测试。如果您利用webrat的优势,那么对许多基本功能而言,编写Cucumber可以快速而轻松地进行。


6
您将两个单独的问题混为一谈;1)进行集成和验收测试是否好,并且2)黄瓜是编写这些测试的好工具。对于1-是的,这显然是个好主意。对于2,当您可以在rspec和capybara中编写非常清晰的集成和接受测试时,对于开发团队来说,使用如此多的间接语言编写测试几乎没有效率更高(或者-天哪,我们可能会研究Ruby的标准库-test / unit或minitest,以及水豚)。请参阅下面的Jack Kinsella链接到的帖子。
格雷厄姆·阿什顿

完全同意您的观点!黄瓜整合至关重要!
dpapadopoulos


21

我认为在大多数情况下使用Cucumber是一个坏主意,因为其语法会给您带来生产力上的成本。我在“ 为什么要打黄瓜测试?”这一主题上写过很多文章


1
我已经阅读了您的文章,作为黄瓜迷,我必须说我同意您在文章中引用的许多观点。虽然,我仍然认为黄瓜是正规化测试并使外部人员易于阅读的好方法。
2011年

1
杰克-精彩的帖子。非常感谢您编写它,您自己为我省去了麻烦。
格雷厄姆·阿什顿

3
hu-这可能是向“外部人员”公开测试的好方法,但是您向我展示了一个非技术团队成员,希望阅读测试,并且我将向您展示一个正在浪费预算的团队。另外,我尚未与项目的非技术人员合作,他们希望浪费时间阅读测试。我不知道,也许我很幸运...
格雷厄姆·阿什顿

不赞成投票。我发现以开发人员的身份用用户术语描述用户功能对我很有用,无论用户是否阅读过我的Cucumber故事。这就是为什么我在所有项目中都使用Cucumber并鼓励其他人也这样做的原因。
Marnen Laibow-Koser,

8

黄瓜的故事更多地是描述您的应用程序正在解决的整体问题,而不是代码的各个部分是否起作用(即单元测试)。

正如Abie所描述的,它几乎是应用程序应满足的一系列要求,对于与您的客户进行交流以及可直接测试非常有帮助。


2
究竟。黄瓜描述了您的应用程序的用法。例如,“我单击此处,我​​希望得到此结果”。规格更多地处于“模型”级别。就像,当我使用某某参数调用该方法时,我希望它返回此结果。
09年

6

如今,您可以将rspec与Capybara和Selenium Webdriver结合使用,而不必构建和维护所有Cucumber故事解析器。这是我的建议:

  1. 写出你的故事
  2. 使用RSpec,我将创建一个集成测试,例如:spec / integrations / socks_rspec.rb
  3. 然后,我将创建一个集成测试,其中包括一个新的描述,它针对每种情况进行阻止
  4. 然后,我将实现获得集成测试所需的最小功能,并且在更深入地研究(进入控制器和模型等)时,我将在控制器和模型上进行TDD。
  5. 备份后,您的集成测试应该会通过,您可以继续向集成测试添加步骤
  6. 重复

但是,需要注意的一件事是,控制器和集成测试可能没有必要重叠,因此您必须根据自己的最佳判断来避免浪费时间。

同样,一旦找到凹槽,您就会发现使用BDD进行开发是最有趣的,直到您不觉得自己做得很完美并且不要过度思考时,才不会感到内gui。你会做的很棒!


2

但是,如果我正在做自己的项目呢?在大多数情况下,我知道系统各部分之间的交互方式。我需要做的就是编写一堆单元测试。那我需要黄瓜的可能情况是什么?

您仍然需要黄瓜。您需要用它来记录您如何看待系统的工作,还需要用它来确保您在进行更改时没有破坏功能。

换句话说,出于与单元测试相同的原因,您需要Cucumber故事-它们只是在更高的抽象水平上起作用。


2
我不会说Cucumber是必不可少的,但是您当然应该进行某种集成测试,因为单元测试通常仅用于隔离测试类。
安迪·怀特

1
对。在大多数情况下,Cucumber是编写集成测试的最好方法。
Marnen Laibow-Koser 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.