野生黄瓜的好例子?

时间:2011-04-15 19:09:38

标签: ruby cucumber bdd

几年前我曾尝试过Cucumber的一些项目,我希望再给它一次。我真的不需要另一篇“Beginning Cucumber”文章。相反,我希望看到其他Cucumber用户考虑惯用和反模式的野外实际用途。

那么,在您看来,大型项目中实际黄瓜规格的最佳例子是什么?

8 个答案:

答案 0 :(得分:34)

您可以阅读diaspora's黄瓜测试。这是一个非常大的项目,所以我认为你可以从中学到一些东西。

答案 1 :(得分:15)

你可以阅读黄瓜本身的特征,这些人应该知道他们在做什么:

https://github.com/cucumber/cucumber-ruby/tree/master/features

答案 2 :(得分:9)

这不是一个直接的答案,但我不同意你的问题中的一个前提但有一个解决方案,所以无论如何我都会给出我的意见。

  

其他Cucumber用户会考虑惯用和反模式

我认为,这句话很难令人满意。

这里的CollectiveIdea的Brandon Keepers采取了you should strive towards generic, reusable steps的共同立场,这从一般的“不要重复自己”的角度来看是有意义的。

然而,这里是Cucumber的作者AslakHellesøy采取了一种普遍持有(但相互排斥)的意见,you should strive towards scenario-specific steps,从“为什么选择黄瓜?”的角度来看是有意义的。

从上面链接的“训练车轮起飞”中,Aslak制作了两个示例场景,对两种风格形成鲜明对比:reusable steps vs scenario-specific

经过多年使用Cucumber两种风格,并考虑到上述困境,这些都是我的结论:

  1. 可重复使用的步骤成为维护的噩梦,因为您需要支持更复杂的步骤定义,同时避免命名冲突。
  2. 特定于场景的步骤是可读性和简单性的首选,但由于命名冲突而成为维护的噩梦。
  3. 所以,我认为Cucumber目前已经破产,而且你最喜欢的单元测试框架之上的普通Capybara是最灵活的。

    如果他们选择,Cucumber可以添加场景上下文,特定于功能的场景,场景命名空间等,这样您就可以通过某种方式调整场景的范围 - 通过功能,用户角色,任何有意义的 - 并大大减少命名冲突以制作场景 - 特定步骤真正可行。在那一点上,我认为会有一个明确的风格赢家。在此之前,总是存在这样的紧张,需要抽象你的步骤以避免命名冲突,而不是希望保持它们的场景特定的简单性和可读性。

    尝试解决这些缺点的替代项目是Spinach,但该项目并非全部活跃。 See my comments here about an evaluation of Spinach vs Cucumber

答案 3 :(得分:7)

我也在寻找黄瓜项目。实际上在Cucumber的存储库中有一个wiki页面,其中列出了这些项目(并非所有项目仍然使用Cucumber ):

使用黄瓜的项目:

来源: https://github.com/cucumber/cucumber/wiki/Projects-Using-Cucumber

答案 4 :(得分:5)

我建议:

https://github.com/teambox/teambox/tree/dev/features

更新:正如Ivailo Bardarov所说,他们使用的是网步,这在目前是不好的做法。只需看看这个作为参考,看看好的功能,而不是步骤!

更新2:我认为,我从关键版本的Object on Rails书籍提供的黄瓜功能中学到了很多东西。源代码不是开源的,因此我无法在此处发布或无法找到它的链接。

我首选的方法是使功能语言接近域/业务语言而不是特定步骤或填写表单。所以不要在我的功能中使用这样的东西:

When I fill in "Name" with "XYZ

我的功能会说:

When I create a project:
| name |
| xyz  |

然后我的步骤就会有,点击链接的代码,解析表格并填写相关的表格字段等。

答案 5 :(得分:3)

我们在我当前的项目中使用Cucumber进行网络应用程序重新设计,但它不是开源的,因此我无法提供一组实际的功能和步骤。

我会说这些two samples中的页面对象模式受到了很大的启发。我们正在与UX团队进行大量的UI重构。使用Page Objects使得测试适应这些变化相当简单。

答案 6 :(得分:3)

我希望我可以发布我们的公司回购(财富500强的大型内部网络应用程序)。

野外最好的可能是维基百科的测试:

https://github.com/wikimedia/qa-browsertests

您确实需要使用页面对象进行抽象。即使这样,当您的应用程序超过30个输入屏幕时,您的测试也难以抽象化。

我有一种快速抽象没有周期的常见路径的实验方法;应该清理它并将其作为拉动请求发送给Cheezy:https://github.com/cheezy/page-object

答案 7 :(得分:2)

大型项目的一个常见问题是黄瓜功能需要花费大量时间来编写。

因此涉及多种策略: 如果您使用Cucumber描述遗留系统,您可以通过黄瓜和水豚获得不错的验收测试覆盖率,然后重构您的黄瓜步骤定义。

如果您正确进行单元测试,请使用Cucumber仅描述应用的快乐路径,或仅描述基本的非快乐路径。获得RSpec(或选择的Xunit)的报道。

Cucumber的关键问题是功能应该在很高的层次上描述功能。您需要使步骤定义DRY和可重用,并且我喜欢重定向步骤定义以保持利益相关者有趣的功能简明扼要。虽然我认为这一点可能有点争议。