What's the difference between unit tests and integration tests?
单元测试和集成测试有什么区别?
这些测试有不同的名称吗?像一些调用单元测试功能测试的人一样?
- softwaretestingclass.com / & hellip;
单元测试是由程序员编写的一种测试,用来验证一段相对较小的代码是否正在执行其预期的操作。它们的范围很窄,应该易于编写和执行,它们的有效性取决于程序员认为有用的东西。这些测试是为程序员而设计的,它们对其他任何人都不是直接有用的,但是,如果他们做了自己的工作,测试人员和下游用户应该从看到更少的错误中获益。
作为一个单元测试的一部分,意味着在测试代码之外的东西是被模仿的或者被删掉的。单元测试不应该依赖于外部系统。它们测试内部一致性,而不是证明它们与一些外部系统很好地配合。
进行集成测试以证明系统的不同部分协同工作。集成测试可以覆盖整个应用程序,它们需要更多的工作来组合在一起。它们通常需要为它们分配数据库实例和硬件等资源。集成测试在演示系统工作(尤其是对非程序员)方面比一组单元测试做得更令人信服,至少在集成测试环境类似于产品的程度上是如此。
实际上,"集成测试"被用于各种各样的事情,从针对类似于生产环境的完整系统测试到使用未模拟的资源(如数据库或队列)的任何测试。在范围的低端,集成测试可以是JUnit测试,其中存储库针对内存中的数据库执行,而在高端,集成测试可以是系统测试,验证应用程序是否可以交换消息。
- 单元测试的描述非常好,但是您是否认为成对集成不包括整个应用程序——只有两个可测试单元,并且系统测试也包括整个应用程序。
- 区别不在于测试代码的大小。这个定义还缺少一个实际方面:单元测试应该只依赖于被测试的实现单元;它们不应该依赖于外部组件,如数据库、网络服务、Web浏览器交互。当需要这样的外部元素时,单元测试使用模拟对象。
- @保罗:同意了,我加了一个章节来说明这一点。如果你想建议编辑,我很乐意批准。
- 我花了很长时间才理解这一点,因为当你说Unit时,我曾经认为"小代码块"的一个例子是getitiesFromCountry(字符串国家),如果你输入"UK",数据库会返回"London,Manchester"。对我来说这是一个单位。所以我将使用一个模拟来模拟数据库,并尝试返回一个过滤列表。我现在明白了,作为一个集成测试,如果数据库在被要求访问英国城市时返回纽约,那么QAS将采取一些措施。单元测试只是测试到控制器的往返行程是否被调用并按其应该的方式运行。
- @保罗梅森,这是一个很好的观点,谢谢。测试代码的大小没有定义单元。实际上,高级开发人员告诉我,他们会在单元测试中容忍外部数据库连接,这证明这个主题非常令人困惑。
- 我想补充一下,目前(在我写这篇文章的2018年年中)执行集成测试比以前便宜得多。这主要是由于集装箱化的持续发展。如果您需要一个数据库、redis、sftp等,它们实际上是一个"docker-pull",docker-compose使您的应用程序很容易在一个"docker-compose-up"命令中显示其依赖项。
- @乔希:是的,码头化的依赖性使您的测试具有更好的隔离性。
- "这些测试是为了程序员使用,它们不是直接有用的",我认为编写良好的测试是非常好和有效的文档。
- @Jean-Fran&231;Oissavard:我很熟悉这个想法,认为它很有吸引力,但不确定是否有足够的证据证明我想在这里为它辩护。
- 集成测试用例是否应该是生产构建周期的一部分?
- @Praveen:在生产中有一种测试的方法,但我认为没有一个普遍适用的"是-否"答案。
- 我相信将单元测试用例作为生产目标的一部分是可以的,您不希望热修复程序破坏代码。只需要知道我们是否可以在prod上运行int测试,如果可以,那么在部署的哪个阶段运行int测试?
- @普拉文:也许要问个新问题?这超出了这个答案所能处理的范围。
单元测试不应该依赖于被测试单元之外的代码。您可以通过寻找最小的可测试部分来决定单元是什么。如果存在依赖项,则应将它们替换为假对象。嘲弄,树桩……测试执行线程在最小的可测试单元内开始和结束。
当假对象被真实对象替换并且测试执行线程交叉到其他可测试单元时,您就有了一个集成测试
- 谢谢@dave,但是为什么单元测试不应该有外部依赖性呢?
- @因为在单元测试中,您只想在定义良好的上下文中检查被测试函数的行为。它不应该受到依赖关系中潜在的bug的影响。如果您希望断言函数和依赖项的组合按预期工作,那么您正在编写一个集成测试。
- 根据我的经验(通常是银行业务,通常是大规模的坏代码),每个人都将所有测试称为"单元测试"。他们还倾向于将方法快速编码成有效的长脚本,并且设计不正确,因此无法进行真正的单元测试,但他们认为它们是单元测试,因为它们使它们在没有网络连接的情况下运行良好。当您将数百个小型的、以激光为焦点的类组成设计,并将其框架化为nuget包时,那么什么是真正的单元测试就变得显而易见了。
单元测试是在(尽可能)完全隔离的情况下进行的。
集成测试是在被测试对象或模块正常工作时,使用其他代码位进行的。
单元测试测试您完全控制的代码,而集成测试测试您的代码如何使用或与其他代码"集成"。
因此,您可以编写单元测试来确保您自己的库按预期工作,然后编写集成测试来确保您的代码与您正在使用的其他代码(例如库)很好地配合使用。
功能测试与集成测试相关,但更具体地说是指测试整个系统或应用程序的测试,所有代码都在一起运行,几乎是一个超级集成测试。
- 同样值得一提的是,单元测试通常是指测试少量代码的测试,例如单个函数
单元测试通常针对软件模块中实现的单个功能进行。测试范围完全在该软件模块内。单元测试永远不能满足最终的功能需求。它属于白盒测试方法。
而集成测试则是为了确保不同的软件模块实现。测试通常在软件开发中完成模块级集成之后进行。此测试将涵盖功能需求,但不足以确保系统验证。