You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

持续集成应纳入哪些测试类型?CI与CD测试阶段划分咨询

嘿,这个问题真的戳中了很多团队在搭建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提交时)
    1. 静态代码检查(比如ESLint、SonarQube)
    2. 单元测试全覆盖
    3. 轻量集成/组件UI测试
    4. 单服务API测试
  • CD阶段(合并到主分支后)
    1. 全量集成测试(依赖真实环境)
    2. 端到端API全链路测试
    3. 全量UI端到端测试
    4. 部署到预发布环境
    5. 预发布环境冒烟测试
    6. 部署到生产环境
最后说句实在话

没有绝对的“必须放哪”的规则,核心是平衡反馈速度测试覆盖度。如果你的CI机器够强、测试能并行跑,把更多测试提前到CI里,能更早发现问题;如果CI资源有限,那就把重测试往后放,保证CI能快速给开发者反馈。

内容的提问来源于stack exchange,提问作者LittleJohnny

火山引擎 最新活动