
在 Go 项目中,go test 默认只运行当前目录下的测试文件;若需递归执行所有子包(如 engine/、api/)中的测试,应使用 go test ./... 命令。
在 go 项目中,`go test` 默认只运行当前目录下的测试文件;若需递归执行所有子包(如 `engine/`、`api/`)中的测试,应使用 `go test ./...` 命令。
Go 的测试机制基于包(package)维度,而非文件或目录树结构。当你在项目根目录(即包含 main.go 的 /project)直接执行 go test 时,Go 仅检查该目录下是否存在以 _test.go 结尾的测试文件及对应的 package xxx_test 声明——而你的测试文件实际位于 engine/ 和 api/ 子目录中,因此返回 [no test files]。
✅ 正确做法:使用通配符 ...(三点操作符),它表示“当前目录及其所有子目录中的所有 Go 包”:
cd /project go test ./...
该命令会自动发现并依次运行:
- ./engine 下的所有测试(如 engine/service_test.go)
- ./api 下的所有测试(如 api/handler_test.go)
- 以及未来新增的任意子包(如 ./utils、./models)中的测试
? 补充技巧:
-
排除特定目录(如 vendor 或 cmd):
go test $(go list ./... | grep -v '/vendor\|/cmd')
-
启用详细输出与覆盖率统计(推荐日常开发):
go test ./... -v -coverprofile=coverage.out && go tool cover -html=coverage.out -o coverage.html
- 加速重复测试:可考虑使用社区工具 gt(需 go install rsc.io/gt@latest),它为 go test 添加了增量缓存和并行优化能力。
⚠️ 注意事项:
- 确保每个子包的测试文件名以 _test.go 结尾,且包声明为 package xxx_test(与被测包同名加 _test 后缀,或保持原包名但置于独立测试包中);
- main.go 所在的主包(package main)通常不写单元测试,测试应集中在 engine/、api/ 等可复用逻辑包中;
- 避免在测试文件中导入 main 包——这会导致编译失败。
掌握 ./... 是 Go 工程化测试的第一步,它让 CI/CD 流水线、本地全量验证和覆盖率统计变得简洁可靠。


















