单元测试

Go 内置测试工具,不需要额外安装测试框架。

测试文件命名规则:

xxx_test.go

测试函数命名规则:

func TestXxx(t *testing.T) {
}

一、被测试代码

创建 calc.go

package calc

func Add(a, b int) int {
	return a + b
}

创建 calc_test.go

package calc

import "testing"

func TestAdd(t *testing.T) {
	got := Add(1, 2)
	want := 3

	if got != want {
		t.Fatalf("Add(1, 2) = %d, want %d", got, want)
	}
}

运行:

go test

运行当前模块所有测试:

go test ./...

二、测试失败时输出

t.Fatalf 会输出错误并停止当前测试:

t.Fatalf("got %d, want %d", got, want)

t.Errorf 会记录错误,但继续执行当前测试:

t.Errorf("got %d, want %d", got, want)

初学阶段用 t.Fatalf 就够了。

三、测试包名

测试文件可以和被测代码同包:

package calc

也可以使用外部测试包:

package calc_test

同包测试可以访问包内未导出的函数和变量。

外部测试包只能访问导出的内容,更接近真实使用方式。

四、常用测试命令

命令作用
go test测试当前包
go test ./...测试当前模块所有包
go test -v显示详细输出
go test -run TestAdd只运行指定测试
go test -cover ./...查看测试覆盖率

五、测试建议

  • 重要业务函数要写测试。
  • 测试名称要表达场景。
  • 不要只测成功,也要测失败。
  • 测试要稳定,不依赖随机顺序和外部环境。

单元测试不是为了凑覆盖率,而是为了保证核心逻辑改动后仍然正确。