集成与验收测试......啥是 Cucumber / Steak?

Posted

技术标签:

【中文标题】集成与验收测试......啥是 Cucumber / Steak?【英文标题】:Integration vs acceptance test ... what is Cucumber / Steak?集成与验收测试......什么是 Cucumber / Steak? 【发布时间】:2010-10-25 23:18:52 【问题描述】:

对于我的 Rails Web 应用程序的集成测试,我使用 Steak(类似于 Cucumber)。 Steak 的规格位于名为 spec/acceptance 的文件夹中。 Steak/Cucumber 现在是否用于集成或验收测试?我一直认为这是不同的东西。

【问题讨论】:

【参考方案1】:

首先,关于术语的说明:集成测试这个术语在 TDD 社区中有点模糊。根据您是来自 Java 还是 Rails(使用 Test::Unit),您可能会通过它理解不同的东西。在 Rails(带有 Test::Unit)中,集成测试是测试你的完整堆栈的测试,而功能测试是测试你的控制器的测试。 Java 社区中的大多数人(至少根据我的观察)会认为情况正好相反。我个人更喜欢将端到端测试称为验收测试,而涉及系统多个层(但不是全部)的测试——集成测试。总而言之,这很大程度上取决于你所处的文化。

至于 Cucumber 和 Steak —— 两者都是允许被称为行为驱动开发(或简称 BDD)的开发风格的框架。关键是您有两个级别的测试:

端到端测试,通过整个堆栈测试您的测试 - 它们模拟浏览器,通过您的控制器并访问数据库。黄瓜和牛排适合这一细分市场。 单元测试,单独测试一小部分功能(通常是单个类,模拟其协作者)。这就是 RSpec 适合的地方。

在 BDD 中,您从一个失败的端到端测试开始(被亲切地称为“上层齿轮”),然后您开始使用 RSpec(“下层齿轮”)首先实现功能测试,直到您获得端到端测试通过。通过这种方式,端到端测试正在推动您的单元测试,进而推动您的实施。主要好处是避免范围蔓延——您最终不会实现不需要的用户可见功能(因为您没有为其编写端到端测试)。

如果您想了解更多信息,我听说Behavior Driven Development Wikipedia article 非常好。还有,RSpec 书。

因此,Cucumber 和 Steak 都是允许您在“上层”编写测试的框架。不同之处在于风格——Cucumber 让你用自然语言编写测试。这有几个好处。

业务人员可以阅读测试 -- 虽然您不能指望非程序员编写它们,但他们在传达您的意图方面做得很好。您可以编写功能(首先是 Cucumber 测试)并将其展示给客户,以获得有关这是否是他们真正想要的一些反馈。我发现这非常有用。 Cucumber 功能可以更好地传达意图 -- 由于您可以使用英语(或任何语言,真的)的全部力量,您可以传达为什么这个功能是相关的并且 用户如何在 Ruby 不允许的水平上实现他们的目标。 Cucumber 有助于发现无处不在的语言——该域包含许多在与客户的对话中飞来飞去的术语。 Cucumber 允许您在开始实施该功能之前发现并捕获它们。而且这一切都是由测试驱动的。 Cucumber 特性有点高级,这使得特性(但不是步骤定义)更加独立于界面。这样,如果界面需要更改,您就不必重新设计功能。

缺点包括学习如何很好地应用它有点棘手,并且您必须编写更多内容(功能和步骤定义)。我发现,如果您已经这样做了一段时间,那么第二个并不是真正的问题,因为您可以获得大量可重用的步骤,可以让您更快地编写下一个功能。

另一方面,牛排更简单,它是 Ruby。你失去了使用英语的所有好处,但你可以写得更少,它会执行得更快(有点)。

归根结底,您可以使用两者来编写推动开发的端到端测试。

【讨论】:

感谢您的详细解释。特别是第一部分对我来说很有趣。因此,当测试中至少包含两层(例如控制器 + 视图)时,可以说是集成测试。当所有层都包含在测试中时进行验收测试(==端到端)。所以看起来 Rails 社区有时对确切的命名有点松懈,因为 Cucumber 和 Steak 通常被称为集成测试名作。但实际上两者都是为验收(端到端)测试而设计的。 感谢您澄清“主要好处是避免范围蔓延”。作为编写自动化测试的新手,我发现花费在设置和初始学习曲线上的时间令人不安。这让我担心编写所有这些测试本身就是开发人员待办事项清单上的一种范围蔓延!但如果它是结束所有范围蔓延的范围蔓延,那么我全力以赴:-) 哦,很高兴能帮上忙 :) 最近的阅读让我认为这个答案有一件事(尽管我一直认为它是正确的)可能是完全错误的——那就是特性测试应该结束的想法——到结束。实际上,我开始觉得自己有点愚蠢。功能测试应该涵盖所有用例,但端到端测试应该涵盖足以让整个堆栈工作的信心。你应该能够快速运行你的特性测试,所以你可以经常运行它们,如果它们太慢,你就不能这样做。如果他们都是全栈的,他们会太慢。 @ms-ati 自从我写了那条评论后,我对 Cucumber 测试的理解有了进一步的发展。目前,我现在实施的几乎所有 Cucumber 测试都是快乐路径和端到端的。大多数非快乐路径案例超出了应用程序业务价值的高级描述范围,因此它们不是 Cucumber 场景的主题。它们被其他类型的测试覆盖。在非黄瓜测试中,少数需要端到端,所以这些是集成测试/规范(如果涉及 Web 浏览器,则使用 Capybara)。

以上是关于集成与验收测试......啥是 Cucumber / Steak?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Cucumber 编写 Feature 级别的验收测试?

你能回顾一下我对 Cucumber 的 Perl 重写吗?

使用与黄瓜集成的柑橘框架的并行集成测试执行

黑盒测试白盒测试单元测试集成测试系统测试验收测试的区别与联系

iOS 测试/规范 TDD/BDD 和集成与验收测试

持续集成和验收测试驱动开发