能测,但必须用同包测试——测试文件需与源码同目录、同包名(如package mylib),且文件名以_test.go结尾、函数名为func TestXxx(t *testing.T);小写函数helper仅同包可调,改大写或跨包调用均不推荐。

能测,但必须用同包测试——不是“能不能”,而是“怎么组织文件和包名”。
为什么 func helper() 在测试里报 undefined
根本原因不是函数写错了,是测试文件没和源码在同一个包里。Go 的访问控制发生在编译期,helper 这种小写开头的函数,只有同一包内的代码能调用。如果你的测试文件写了 package mylib_test,哪怕它和 mylib.go 放在同一目录,也进不了 mylib 包,自然看不到 helper。
- 错误做法:文件叫
mylib_test.go,但包声明是package mylib_test - 正确做法:文件叫
mylib_test.go,包声明必须是package mylib(和源码完全一致) - IDE 自动生成测试文件时,默认常设成
_test后缀包,记得手动改包名 - go test 不会帮你修正包名,也不会报错提示“你包名不对”,只会静默跳过调用
go test 找不到你的 Test 函数?先看文件名和函数签名
Go 不靠注解或配置识别测试,只认硬规则:文件必须以 _test.go 结尾,函数必须是 func TestXxx(t *testing.T) 形式,且不能有返回值、不能多参数。
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
- 无效名字:
testHelper、Test_helper、HelperTest、func TestHelper(t *testing.T) int - 有效名字:
func TestHelper(t *testing.T),文件名mylib_test.go - 如果
go test -v什么都没输出,先运行go list -f '{{.TestGoFiles}}' ./确认文件是否被识别为测试文件 - 别在测试函数里写
log.Fatal或裸panic,整个go test进程会退出,其他测试全丢
要不要把 helper 改成 Helper 来测?
不推荐。导出一个仅用于测试的函数,等于把它钉死在 API 表面,后续重构成本陡增。真正该问的是:这个函数有没有被某个导出函数调用?它的逻辑是否值得单独验证?
立即学习“go语言免费学习笔记(深入)”;
- 如果
helper只被Add调用,那优先测Add的各种边界输入,覆盖helper的行为路径 - 如果它确实承担关键逻辑(比如 token 解析、状态校验),又没被导出函数充分覆盖,那就留在同包里直接测
- 临时改成大写测完再改回去?开发机上可以,但禁止提交到 git —— CI 会把这当成真实 API 变更
- 反射或
//go:linkname强行调用?1.21+ 已限制,且结果不可靠;不是“能不能”,是“不该用”
最易被忽略的一点:测试文件必须和被测源码在**同一目录**,不能放在 internal/、testdata/ 或子目录里,否则 go test 默认跳过。哪怕包名对了、函数名对了、文件名对了,路径错一层,就彻底失效。

















