单元测试和集成测试有什么区别?

Boo*_*oks 365 integration-testing unit-testing

单元测试和集成测试有什么区别?

这些测试有不同的名称吗?像一些人称单元测试功能测试等?

Nat*_*hes 576

一个单元测试是由程序员编写的,以验证一个相对较小的一段代码是做什么打算做一个测试.它们的范围很窄,它们应该易于编写和执行,它们的有效性取决于程序员认为有用的东西.这些测试旨在供程序员使用,但它们并不直接对其他人有用,但是,如果他们完成工作,下游的测试人员和用户应该从看到更少的错误中受益.

作为单元测试的一部分是暗示被测试代码之外的东西被模拟或删除.单元测试不应该依赖于外部系统.他们测试内部一致性,而不是证明他们与一些外部系统很好地配合.

进行集成测试以证明系统的不同部分一起工作.集成测试可以涵盖整个应用程序,它们需要更多的努力才能组合在一起.它们通常需要为数据库实例和硬件分配资源.集成测试在演示系统工作方面做得更有说服力(特别是对于非程序员),而不是一组单元测试,至少在集成测试环境类似于生产的程度上.

实际上,"集成测试"被用于各种各样的事情,从完全系统测试到类似生产的环境到使用未被模拟的资源(如数据库或队列)的任何测试.在频谱的低端,集成测试可以是junit测试,其中存储库针对内存数据库运行,朝向上端它可以是验证应用程序可以交换消息的系统测试.

  • 单元测试的描述非常好,但您是否认为成对集成不仅仅涵盖整个应用程序的两个可测试单元,系统测试也涵盖整个应用程序. (21认同)
  • 差异与测试代码的大小无关.这个定义也错过了一个实际方面:单元测试应该只取决于测试的实现单元; 它们不应该依赖于外部组件,例如数据库,网络服务,Web浏览器交互.当需要这样的外部元素时,单元测试使用模拟对象. (17认同)
  • 我花了很多时间来理解这一点,因为当你说单位时,我曾经认为"小块代码"的例子是getCitiesFromCountry(字符串Country)应该验证数据库是否返回"伦敦,曼彻斯特"如果你通过"英国" .那对我来说是个单位.所以我使用模拟来模拟数据库并尝试返回过滤列表.我现在明白,作为一个集成测试,如果数据库在被问到英国城市的时候返回纽约,那么QA会接受这些测试.单元测试只测试例如调用控制器的往返行程,并按照应有的方式运行. (12认同)
  • 我想补充一点(当我写这篇文章时,2018年中期)集成测试比以前便宜得多.这主要是由于集装箱化的持续发展.如果你需要一个数据库,redis,SFTP等,它们实际上是一个"docker pull",而docker-compose可以很容易地在一个"docker-compose up"命令中启动你的应用程序及其依赖项. (3认同)
  • @PauloMerson这是一个非常好的观点,谢谢.测试代码的大小未定义单位.我实际上已被高级开发人员告知,他们在单元测试中会容忍外部数据库连接,这证明该主题非常混乱. (2认同)

Dav*_*ave 92

单元测试应该不依赖于测试单元之外的代码.您可以通过寻找最小的可测试部件来确定单元是什么.如果存在依赖关系,则应将其替换为虚假对象.模拟,存根..测试执行线程在最小的可测试单元内开始和结束.

当虚拟对象被真实对象替换并且测试执行线程跨越到其他可测试单元时,您将进行集成测试

  • @BKSpurgeon因为在单元测试中你只想在明确定义的上下文中检查测试函数的行为.它不应受依赖项中潜在错误的影响.如果您想声明函数和依赖项的组合按预期工作,那么您正在编写集成测试. (9认同)
  • 谢谢@Dave,但为什么单元测试没有外部依赖? (2认同)
  • 根据我的经验(通常是银行业务,通常是大规模的错误代码),每个人都将所有测试称为“单元测试”。他们还倾向于匆匆编写方法并将代码编写成有效的大型长脚本,并且设计不当,因此无法进行真正的单元测试,但他们认为这是单元测试,因为它们使它们无需网络连接即可正常运行。当您将数百个小型的,以激光为重点的类进行设计,并将内容框架化为NuGet软件包时,真正的单元测试就变得显而易见。 (2认同)

The*_*uck 42

单元测试(尽可能)完全隔离.

当测试对象或模块正常工作时,使用其他代码进行集成测试.


Kar*_*aen 15

单元测试测试您完全控制的代码,而集成测试测试代码如何使用或"集成"其他代码.

因此,您可以编写单元测试以确保您自己的库按预期工作,然后编写集成测试以确保您的代码与您正在使用的其他代码(例如库)完美匹配.

功能测试与集成测试有关,但更具体地涉及测试整个系统或应用程序的测试,所有代码一起运行,几乎是一个超级集成测试.

  • 另外值得一提的是,单元测试通常是指测试最少量代码的测试,例如单个函数 (3认同)

Jeg*_*raj 11

通常对软件模块中实现的单个功能进行单元测试.测试范围完全在此SW模块中.单元测试永远不能满足最终的功能要求.它来自白盒测试方法..

而进行集成测试以确保不同的SW模块实现.测试通常在SW开发中完成模块级集成后进行.此测试将涵盖功能要求,但不足以确保系统验证.