集成测试/单元测试:进行太多集成测试?

时间:2013-07-04 15:19:08

标签: unit-testing mocking tdd integration-testing

我一直在设计一些单元测试,模拟每个单元的每个依赖项。这按预期工作。我现在需要进行集成测试。

因此,例如,我有1层依赖于2个附加层,我已经分别测试每个单独的层作为一个单元模拟每个依赖项,但我现在需要执行集成测试。

想象一下,我有以下三层......

  Layer1 > Layer2 > Layer3

我可以对Layer1进行集成测试,它可以为Layer2和Layer3提供真实实例(而不是模拟)。

那么我应该对Layer2进行集成测试吗?其中包括以下工作流程

  Layer2 > Layer3

此处没有任何内容被嘲笑,它们是集成测试。

我看到的问题是我的Layer1集成测试真的涵盖了Layer2的相同集成测试。

我不太确定我是不是太过分了。我知道有更多的测试而不是不够,但我在测试layer1

时看到了重复
  Layer1 > Layer2 > Layer3

和layer2

  Layer2 > Layer3

所以我可能只是测试Layer1 - 使用集成测试

  Layer1 > Layer2 > Layer3

可能会涵盖layer2和layer3集成测试

  Layer2 > Layer3 

?? 我真的很感激任何反馈或意见。

3 个答案:

答案 0 :(得分:4)

您应该测试应用程序中可实现的任何方案(通过客户/组件交互)。如果Layer2可以与Layer3互动但没有Layer1干扰 - 请对其进行测试。

将整合测试视为整个用例的测试。是否存在客户可以通过单独调用Layer2开始的情况?如果有,测试它。如果没有,你为什么要那样做?切勿测试未使用的东西。这与编写“某人可能需要稍后”的代码相同。这是浪费时间,不要那样做。

答案 1 :(得分:1)

我倾向于松散地定义集成测试。如果我看到一个涵盖几个类之间交互的测试,我倾向于将其称为集成测试(这是另一个术语,但我现在不记得了)。对我来说,这不仅仅是关于图层集成。

这个想法是你应该根据关键场景和/或重要用例进行集成测试。从这些方面来说,您将了解集成测试应该从哪里开始。不要为了创建它而创建集成测试。当用于不太重要的位时,它们往往是太多的工作和维护。

在您的示例中,如果您对Layer1进行了集成测试,该测试会触及所有三个层,那么这将充分涵盖您的场景。正如之前的回答中所提到的,除非您说其他内容可能会Layer2 > Layer3并完全绕过Layer2,否则无需故意测试Layer1。但即使是这种情况,我也会从“别的东西”开始准备集成测试。当您的用例从Layer2 > Layer3开始时,只测试Layer2

答案 2 :(得分:0)

集成测试有时很有用,但就性能和复杂性而言,它们只有high cost

IMO它们不应该用于对系统行为的详尽验证,它们包含的活动部件的数量以及它们的行为组合的数量通常太高。

我主要为两个目的进行集成测试:

  • 在项目开始时,端到端测试是您应该编写的第一个测试,如果您想设置Walking Skeleton,它代表系统的一个简单的全功能第一小片

  • 测试系统和第三方代码之间的集成。或者,更准确地说,测试您编写的适配器以将系统与第三方模块隔离开来,可以正确调用这些第三方模块。

如果您正在努力探索所有不同的测试实践以及何时使用它们,那么“Growing Object-Oriented Software, Guided by Tests”这本书就会提供非常有用的指导。