我知道所谓的单元测试和集成测试的教科书定义。我好奇的是什么时候该写单元测试了……我将写它们来覆盖尽可能多的类集。
例如,如果我有一个Word类,我将为Word类编写一些单元测试。然后,我开始编写我的Sentence类,当它需要与Word类交互时,我经常会编写单元测试,这样它们就可以同时测试Sentence和Word……至少在他们相互作用的地方。
这些测试本质上变成集成测试了吗?因为它们现在测试这两个类的集成,还是仅仅是一个跨越两个类的单元测试?
一般来说,由于这条不确定的界线,我很少实际编写集成测试……或者我是否使用成品来查看所有部件是否正常工作,即实际的集成测试,即使它们是手动的,并且很少在每个单独的功能范围之外重复?
我是否误解了集成测试,或者集成测试和单元测试之间真的只有很小的区别?
我在采访中经常被问到这个问题。到目前为止,我一直在吹嘘我的专业知识,并对组件测试和验收测试侃侃而谈。
多年来,我只了解集成和单元测试。作为一个单独的开发人员,我可以编写单元测试来磨练我的技能,但我并不总是这么做。
单元测试
这是一个关键的区别。单元测试易于实现和执行,理想情况下不需要依赖。这就是嘲笑的意义所在。不模仿所有内容通常更容易,特别是在覆盖您所编写的其他函数的情况下。也许更简单,但这不是单元测试的思想。
我要重申,单元测试意味着易于运行且规模小。它们的失败可以让我们立即了解bug是在哪里引入的。
下面是测试的等级,从底部的廉价和丰富到顶部的缓慢、昂贵和很少:
还有几个层可以概念化,但为了清晰起见,省略了这些层。
集成测试
通过集成测试,您可以考虑引入严重的外部依赖项,例如虚拟机、虚拟网络和设备。可能您可以使用实际的调制解调器、路由器和防火墙,只要这些花费是合理的。
这些不会在本地运行,而是在构建服务器上运行。本地Jenkins和基于云的CI提供商的组合满足了这一需求。
其他测试术语
这是我在工业界工作了几年的体会。我们可以讨论组件测试,并得到一个定义,但如果这个定义没有被广泛使用,那么它就失去了价值。
验收测试就是我们所说的业务单元或客户需求。这些将引导一切的方向,并位于金字塔的顶端(想象一个美元符号)。
端到端测试是集成测试的同义词,但我在网上注意到它被放在上面。我想它可能与验收测试和集成测试更相关,后者往往更详细,涉众的兴趣更少(尽管部门内部有巨大的兴趣)。
这些测试本质上变成集成测试了吗?因为它们现在测试的是这两个类的集成?或者它只是一个跨越2个类的单元测试?
我认为是和是。跨越2个类的单元测试变成了集成测试。
您可以通过使用mock实现(MockWord类)测试Sentence类来避免这种情况,当系统的这些部分足够大,可以由不同的开发人员实现时,这一点非常重要。在这种情况下,Word是单独的单元测试,句子是在MockWord的帮助下进行单元测试,然后句子是用Word进行集成测试。
以下是真实差异的例子
1) 1,000,000个元素的数组很容易进行单元测试,工作良好。
2) BubbleSort很容易在10个元素的模拟数组上进行单元测试,而且工作得很好
3)集成测试表明有些东西不是很好。
如果这些部分是由一个人开发的,在单元测试BubbleSoft时很可能会发现问题,因为开发人员已经有了真实的数组,他不需要模拟实现。