1. 什么是集成测试
集成测试就是把已经分别测试过的模块、服务或组件按照真实运行方式连接起来,验证他们能不能正确协作。单元测试像检查每个零件,集成测试看零件在装到一起之后,接口、数据、时序和异常处理是否走得通。许多故障只在连接处出现,所以接下来需要讲清它主要解决的是什么问题、通常怎么做、覆盖哪些风险,以及它和单元测试、端到端测试的边界。
2. 单元与集成测试的区别
单元测试关注一个函数、一个类或者一个小模块内部的逻辑;而集成测试则关注多个单元之间的交互。它检查的范围通常包括接口参数、返回格式、数据库读写、缓存、消息队列、文件系统、第三方服务权限校验以及第三方配置加载。集成测试不纠结某个函数内部算法是否完美,而是确认上游模块交给下游模块的数据,下游能不能正确地接住并很好地处理。
3. 为什么需要集成测试
因为在单个模块测试时,外部依赖常常被模拟掉,上游可能输出日期文本,下游却期待时间戳。上游认为字段叫做用户编号,下游却按照用户标识来读取。事务边界、超时重试、重复消息、并发写入、错误码含义也只有在真实连接中才能够暴露出来。模块内部单元测试都通过,可能在组合之后也会有新的问题出来,所以这也就是集成测试的价值。
4. 集成测试策略
集成测试并不等于一次性把所有的模块都连接起来。常见的策略有自顶向下、自底向上、三明治以及一次性组装。更稳妥的做法是从关键业务路径开始,逐步接入真实依赖,比如先打通订单服务和库存服务,再接入支付、消息队列和数据库。第三方系统不方便直接调用时,可以使用沙箱环境,或者用契约测试确认双方的约定没有改变。测试数据要能够隔离、能够清理,否则前一个用例会污染后一个用例。
5. 集成测试验证什么
第一是接口契约,字段、顺序、类型、版本、错误码是否一致。
第二是数据流,数据从上游到下游,最终状态是否正确。
第三是时序与并发,调用时序、超时、重试、幂等、锁和事务是否可靠。
第四是异常路径:下游不成功、部分成功、回滚失败、消息重复时,系统会不会留下脏数据,只测试正常路径那么集成测试的效果就会减半。
在工程项目实践中,集成测试通常放在持续集成的流水线当中,开发提交代码后,运行一组精选场景,断言不能只看接口返回成功,还要检查数据库最终状态、消息是否发出、下游是否收到日志和追踪标识是否串起整套链路,这样失败时才能快速定位是哪儿的链接出了问题,而不是只知道系统不可用,也要理解它的边界。
集成测试比单元测试更慢,环境更加复杂,维护成本更高,所以不适合穷举所有组合。一般的策略是单元测试覆盖所有逻辑,而集成测试少而精覆盖高风险接口和跨模块链路。
端到端测试更少,它只验证最为核心的用户旅程。
6. 常见的错误
常见的是到处模拟依赖,结果没有真正集成,或者共用一套脏环境,让用例互相干扰,又或者认为有了端到端测试,就不需要集成测试。
7. 总结
集成测试是在模拟真实的连接环境下,验证模块之间能否正确交换数据、遵守约定、处理异常,它要尽早回答一个问题:每个零件都通过了,装到一起还能不能稳定工作。模块单独通过只是起点,合起来跑通关键路径才算是真正降低了系统风险。