0Pricing
Go Academy · 课时

使用 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_test

go 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 使用 testing 编写单元测试
  2. 表驱动测试
  3. 测试替身:模拟对象与存根
  4. 测试覆盖率与 testify
← 返回 Go Academy