go test能运行的前提是测试文件以_test.go结尾、与被测代码同包、测试函数为func testxxx(t *testing.t);否则会静默忽略或报“no test files”。

go version 和 go env 能跑通,不等于测试环境就 ready
很多开发者执行 go version 和 go env 都成功了,就以为“环境搭好了”,结果一跑 go test 就报错或静默无输出。根本原因不是 Go 没装好,而是测试文件没满足三个硬性条件:文件名后缀、包名一致性、测试函数签名。
- 测试文件必须以
_test.go结尾(比如math_test.go),不能是test_math.go或math_test - 测试文件和被测源码必须在**同一包**下——即
package main对package main,不能一个写package main,另一个写package math - 测试函数必须是
func TestXxx(t *testing.T)形式,首字母大写的Test+ 驼峰名 + 唯一参数*testing.T;写成testAdd或TestAdd(t int)都会被go test忽略
go test -v 无输出?先检查当前目录和文件可见性
go test -v 什么也不打印,大概率不是命令错了,而是它根本没找到可运行的测试。Go 不会递归扫描子目录,也不会加载非 _test.go 文件。
- 确保你在**被测代码所在目录**执行命令,比如
math.go和math_test.go都在./utils/下,就要cd utils && go test -v - 如果想测整个模块,用
go test ./...(注意是./...,不是./);./只测当前目录,./...才递归所有子包 - Linux/macOS 下注意文件权限:
chmod +r math_test.go,否则go test可能静默跳过 - Windows 用户留意换行符:用 LF(Unix 风格)而非 CRLF,某些旧版工具链对 CRLF 的
_test.go解析异常
覆盖率报告生成失败?coverprofile 路径和 tool 链要配对
go test -coverprofile=c.out 成功但 go tool cover -html=c.out 报错 “no profiles found”,通常是因为 profile 文件没写入,或路径没对上。
-
-coverprofile后跟的文件名是**相对路径**,且默认写入当前目录;如果执行时在项目根目录,但测试文件在internal/子目录,得先进入该目录再跑,否则 profile 里记录的源码路径和实际位置不匹配 - 确保
go tool cover能访问到原始源码:它需要从 profile 中的路径反查文件,若源码被移走或重命名,HTML 就无法高亮 - 不要用
go test -cover单独跑——它只打印百分比,不生成文件;必须显式加-coverprofile=xxx - Windows 上路径含空格(如
C:\My Project\)会导致go tool cover解析失败,建议路径全用短名或移到C:\gocode\这类无空格位置
表格驱动测试写法容易漏掉 t.Parallel() 和子测试命名
表格驱动是 Go 测试主流写法,但两个细节常被忽略,导致并发行为异常或失败定位困难。
- 每个子测试应调用
t.Run("case name", func(t *testing.T) { ... }),名字字符串不能为空或重复;否则go test -run ^TestParse$无法精准过滤,且-v输出里看不到具体哪个 case 失败 - 如果子测试逻辑无共享状态,应在
t.Run函数体内立刻加t.Parallel(),否则所有 case 串行执行,拖慢整体测试速度 - 别在表格循环外 defer 清理资源——比如
defer db.Close()写在for _, tc := range cases外面,会导致所有子测试共用一个连接,可能因竞态失败 - 错误信息里别只写
t.Errorf("failed"),要带上 case 标识:t.Errorf("case %q: expected %v, got %v", tc.name, tc.want, got),不然失败时看不出是哪个输入出问题
go test 默默跳过文件、覆盖率 HTML 打不开、或者表格测试里某个 case 失败却找不到对应输入——这些都藏在命名、路径、作用域和并发控制的缝隙里。golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











