go测试环境开箱即用,关键在于遵守三规则:测试文件名必须为_test.go、与被测代码同目录同包;测试函数须以test开头、首字母大写、唯一testing.t参数;运行需加-v等参数确认执行。

go test 命令开箱即用——只要你项目结构合规,就能直接跑测试。所谓“配置环境”,其实是避开几个高频误操作。
测试文件名和位置必须严格匹配
Go 不认目录名、不认包名别名、不认自定义入口,只看两个硬规则:_test.go 后缀 + 和被测代码**同一目录、同一包**。
- 错例:
test/calculator_test.go→go test完全忽略(它不是当前包) - 错例:
calculator_tests.go或test_calculator.go→ 文件名不合法,不参与构建 - 错例:把
calculator.go放pkg/math/,测试却放test/math/→ 包不一致,编译失败或报no buildable Go source files - 正例:
calculator.go和calculator_test.go都在./下,且都声明package main(或同名包)
测试函数签名不能有任何偏差
go test 会扫描所有 *testing.T 参数的函数,但前提是函数名以 Test 开头、首字母大写、仅接收一个参数。
- 错例:
func testAdd(t *testing.T)→ 小写开头,不识别 - 错例:
func TestAdd(t *testing.T, debug bool)→ 多参数,编译报错too many arguments - 错例:
func TestAdd(t testing.T)→ 缺*,类型不匹配 - 正例:
func TestAdd(t *testing.T),哪怕里面什么都没写,也能被发现并执行(只是立刻 PASS)
运行命令要带对参数,否则等于没跑
go test 默认行为极其保守:不递归、不显式输出、不生成覆盖率、不重编译。你看到“PASS”不代表真跑了测试。
- 加
-v:显示每个Test*函数名和日志,否则静默通过(尤其容易误判空测试) - 批量跑子目录:用
go test ./...(注意是./...,不是./),后者只扫当前目录 - 想确认是否真加载了测试:临时在
Test*函数里加t.Log("hit"),再跑go test -v看有没有输出 - 改了代码后必须重新执行
go test,它不会自动 rebuild —— 没有监听、没有热重载
依赖外部资源的测试要主动隔离
数据库、HTTP 调用、时间、标准输入这些,一旦写进 Test* 函数,就大概率导致测试不可靠或无法复现。
- 不要在测试里启动真实
sql.Open("postgres", ...),除非你明确加了-tags=integration并单独管理 - HTTP 请求用
httptest.Server替代硬编码http.Get("http://localhost:8080") - 读取用户输入?把
os.Stdin抽成io.Reader参数,测试时传strings.NewReader("YES\n") - 时间敏感逻辑?接受
now func() time.Time作为参数,测试时传func() time.Time { return fixedTime }
go test 没反应,或者 go test -v 显示 “no tests to run”。这时候优先检查文件名、包名、函数签名——三者错一个,整个测试就掉链子。golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











