
在 Go 项目中,go test 默认只检测当前目录的测试文件;若需递归执行所有子包(如 engine/、api/)中的测试,应使用 go test ./... 命令。
在 go 项目中,`go test` 默认只检测当前目录的测试文件;若需递归执行所有子包(如 `engine/`、`api/`)中的测试,应使用 `go test ./...` 命令。
Go 的测试机制以包(package)为单位组织,go test 不会自动遍历子目录——这是设计使然,而非限制。当你在项目根目录(即包含 main.go 的 /project)直接执行 go test 时,它仅检查该目录下是否有以 _test.go 结尾的测试文件和 func TestXxx(*testing.T) 形式的测试函数;而你的测试文件很可能分布在 engine/ 和 api/ 等子包中,因此返回 [no test files]。
✅ 正确做法:使用通配符 ...(三点号),它表示“当前目录及其所有子目录下的所有包”:
cd /project go test ./...
该命令将递归发现并运行 engine/, api/, 甚至嵌套更深(如 api/v1/)中所有符合 Go 测试规范的包。输出类似:
ok /project/engine 0.123s ok /project/api 0.456s ? /project [no test files] # 根目录无测试,忽略即可
⚠️ 注意事项:
- ./... 中的 ./ 明确限定从当前目录开始搜索,避免意外匹配到 $GOPATH 或模块外路径;
- 若项目含 vendor/ 目录且不希望测试其中第三方代码,可排除:
go test $(go list ./... | grep -v '/vendor/')
- 对于大型项目,建议添加 -v(显示详细日志)和 -count=1(禁用缓存,确保每次真实执行)提升可调试性:
go test -v -count=1 ./...
? 进阶提示:
- 如需持续集成或高频测试,可考虑轻量工具 gt(由 Go 团队成员维护),它为 go test 增加增量编译与结果缓存能力;
- 后续补充单元测试时,推荐同步启用覆盖率分析:go test -coverprofile=coverage.out ./... && go tool cover -html=coverage.out -o coverage.html,直观查看哪些逻辑分支尚未被测试覆盖。
掌握 ./... 是 Go 工程化测试的第一步——简洁、标准、无需额外依赖,也是绝大多数 Go 项目 CI 脚本的默认实践。











