24

For integration tests of my Rails web app I use Steak (something like Cucumber). The specs of Steak are in a folder named spec/acceptance. Are Steak/Cucumber now for integration or acceptance testing? I always thought that this is something different.

4

1 回答 1

76

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

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

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

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

如果您想了解更多信息,我听说行为驱动开发 Wikipedia 文章出奇地好。另外,RSpec 书。

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

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

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

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

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

于 2010-10-27T10:24:45.477 回答