Unit testing 为什么使用集成测试而不是单元测试是个坏主意?

Unit testing 为什么使用集成测试而不是单元测试是个坏主意?,unit-testing,tdd,integration-testing,Unit Testing,Tdd,Integration Testing,让我从定义开始: 单元测试是一种软件验证和确认方法,程序员在其中测试单个源代码单元是否适合使用 集成测试是将单个软件模块作为一个组进行组合和测试的软件测试活动 尽管它们的用途不同,但这些术语经常混淆在一起。开发人员将自动化集成测试称为单元测试。还有一些人认为哪一个更好,这在我看来根本就是一个错误的问题 我想请开发社区分享他们对为什么自动化集成测试不能取代经典单元测试的看法 以下是我自己的观察: 集成测试不能与TDD方法一起使用 集成测试速度慢,不能经常执行 在大多数情况下,集成测试不会指出问题的

让我从定义开始:

单元测试是一种软件验证和确认方法,程序员在其中测试单个源代码单元是否适合使用

集成测试是将单个软件模块作为一个组进行组合和测试的软件测试活动

尽管它们的用途不同,但这些术语经常混淆在一起。开发人员将自动化集成测试称为单元测试。还有一些人认为哪一个更好,这在我看来根本就是一个错误的问题

我想请开发社区分享他们对为什么自动化集成测试不能取代经典单元测试的看法

以下是我自己的观察:

  • 集成测试不能与TDD方法一起使用
  • 集成测试速度慢,不能经常执行
  • 在大多数情况下,集成测试不会指出问题的根源
  • 使用集成测试创建测试环境更加困难
  • 更难确保高覆盖率(例如模拟特殊情况、意外故障等)
  • 集成测试不能与一起使用
  • (来自)
  • 编辑:再次澄清一下:问题不在于是否使用集成或单元测试,也不在于哪个更有用。基本上,我想收集那些只写集成测试并将它们看作单元测试的开发团队的参数。 任何涉及不同层组件的测试都被视为集成测试。这与单元测试相比,单元测试的主要目标是隔离

    谢谢,,
    Andrey

    集成测试通常在单元测试之后进行。我不确定测试未经测试的单元之间的交互有什么价值

    如果齿轮可能损坏,测试机器的齿轮如何一起转动是没有意义的。

    有研究(a)表明,当您离开引入缺陷的位置时,修复缺陷的成本会变得更高

    例如,修复软件中的一个bug的成本通常相对较低,而您甚至还没有开始进行源代码管理。我保证,这是你的时间,而且时间不多(假设你的工作做得很好)

    将其与客户(或您的所有客户)发现问题时的修复成本进行对比。很多级别的人都参与进来,新的软件必须在匆忙中构建并推出到现场

    这是一个极端的比较。但是,即使单元测试和集成测试之间的差异也很明显。单元测试失败的代码主要只影响单个开发人员(当然,除非其他开发人员/测试人员等正在等待)。然而,一旦您的代码参与到集成测试中,一个缺陷就会开始阻碍团队中的其他人

    我们不会梦想用集成测试取代单元测试,因为:

    • 我们的单元测试也是自动化的,因此,除了初始设置,运行它们的成本很低
    • 它们构成了集成测试的开始。所有单元测试都会在集成阶段重新运行,以检查集成本身是否没有破坏任何东西,然后还有集成团队添加的额外测试

    (a) 例如,请参阅幻灯片#5,或在网上搜索
    缺陷预防:降低成本和提高质量

    • 集成测试很慢
    • 集成测试可能会破坏不同的功能 原因(未重点关注和 孤立的)。所以你需要更多 在失败时进行调试
    • 结合 对于集成来说,场景太大了 未进行单元测试时进行测试

    我主要做单元测试,集成测试(配置、查询)减少10倍

    我认为覆盖率是主要问题

    一个特定的小组件的单元测试,比如一个方法或者最多一个类,应该在每个法律场景中测试该组件(当然,一个抽象出等价类,但是每个主要类都应该被涵盖)。因此,此时应捕捉到违反既定规范的变更

    在大多数情况下,集成只使用每个子单元可能场景的一个子集,所以出现故障的单元仍有可能生成一个最初集成良好的程序

    由于您在下面指定的所有原因,通常很难实现集成测试的最大覆盖率。如果没有单元测试,对在新场景中基本上运行它的单元的更改很可能不会被捕获,并且在集成测试中可能会丢失。即使没有遗漏,查明问题也可能极其困难

    我不确定大多数开发人员是否将单元测试称为集成测试。我的印象是,大多数开发人员理解这些差异,这并不意味着他们也在实践

    • 单元测试侧重于测试单个组件,不依赖于外部依赖关系。它们通常与模拟或存根一起使用
    • 集成测试涉及多个组件,并且可能依赖于外部依赖关系
    我认为两者都很有价值,在他们所做的工作中,任何一方都无法取代另一方。我确实看到许多集成测试伪装成单元测试,尽管它们具有依赖性,并且运行时间很长。它们应单独运行,并作为持续集成系统的一部分


    集成测试通常会发现单元测试没有发现的东西

    在许多情况下,两者都需要。就我所关心的使用集成测试作为单元测试而言,您的观察是正确的,但它们并不意味着集成测试没有价值或没有必要,只是