
Go 1.9+ 默认忽略 vendor 目录,直接使用 go test ./... 即可安全运行项目内全部测试文件,无需额外过滤或正则匹配。
go 1.9+ 默认忽略 vendor 目录,直接使用 `go test ./...` 即可安全运行项目内全部测试文件,无需额外过滤或正则匹配。
在 Go 项目中批量运行测试是日常开发和 CI 流程中的关键操作。你可能希望覆盖 component/、service/、driver/、worker/ 等所有子模块中的 *_test.go 文件,但明确排除 vendor/ 下的第三方依赖测试——这不仅避免冗余执行、节省时间,更能防止因依赖包测试失败而中断构建。
幸运的是,自 Go 1.9 起,go test ./... 的递归模式已内置对 vendor/ 目录的自动排除机制(遵循 Go vendoring 规范)。这意味着:
go test ./...
将递归遍历当前目录下所有非 vendor 的子包(包括 ./component, ./service/xxx, ./worker/internal 等),并为每个含测试文件的包执行 go test。它不会进入 ./vendor,也不会尝试编译或运行其中的任何测试——无需手动排除、无需正则、无需 shell 脚本拼接路径。
⚠️ 注意事项:
- ✅ 推荐方式:
go test -v ./...(加-v查看详细输出)或go test -race ./...(启用竞态检测)。 - ❌ 避免
go test ./*:该写法会将顶层目录下的每个子目录(如Makefile,README.md)也作为包路径尝试加载,导致can't load package: package ... is not a main package或no Go files等错误。 - ❌ 不要依赖
-run过滤 vendor:-run仅匹配测试函数名(如TestHTTPHandler),而非文件路径或包路径,无法用于排除目录。 - ✅ 若需进一步限制范围(例如跳过集成测试包),可显式列出目标包:
go test ./component/... ./service/... ./driver/...
- ? 补充验证:可通过
go list ./...预览实际被扫描的包列表(vendor/不会出现其中)。
总结:升级至 Go 1.9+ 后,go test ./... 就是最简洁、最可靠、最符合 Go 工具链设计意图的解决方案。无需 hack,无需外部工具,开箱即用。










