11 | 集成测试:单元测试可以解决所有问题吗?
郑晔
你好,我是郑晔!
前面我们花了大量的篇幅在讲单元测试。单元测试是所有测试类型中,运行速度最快,整体覆盖面可以达到最大的测试。因为单元测试的存在,我们甚至可以把测试覆盖率拉高到 100%。测试覆盖率都已经 100% 了,是不是我们用单元测试就可以解决所有的问题了?
正如我们在上一讲强调的那样,100% 的测试覆盖率并不代表代码没有问题。同样,即便是 100% 的单元测试也不能解决所有的问题。有一个重要的原因在于,我们在编写每个单元时都会假设这些单元彼此之间能够很好地协同,但这个假设是不是一定成立呢?答案是不一定。
让一个个单元正常运行,我们靠的不是美好的预期,而是单元测试。同样,各个单元能够很好地协同,我们也不能靠预期,而是要靠集成测试。这一讲,我们就来讨论一下集成测试。
代码的集成
在具体讨论集成测试之前,我们澄清一下概念。集成测试到底测的是什么?答案很显然是集成。问题是,集成要集成什么呢?一种是代码之间的集成,一种是代码与外部组件的集成。说白了,集成测试就是把不同的组件组合到一起,看看它们是不是能够很好地配合到一起。
我们先来看代码的集成。代码之间的集成,主要看我们编写的各个单元能否很好地彼此协作。既然集成测试是为了测试单元之间的配合,那是不是只要有单元之间的协作,我们就要为它们编写一个集成测试呢?比如按照常规的架构分层,一个 REST 服务会有一个 Resource(或者叫 Controller),一个 Service,一个 Repository,那是不是要 Service 和 Repository 的集成要写一个集成测试,Resource 和 Service 的集成测一次,Resource、Service 和 Repository 的集成再测一次呢?
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
集成测试是软件开发中至关重要的一环,它关注的是多个组件协同工作的表现。本文从代码之间的集成和代码与外部组件的集成两个方面展开讨论。对于代码之间的集成,需要考虑各个单元如何协作,以及与框架的集成。而对于外部组件的集成,难点在于如何控制外部组件的状态。数据库在这方面有比较成熟的解决方案,但对于第三方服务等外部组件,需要寻找合适的替代方案。文章强调了将不同组件集成起来进行测试的重要性,同时提出了一些思考题,鼓励读者分享在测试中遇到的难以集成的情况。总的来说,集成测试对于提高代码质量和开发效率至关重要,而了解单元测试和集成测试的区别以及框架对测试的支持程度也是必不可少的。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《程序员的测试课》,新⼈⾸单¥59
《程序员的测试课》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(7)
- 最新
- 精选
- sylan215本节说的集成测试,和前一节是一个前提,都是针对自己写的代码的集成测试,而且可以分 2 种情况。 一种是使用了框架,这时最好能把框架集成进去做一个完整的集成测试,如果一个框架不好集成,也可以侧面说明这个框架可能设计的不够好。 另一种是引入了第三方服务,可以使用 Mock,也可以使用服务对应的成熟解决方案(比如数据库相关)来满足集成测试的需要。 如果从项目角度看,可以补充一种集成测试,就是不同开发代码间的联调测试,联调测试越早越好,尤其是技术评审流程缺失,接口标准不明确的时候。
作者回复: 很清晰的总结
2021-09-074 - 不二先生郑老师,你好,我有几个问题想请教一下。 1. 单元测试和集成测试在执行时间上差异很大,那分别在开发流程中在哪个流程运行? 本地运行全部的单元测试和集成测试,通过之后提交MR,然后在CI环境运行单元测试和集成测试,通过之后进行 Code Review吗? 2. 单元测试的维度是函数,那对于 REST API 服务器的集成测试维度是 API 接口吗? 3. 如果数据库使用回滚来清除数据,那还需要单独创建数据库测试表吗?如果需要,是给每个表都创建对应的测试表吗? 4. 如果时间有限,是优先考虑集成测试吗?之后再补上单元测试?
作者回复: 1的前一半和4,是第15讲讨论的内容。 3是第14讲讨论的内容。 1的后一半,代码什么时候评审和公司的开发流程相关,选择一条适合自己团队的做法就好。但最好把测试都跑了,保证整体的可用性。 2. API接口可以怎么测,可以看第14讲,在几种方案中选一下就好。
2021-09-023 - 立麟系统测试,这里应该指的就是一般公司的开发全链路联调环节,这步是不是一般靠手工点,没啥自动化方案?
作者回复: 系统测试肯定是有自动化方案的,简单来说,就是把整个系统完全集成起来,然后,向它发消息。这种自动化的成熟程度是很高的,很多测试人员都有现成的方案,所以,我没有在程序员的测试课中做过多的介绍。
2021-08-3021 - Fredo“毕竟像 SQL 这种有复杂逻辑的东西,我们已经有了解决方案。” 这里的解决方案是指什么呢?
作者回复: 在本文的上面讲过了,就是带回滚数据库的解决方案,后面几节课,你会看到具体落实到代码上怎么做。
2021-08-2821 - byemoto如果一个用例需要集成非常多的外部依赖才能做集成测试, 是不是也说明了这个用例的实现本身可能有问题, 比如非核心流程可以考虑用异步消息进行解耦, 以减少依赖?
作者回复: 它好像是系统测试
2021-08-271 - 花花大脸猫老师,您说的单元测试可以理解,集成测试是否理解为对于某一条链路的全量测试,可以是http api对外的或者是mq接受的?还是说粒度只是比单元测试高一些,对其中几个单元测试串接的某一段流程进行集成测试?2022-04-121
- 码农Kevin亮请教老师,集成测试中的断言关注什么?尤其是对于集成测试,有很多接口是没有返回值的,例如一个增删改接口都没有返回值,只能调一次查接口才能拿到返回值。那么是不是每写一个测试用例,都要带一个查接口的操作呢?这是一直困惑我的地方2021-09-1311
收起评论