为什么黄瓜被认为是集成测试工具而不是单元测试工具?

时间:2010-11-17 05:40:50

标签: ruby unit-testing cucumber

这一直困扰着我。为什么人们说在rspec中进行单元测试而在黄瓜中进行整合测试?我不是在问为什么这些测试是必要的 - 我知道集成和单元测试之间的区别。我只是不明白为什么,鉴于黄瓜完全可定制的语法,它不用于单元测试?

在我看来,为黄瓜和rspec编写相同数量的代码,唯一的区别是黄瓜将测试逻辑与测试编写分开。

5 个答案:

答案 0 :(得分:7)

使用黄瓜进行单元测试有很多开销。您不仅要编写功能,还要使用单独的代码将它们映射到实现。

单元测试意味着写入速度非常快,执行速度非常快。当然,黄瓜专注于最终用户体验,主要是由于编写功能时使用的语言。

要刷新,功能将包含以下内容:

  

作为系统的一些利益相关者   我想进行一项活动   这样我就可以从中获得一些好处

Given a precondition
When I perform an action
Then something should happen

通常被忽略的开头段落非常重要,因为它为操作设置了上下文,并解释了为什么发生了什么。由于使用了自然语言,这些东西很容易向非程序员展示,以获得一些反馈。

现在,使用这些进行单元测试似乎充其量只是尴尬。首先,最终用户关注建议采用更多集成方法,因为该功能没有提及模拟和UI /逻辑分离。即像下面这样的功能似乎很奇怪:

Given a that a database mock is configured with the following data
| ID  | Username |
| 0   | igor     |
When call FindAll on User Repository
Then I get the following user back
| ID  | Username |
| 0   | igor     |

此外,随着您的SUT变小(即一个类),操作的上下文不那么重要。用户存储库不关心上下文,例如它不关心它的消费者是普通用户还是VIP用户。一个简单的组件(它应该是SRP之后的组件),根据其输入是完全确定的。

因此,单元测试用于验证您编写的内容是否正确,并且通过将系统的行为置于上下文中来验证您编写的内容是否满足更高的目的。

答案 1 :(得分:5)

Cucumber解决了一系列特定的问题 - 吸引那些无法轻松阅读代码但无法编写代码的业务利益相关者,并在自动化方案中的步骤之间提供重用。这些方案通常还涵盖行为的多个方面,记录整个系统的功能,并且通常涵盖跨多个组件的整个用户旅程。 Cucumber鼓励的基于步骤的架构非常适合处理这些场景。

它还介绍了一整套其他问题。首先,您需要将Cucumber场景与一组灯具联系起来,因此还有另一层抽象,这使得它们的写入速度变慢。其次,英语比代码更难重构 - 即使是像Ruby这样的动态语言(差异在C#和Java变种中更为明显,如JBehave,SpecFlow,Cuke4Nuke和Cuke4Duke)。很难判断步骤是否仍在使用,并且更难以维护方案。在各个步骤之间管理状态也更加困难。

通过单元测试,观众是技术性的。理想情况下,类具有单一职责,几乎没有重复,因此重用步骤并不重要。当我们想要更改代码元素时,我们倾向于寻找其命名约定与文件或类匹配的测试,因此使用这些测试的一对一映射是理想的。

由于Cucumber的开销,并且因为我们没有从Cucumber提供的优势中获得价值以换取其开销,RSpec更适合单位级别的行为。 (对于JUnit,NUnit等也是如此)

如果您错过了Cucumber的“Given,When,Then”,请尝试将它们添加为评论。这对我很有用。

答案 2 :(得分:1)

一般的想法是黄瓜测试的编写水平高于传统的单元测试。例如,当您对特定模块进行单元测试时,您专注于仅测试与模块系统其他部分隔离的模块功能。进入系统其他部分的接口通常应该用模拟对象表示。

另一方面,Cucumber专注于从UI一直到数据持久层的系统测试。

单元测试=机械工程师在安装在线束上的实验室环境中测试他的新发动机。

黄瓜测试=将测试驱动器放在轨道上进行旋转。

答案 3 :(得分:0)

单元测试是单独测试特定的单元代码。通常的粒度是类中的方法(或几个交互方法)。

集成测试侧重于测试应用程序堆栈的多个层。例如,您可以运行集成测试来检查代码与数据库的交互。大多数集成测试都集中在两层或三层对象上。

黄瓜测试特别倾向于关注整个应用程序堆栈,因为他们通过模拟界面中的真实用户和应用程序的所有层(从UI到后端服务(数据库,文件系统,网络等)已到位并使用。

底线:

单元测试检查一段特定的代码是否符合与世界其他地方的合同......

黄瓜测试会检查几段代码的交互(有些人可能会说是一个垂直切片),而测试本身的额外美感就像普通英语一样。

答案 4 :(得分:0)

根据AslakHellesøy的说法,Cucumber不是一种测试工具,而是一种协作工具(用于BDD)。他最近发布了这个明显的误解:

https://cucumber.pro/blog/2014/03/03/the-worlds-most-misunderstood-collaboration-tool.html

也就是说,在接受程度低于集成测试层的地方写了很多测试。即,

Given a user at 123 Evergreen Terrace
When I lookup their name
Then I get Homer Simpson

而不是

Given an address
When I lookup a name
Then the home owner name is displayed

cukes.info作为一个必要的例子(而不是声明性的)显示没有帮助。

与Rspec或Test :: Unit或MiniTest单元测试相比,黄瓜测试运行缓慢。它们有很多开销(加载环境可能需要几分钟,包括所有页面对象类,解析功能文件,并实际执行测试)。只运行Cucumber单元测试比运行集成等效测试要快,但不如运行更轻量级的更快,如上面提到的三个。

(我正在回答这个老问题,因为这是我在搜索Cucumber的替代品进行集成测试时获得的第一次点击之一)