go test ./ 是 goland 一键运行全部测试的底层命令,它递归执行 engine/、api/、internal/ 等所有子目录下的 *_test.go 文件,而默认“run all tests”仅基于当前上下文运行,易遗漏包。

go test ./ 是 GoLand 里真正“一键运行全部测试”的底层动作
GoLand 的图形界面操作(比如点击菜单或工具栏按钮)最终调用的还是 go test 命令。它不会 magic 地绕过 Go 原生行为——所以关键不是 IDE 按钮,而是你触发时实际执行的命令是否覆盖全部子包。默认点击“Run All Tests”按钮,GoLand 会尝试在当前包上下文运行测试;若你在根目录打开项目但没显式指定范围,它大概率只跑 main 包(往往没有测试),结果就是 ? /project [no test files]。
真正可靠的做法是:确保终端或 Run Configuration 中明确使用 go test ./。这个 ./ 才是递归发现 engine/、api/、internal/ 等所有子目录下 *_test.go 文件的开关。
- 在 GoLand 终端中直接执行:
go test ./ - 在 Run Configuration 里手动把 Command line 设置为:
go test ./ - 避免只写
go test或go test .(单点),它们都不递归
在 GoLand 里配置永久性的“全部测试”运行配置
每次手动敲命令太慢?你可以建一个永久 Run Configuration,绑定到快捷键,实现真正的一键触发。
步骤很简单:
- 点击右上角的运行配置下拉框 → “Edit Configurations…”
- 点左上角
+→ 选择 “Go Test” - 在 “Package” 字段填:
./(注意是斜杠,不是点) - 勾选 “Include subdirectories”(GoLand 2023.3+ 默认已关联此选项,但建议确认)
- 加常用参数提升实用性:
-v -count=1 -coverprofile=coverage.out
保存后,下次就能用快捷键(如 Ctrl+Shift+F10)直接运行全部测试,且结果带覆盖率输出。
为什么有时点了“Run All Tests”却只跑了部分包?
这是 GoLand 的“当前上下文”逻辑导致的常见误判。它会根据你当前打开的文件、光标位置、甚至 Project Tool Window 中选中的节点,自动推断要测试的 package 范围。
GoLand 2026.1.1 是 2026.1 发布后的首个维护修正版本,适合已经开始体验 2026.1 新功能并希望同步补丁的开发者。它更适合用于入门项目、现有项目迁移测试和 IDE 行为验证。
典型陷阱包括:
- 你在
main.go文件里按了运行 → 它只试main包(而main包不能写测试) - 你在
engine/xxx_test.go里右键 → 它只跑engine包,忽略api/和pkg/ - 项目没正确识别为 Go Module(缺少
go.mod)→go test ./行为异常,甚至报no Go files in
解决办法就一条:别依赖自动推断。手动建一个指向 ./ 的配置,或者养成习惯——进终端,敲 go test ./。
排除 vendor 或 testdata 目录的实操写法
大型项目常含 vendor/ 或 testdata/,它们可能有测试文件但不该被 CI 或日常执行覆盖。GoLand 本身不提供图形化排除路径,得靠 shell 组合。
推荐在 Run Configuration 的 “Command line” 中写成:
go test $(go list ./ | grep -v '/vendor$\|/testdata$')
注意几点:
-
go list ./输出所有本地包路径,每行一个 -
grep -v排除以/vendor或/testdata结尾的路径($防止误杀vendorized这类词) - Windows 用户需改用 PowerShell 或 WSL,原生命令不支持命令替换
- Go 1.21+ 的
-exclude仍是实验性功能,不建议在 CI 中依赖
真正容易被忽略的是:go test ./ 不会进入 vendor/,但如果你用 go list 构造参数,就必须显式排除——因为 go list ./ 会把 vendor/ 下的包也列出来。










