集成测试与验收测试之间的区别...Cucumber/Steak是什么?

25

我使用 Steak(类似于 Cucumber)来进行 Rails Web 应用程序的集成测试。Steak 的规范在名为 spec/acceptance 的文件夹中。现在,Steak/Cucumber 是用于集成测试还是验收测试?我一直认为它们是不同的。

1个回答

77
首先,需要说明一下术语:在TDD社区中,“集成测试”这个术语有点模糊。如果你来自Java或者使用Test::Unit的Rails,你对此的理解可能会不同。在Rails(使用Test::Unit)中,“集成测试”是测试整个栈的测试,而“功能测试”则是测试控制器的测试。至少我观察到的情况是,大多数Java社区的人认为情况恰恰相反。我个人更喜欢将端到端测试称为“验收测试”,而涉及系统的几层(但不涉及全部)的测试称为“集成测试”。总之,这取决于你所处的文化背景。
至于Cucumber和Steak——两者都是允许一种称为行为驱动开发(BDD)的开发风格的框架。关键是你要有两个级别的测试:
- 端到端测试,测试整个栈——它们模拟浏览器,通过控制器并访问数据库。Cucumber和Steak适用于这个领域。 - 单元测试,测试一个小的、与其他部分隔离的功能(通常是单个类,模拟它的协作者)。这正是RSpec的用武之地。
在BDD中,你从一个失败的端到端测试(俗称“上档”)开始,然后使用RSpec(“下档”)测试驱动功能的实现,直到通过端到端测试。这样,端到端测试驱动单元测试,而单元测试则驱动实现。主要好处是避免了范围蔓延——你不会最终实现不必要的用户可见功能(因为你没有为其编写端到端测试)。
如果你想了解更多信息,我听说行为驱动开发Wikipedia文章非常好。此外,RSpec书籍也是一个不错的选择。所以,Cucumber和Steak都是允许您在更高层次上编写测试的框架。区别在于风格- Cucumber要求您使用自然语言编写测试。这有几个好处。
  • 业务人员可以阅读测试 - 尽管您不能指望非程序员编写它们,但它们在传达您打算执行的操作方面做得很好。您可以先编写功能(Cucumber测试),然后将其展示给客户以获取有关他们实际需要的反馈意见。我发现这非常有用。
  • Cucumber功能更好地传达意图 - 由于您可以使用英语(或任何语言)的全部力量,因此可以在Ruby不允许的级别上传达为什么此功能很重要以及用户如何实现目标。
  • Cucumber有助于发现普遍语言 - 领域涉及与客户对话中飞行的许多术语。在开始实施功能之前,Cucumber允许您发现并捕获它们。而且,这都是测试驱动的。
  • Cucumber功能略微更高级,这使得特性(但不是步骤定义)更独立于接口。这样,如果接口需要更改,则无需重新制定功能。

缺点包括学习如何优雅地应用它有点棘手,以及您必须写更多(包括特性和步骤定义)。我发现,如果您已经使用它一段时间,第二个问题并不是真正的问题,因为您将获得可重复使用的步骤库,从而使您可以更快地编写下一个特性。

另一方面,Steak更简单,且是Ruby编写。您失去了使用英语的所有好处,但可以编写更少的内容,并且执行速度更快('有些')。

总之,您可以同时使用两者来编写驱动开发的端到端测试。


3
谢谢您提供详细的解释。我特别对第一部分很感兴趣。因此,当测试中至少包含两个层(如控制器+视图)时,可以称之为集成测试。当测试中包括所有层(==端到端)时,则称之为验收测试。因此,似乎Rails社区有时会对确切的命名有些懈怠,因为Cucumber和Steak通常被称为集成测试框架。但实际上,这两者都是为验收(端到端)测试而设计的。 - medihack
1
感谢您澄清“主要好处是避免范围蔓延”。作为一个新手编写自动化测试,我发现花费的时间来设置和克服最初的学习曲线令人不安。这让我担心编写所有这些测试本身就是开发人员待办事项清单上某种形式的范围蔓延!但如果它是终结所有范围蔓延的方法,那么我完全支持它 :-) - evanrmurphy
哦,我很高兴能够帮助 :) - Stefan Kanev
1
最近的阅读使我认为本答案中有一件事(尽管我一直认为是正确的)可能是错误的——即特性测试应该是端到端的想法。实际上,我开始感到有点愚蠢,因为我相信了这个想法。特性测试应该涵盖所有用例,但端到端测试只需要涵盖足够的内容以确保整个栈正常工作。你应该能够快速运行特性测试,这样你可以经常运行它们,如果它们太慢,就无法做到这一点。如果它们都是全栈测试,则会很慢。 - Steve Jorgensen
@SteveJorgensen 你是否会使用黄瓜实践,即每个功能的初始 happy-path 场景都是端到端的,并标记为黄瓜标签,而其他场景则不是?我的理解是这样可以让你以相同的方式编写所有功能测试,但每个功能只有一个 happy-path 是真正的端到端? - ms-ati
1
@ms-ati 我对Cucumber测试的理解自我发表那条评论以来已经有所演变。目前我实现的几乎所有Cucumber测试都是快速路径和端到端测试。大多数非快乐路径情况超出了应用程序业务价值的高级描述范围,因此它们不是Cucumber场景的主题。它们由其他类型的测试代替进行覆盖。在非Cucumber测试中,有少数需要进行端到端测试,因此这些是集成测试/规格(如果涉及Web浏览器,则使用Capybara)。 - Steve Jorgensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接