必须同时启用 --tests 参数并清空 skip-files,才能让 golangci-lint 检查 _test.go 文件;推荐仅开启 staticcheck、gosimple、unused 三个低误报 linter,并针对性调低 errcheck 和 govet 在测试中的敏感度。

怎么让 golangci-lint 检查 _test.go 文件
默认不检查测试文件,不是 bug,是设计如此——因为很多 linter(比如 govet 的 shadow、errcheck 对 t.Fatal 的误报)在测试上下文中天然高误报。想让它真干活,必须同时满足两个硬条件:--tests 参数 + 清空 skip-files。
-
golangci-lint run --tests是开关,没它,配置里写死也不生效 -
skip-files: []或显式删掉.*_test\.go这类正则,否则仍被跳过 - 多 module 项目中,每个 module 的
.golangci.yml都得单独加tests: true,根目录配置不继承
哪些 linter 真正适合开在测试文件里
全量启用只会拖慢 CI、灌水告警。实际项目中,只推荐这 3 个: staticcheck、gosimple、unused。它们在测试代码里误报率低、问题价值高。
-
staticcheck:能抓到json.Unmarshal类型错配、time.After在 for 循环里滥用——这些在线上和测试里都是真实风险点 -
gosimple:识别冗余断言,比如if !ok { t.Fatal() }可简化为require.True(t, ok);但别和staticcheck同时开,二者重叠高 -
unused:清理测试里废弃的var tt testCase、未调用的benchTest函数,技术债务肉眼可见
怎么调低误报率,特别是测试场景下
直接开 errcheck 或 govet 到测试文件里,大概率会炸出一堆无效告警。必须针对性压低敏感度:
-
errcheck:禁用对测试函数的检查,用errcheck: check-exported: false或exclude-functions: ["t.Fatal", "t.Fatalf", "log.Fatal"] -
govet:关掉shadow(for _, tt := range tests常误报),配置为govet: enable-all: true; disable: ["shadow"] - 别碰
revive或gofmt的测试专用规则——前者规则太碎难收敛,后者格式化测试代码无实质收益
CI 环境容易漏读配置的坑
本地 golangci-lint run 通常自动加载 .golangci.yml,但 CI(GitHub Actions / Jenkins)经常因工作目录切换、缓存或 GOPATH 差异导致配置失效。最稳妥的做法是显式指定:
立即学习“go语言免费学习笔记(深入)”;
- 在 CI 脚本里写全路径:
golangci-lint run --config .golangci.yml --tests - 确认
golangci-lint版本 ≥ v2.12.2(修复了gomodguard_v2 blocked配置问题) - 如果项目用了 Go modules,确保
go: "1.23"或更高版本声明在.golangci.yml的run区块里,否则部分新 linter(如copyloopvar)可能静默不生效
skip-files 就够了,结果 --tests 漏掉,整个配置形同虚设。


















