golangci-lint默认跳过_test.go文件是为避免高误报,启用检查需同时满足两个条件:清空run.skip-files并显式添加--tests参数或配置run.tests: true。

为什么_test.go 文件默认不被检查
golangci-lint 默认跳过所有 _test.go 文件,这不是遗漏,而是有意为之。因为很多 linter 在测试上下文中天然高误报:比如 errcheck 会把 t.Fatal、log.Fatal 当作未处理错误;govet 的 shadow 检查会在 for _, tt := range tests 中误报变量遮蔽;staticcheck 可能警告测试中故意使用的弃用 API(如 time.Sleep)。直接开全量检查,结果不是发现问题,而是淹没真实问题。
启用测试文件检查必须同时做两件事
只改配置或只加参数都不行,缺一不可:
- 清空
run.skip-files或显式移除对.*_test\.go的排除(不能留默认值) - 命令行必须带
--tests参数,或在配置中设run.tests: true
例如,在 .golangci.yml 中:
run: skip-files: [] # 必须为空数组,不能注释掉或留默认值 tests: true # 显式开启测试文件扫描
如果只配了 tests: true 但 skip-files 里还含 .*_test\.go,照样跳过。
立即学习“go语言免费学习笔记(深入)”;
针对性调低易误报 linter 的敏感度
开启测试扫描后,立刻要处理的是误报。重点调以下三个:
-
errcheck:禁用对测试函数的检查,加配置errcheck: check-exported: false,或更细粒度地用exclude-functions: ["t.Fatal", "t.Fatalf", "log.Fatal", "log.Fatalf"] -
govet:关掉容易在测试中误报的shadow,写成govet: disable: ["shadow"](不用开enable-all) -
staticcheck:它本身对测试较友好,但若发现误报弃用 API,可用staticcheck: checks: ["all,-SA1019"]临时屏蔽 SA1019 规则(即“使用了弃用符号”)
别碰 unused ——测试里未使用的变量/函数本就该报,这是有效提示。
CI 和本地行为要一致,但 IDE(如 GoLand)默认不扫_test.go
GoLand 的静态分析默认不启用 --tests,即使你配了 .golangci.yml 并勾选了所有 linter,编辑器里也不会标出测试文件的问题。这是设计限制,不是配置错误。真要实时看到,只能:
- 在终端手动跑:
golangci-lint run --tests - 或在 CI 脚本里固定加
--tests,并确保缓存路径(GOLANGCI_LINT_CACHE)稳定,否则每次重扫极慢
最常被忽略的一点:--tests 不是“开关”,它是扫描范围修饰符——没它,skip-files: [] 也白搭;有它,但 linter 配置没调松,就会被误报刷屏。二者必须协同调整。


















