首次执行Golang测试速度过慢的优化方案咨询
如何加快Go首次测试的运行速度
这确实是Go构建缓存带来的差异——第一次执行测试时,Go需要编译测试代码、依赖包,还要完成模块初始化等一系列工作,第二次直接复用缓存的编译成果,所以速度快很多。针对CI环境没有缓存的场景,你可以试试这些方法来优化首次测试的速度:
预编译测试二进制文件
把编译测试代码和执行测试的步骤分开,先用go test -c编译出测试二进制,之后直接运行这个二进制文件。这样测试阶段就不用再经历编译过程,能大幅缩短耗时:# 编译测试二进制到指定文件 go test -c -o add_test ./internal # 运行测试(带-v参数看详细输出) ./add_test -test.v提前预安装依赖
使用go test -i参数可以提前安装测试所需的依赖包,虽然在Go Modules时代这个命令的作用有所弱化,但在首次运行时还是能减少一些初始化开销:# 预安装测试依赖 go test -i ./internal # 执行测试 go test -v ./internal在CI中缓存模块目录
很多CI平台支持缓存Go的模块缓存目录(默认路径是$GOPATH/pkg/mod或$HOME/go/pkg/mod),即使没法缓存测试构建产物,缓存依赖模块也能避免每次CI都重新下载依赖,节省不少时间。比如在GitHub Actions、GitLab CI里都有对应的缓存配置方式,能有效减少首次运行的依赖拉取时间。精简测试与依赖
检查你的internal包和测试代码,确保只引入必要的依赖,移除不必要的代码或依赖包。更少的依赖意味着更快的编译速度,自然能缩短首次测试的耗时。
另外要注意,Go首次测试的初始化和编译开销是无法完全消除的,但通过上面的方法,能把这些开销尽可能降低,让CI环境下的首次测试速度更接近本地有缓存的情况。
内容的提问来源于stack exchange,提问作者nono




