持续集成应纳入哪些测试类型?CI与CD测试阶段划分咨询
嘿,这个问题真的戳中了很多团队在搭建CI/CD流水线时的纠结点——到底哪些测试该往CI里塞,哪些又该留给CD?结合我在多个项目里的实践经验,来给你掰扯清楚~
首先得明确:CI的核心目标是快速给开发者反馈——代码一提交,就能立刻知道有没有问题,别让bug藏到后续环节;而CD的目标是确保能安全、稳定地部署到生产环境,所以可以承载更重、更全面的验证。所有测试的摆放,都要围绕这个差异来权衡。
单元测试:CI的绝对核心
单元测试是最快、最稳定的测试类型,每次代码提交(不管是PR还是分支推送)都必须跑它。它能快速揪出单个函数、模块的逻辑问题,是阻止bug流入后续环节的第一道防线。CI的核心目标就是“快速反馈”,单元测试完美契合这个需求,必须作为CI流水线的第一道关卡,不通过直接打回,不让代码合并。集成测试:分轻重,灵活安排
集成测试要看“重量”:- 轻量集成测试(比如模块间的接口调用,不依赖外部数据库、第三方服务,只用mock):完全可以放进CI,因为速度快,能发现单元测试覆盖不到的模块协作问题,补充测试深度。
- 重集成测试(需要连接真实数据库、调用第三方服务,或者多个服务联动):如果跑起来耗时超过5-10分钟,那更适合放在CD的早期阶段。毕竟CI如果跑太久,开发者等不及反馈,反而会降低效率。但如果你的团队有足够的并行测试资源,能把这类测试的耗时压下来,放进CI也没问题。
API测试:看测试范围,对应摆放
API测试其实算是集成测试的一个分支:- 单服务的API测试(只测当前服务的接口,外部依赖用mock):属于轻量范畴,放CI里没问题,能快速验证接口的输入输出是否符合预期。
- 端到端的API测试(跨多个服务的完整流程,比如“用户下单→支付→通知”全链路):这类测试耗时久、依赖多,更适合放在CD阶段,确保整个系统的协作流程没问题后再部署。
UI测试:大部分留给CD,轻量组件测试可放CI
UI测试普遍存在“慢、不稳定”的问题——比如模拟用户点击、跳转,跑一次可能要十几分钟,还容易因为环境波动失败。所以全量的端到端UI测试(比如用Cypress、Playwright测整个页面流程)通常放在CD阶段,比如代码合并到主分支后,触发CD时再跑。
但如果是组件级UI测试(比如用React Testing Library测单个按钮、表单的渲染和交互),这类测试速度快、稳定,完全可以归到轻量集成测试里,放进CI环节。
很多成熟团队的典型流程是这样的:
- CI阶段(PR提交时):
- 静态代码检查(比如ESLint、SonarQube)
- 单元测试全覆盖
- 轻量集成/组件UI测试
- 单服务API测试
- CD阶段(合并到主分支后):
- 全量集成测试(依赖真实环境)
- 端到端API全链路测试
- 全量UI端到端测试
- 部署到预发布环境
- 预发布环境冒烟测试
- 部署到生产环境
没有绝对的“必须放哪”的规则,核心是平衡反馈速度和测试覆盖度。如果你的CI机器够强、测试能并行跑,把更多测试提前到CI里,能更早发现问题;如果CI资源有限,那就把重测试往后放,保证CI能快速给开发者反馈。
内容的提问来源于stack exchange,提问作者LittleJohnny




