使用 testing 编写单元测试
TestXxx 函数、t.Error、t.Fatal 与 t.Helper
使用 testing 编写单元测试 是 CoddyKit 上的免费 Go Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Go Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Go Academy 课程共包含 4 节课。
testing 包
Go 内置的 testing 包提供了进行单元测试所需的一切:测试函数、失败报告和测试二进制文件。无需外部框架。
测试函数签名
测试函数必须以 Test 开头,接收 *testing.T,并位于文件名以 _test.go 结尾的文件中。
func TestAdd(t *testing.T) {
got := Add(2, 3)
if got != 5 {
t.Errorf("Add(2,3) = %d; want 5", got)
}
}t.Error 与 t.Fatal
t.Error 标记失败后继续执行;t.Fatal 标记失败并立即停止当前测试。如果后续断言依赖于已失败的断言,请使用 Fatal。
运行测试
运行所有测试:go test ./...。运行特定测试:go test -run TestAdd。加入 -v 可输出详细信息。
go test -v -run TestAdd ./...t.Helper
使用 t.Helper() 标记断言辅助函数,使错误消息报告调用方所在的行,而不是辅助函数所在的行。
func assertEqual(t *testing.T, got, want int) {
t.Helper()
if got != want {
t.Errorf("got %d; want %d", got, want)
}
}TestMain
TestMain(m *testing.M) 是可选的入口点,用于在整个测试套件运行前后执行准备和清理工作(例如启动测试数据库)。
func TestMain(m *testing.M) {
setup()
code := m.Run()
teardown()
os.Exit(code)
}使用 t.Run 的子测试
使用 t.Run 将相关用例分组。每个子测试都独立运行,并且可以使用 -run TestFoo/SubcaseName 单独运行。
func TestMath(t *testing.T) {
t.Run("addition", func(t *testing.T) { /* ... */ })
t.Run("subtraction", func(t *testing.T) { /* ... */ })
}测试文件结构
同一包中的测试可以访问未导出的标识符。位于 _test 包中的测试(黑盒测试)只能访问已导出的标识符。
// white-box: package mylib
// black-box: package mylib_testgo test -cover
使用 go test -cover 测量代码覆盖率。要生成详细的 HTML 报告,请运行:go test -coverprofile=c.out ./... && go tool cover -html=c.out。
使用接口进行测试
针对接口设计代码,使测试能够传入伪实现,而无需启动真实服务。
t.Parallel
在测试开头调用 t.Parallel(),将其标记为可以与其他并行测试安全地并发运行,从而加快测试套件的执行速度。
func TestRead(t *testing.T) {
t.Parallel()
// ...
}快速检查
t.Error 与 t.Fatal 有什么区别?
回顾:使用 testing 进行单元测试
要点:
- 测试函数:_test.go 文件中的 TestXxx(t *testing.T)
- t.Error 会继续执行;t.Fatal 会停止测试
- 在辅助函数中使用 t.Helper(),获得清晰的错误行号
- 使用 t.Run 创建子测试;使用 t.Parallel 运行并发测试
常见问题解答
「使用 testing 编写单元测试」课时是免费的吗?
是的 — 「使用 testing 编写单元测试」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Go Academy 课程的其余内容,请升级到 CoddyKit PRO。 Go Academy 课程共包含 4 节课。
「使用 testing 编写单元测试」这节课中我会学到什么?
TestXxx 函数、t.Error、t.Fatal 与 t.Helper 你通过在浏览器中直接运行的动手代码来练习 Go Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Go Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Go Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「使用 testing 编写单元测试」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Go Academy 课中编写并运行代码吗?
能。每节 Go Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 使用 testing 编写单元测试
- 表驱动测试
- 测试替身:模拟对象与存根
- 测试覆盖率与 testify