自动化测试66 条

CI 测试缓存

CI 里缓存依赖与工具链能缩短测试准备时间:缓存键用「操作系统加锁文件哈希」,区分只读缓存(PR)与回写缓存(主分支);测试结果的用例级缓存需要评估正确性风险。

软件测试速查开发更新于 2026-10-13

缓存什么最划算

CI 测试提速的缓存分三层:依赖(npm、pip、Maven 本地库)、工具运行时(Playwright 浏览器、构建产物)、构建层(编译输出、Docker 层)。核心是 key 设计——以锁文件的哈希为主键,锁文件一变缓存自动换代。错误缓存的代价比不缓存更高:过期依赖会制造「幽灵失败」。把命中率当指标持续观察,异常波动时先查缓存再查代码。

基本信息

依赖缓存npm、pip、Gradle 缓存目录,key 用锁文件哈希
浏览器缓存Playwright 浏览器二进制目录,避免每次重新下载
构建缓存编译中间产物、Docker 分层,跨作业复用
key 设计锁文件哈希加平台与版本前缀,示例见下方片段
恢复策略精确 key 未命中时按前缀回退,兼容小版本更新
风险陈旧依赖、被污染的半成品缓存、跨平台二进制混用

缓存片段示例

缓存片段示例
- uses: actions/cache@v4
  with:
    path: ~/.cache/ms-playwright      # 缓存浏览器二进制
    key: pw-${{ runner.os }}-${{ hashFiles('package-lock.json') }}
    # 锁文件变化时 key 自动失效,避免旧依赖引发幽灵失败

典型使用场景

  • 依赖安装提速:三分钟压到二十秒,流水线周转明显变快
  • 浏览器准备提速:几百 MB 的浏览器只下载一次
  • monorepo 构建复用:编译缓存跨作业共享
  • PR 与主干预热分离:防止不可信代码污染主干缓存
  • 命中率监控:命中率骤降说明 key 设计或环境有变动

缓存对象与 key 依据

对象典型路径key 依据
npm~/.npm 或 node_modulespackage-lock.json 哈希
pip~/.cache/piprequirements 文件哈希
Playwright~/.cache/ms-playwright版本加锁文件哈希
Gradle~/.gradle构建脚本与版本哈希
缓存里放构建产物要格外小心:key 没跟着代码变,旧产物被复用的「假绿」比失败更危险。
PR 作业默认只读主干缓存不写:不可信代码不污染公共缓存,这是平台的常见策略,利用好它。
缓存体积要控制:拉取比重建还慢的缓存属于负优化,大对象考虑按需裁剪。

易错点

  • key 不含锁文件哈希:依赖升级后仍命中旧缓存,幽灵失败排查数天
  • 缓存 node_modules 且 key 过粗:跨平台与跨版本二进制混用,报错千奇百怪
  • 构建产物缓存 key 与代码脱钩:旧产物假绿,问题留到发布才现形
  • 缓存无限增长不清理:磁盘告警与拉取变慢,定期设置过期策略
  • 依赖与产物挤在同一个缓存 key:任何一方更新都迫使全部重建,拆开粒度各管各的

数据来源与参考

  • GitHub Actions 文档:Caching dependencies(docs.github.com)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌