Go自带的testing包testing包是官方内置的无需额外安装也是大多数项目的首选。1单元测试测试文件必须以_test.go结尾例如calc_test.go测试函数必须以Test开头推荐写成Test函数名更直观测试函数签名固定func TestXxx(t *testing.T)不能有返回值测试函数内部用t.Errorf/t.Fatal等方法输出错误t.Errorf标记测试失败但继续执行后面的测试代码。t.Fatal标记测试失败并立即中止当前测试函数。# 执行当前目录下所有 *_test.go 文件 go test -v # 只执行指定文件中的测试 go test -v calc_test.go calc.go # 执行指定的测试函数-count1 表示禁用缓存强制重新运行 go test -v -run TestAdd calc_test.go calc.go -count1更详细的参数请参考Go test命令行参数2性能测试文件命名和单测一样文件必须以_test.go结尾这样go test才能识别。函数命名基准测试函数要以Benchmark开头且必须是导出函数比如BenchmarkAdd。函数签名基准测试函数必须接收一个*testing.B类型的参数不能有返回值。重置计时器b.ResetTimer()用来清空前面初始化代码的耗时保证只统计真正的测试部分。循环执行基准测试里要用for i : 0; i b.N; i { ... }被测的代码放在循环里。b.N 的作用Go 框架会自动调整b.N让测试至少运行 1 秒左右这样结果更稳定。最终输出的是平均每次运行的耗时比如0.25 ns/op表示每次 0.25 纳秒。在calc文件夹的calc_test.go文件中新增BenchmarkAbs和BenchmarkAdd方法。基准测试的目标就是尽可能准确地衡量一段代码的性能包括运行时间、内存分配等。核心思路同一段代码运行很多次b.N次用「总耗时 ÷ b.N」算出平均每次执行的耗时。b.N 的作用b.N由 Go 测试框架自动决定会动态调整保证测试至少运行 1 秒左右避免样本太少导致结果不准。运行过程当执行go test -bench.时框架会先用很小的b.N比如 1、2、5、19试跑几次估算耗时再逐步增大b.N直到结果稳定。输出示例比如报告里写1000000000 0.25 ns/op意思是运行了 10 亿次每次平均耗时 0.25 纳秒。# 运行所有基准测试 go test -bench. # 运行所有基准测试并显示内存分配情况 go test -bench. -benchmem # 只运行基准测试不运行单元测试 go test -runnone -bench. # 指定测试时间 go test -bench. -benchtime3s # 指定运行轮数 go test -bench. -count3 # 组合使用多种参数 go test -runnone -bench. -benchmem -benchtime3s -count32、GoConveyhttps://github.com/smartystreets/goconveyGoConvey 是一款专门为 Golang 打造的测试框架它不仅能帮你更方便地组织和运行单元测试还自带了丰富的断言方法让测试代码更简洁直观。更酷的是它还支持 Web 界面只要在项目里写好测试用go test命令就能照常运行如果你想要更直观的体验可以直接运行goconvey然后在浏览器里访问 http://localhost:8080就能看到实时的测试结果展示。相比起纯粹使用标准库的testing包Convey 让单元测试的书写和阅读都更流畅尤其适合需要频繁跑测试、调试逻辑的开发过程。1安装依赖go get github.com/smartystreets/goconvey2demo3、testifyTestify 是 Go 语言生态里非常常用的一个断言风格测试框架。它不仅提供了开发者最常用的断言方法让测试代码更简洁、可读性更强还额外封装了三个核心功能模块Assertions断言内置了丰富的断言方法避免重复编写样板式判断逻辑。Suite测试套件支持将一组相关测试组织在一起方便共享初始化、清理等逻辑。Mock模拟提供强大的 Mock 能力方便在单元测试中模拟依赖对象或外部接口。借助 Testify我们可以用更接近自然语言的方式编写测试不仅提高开发效率也让测试结果更易于理解。官方文档https://godoc.org/github.com/stretchr/testify1依赖安装go get -u -v github.com/stretchr/testify2测试用例① assert包提供了断言工具在执行时会将case标记为失败但程序不会退出而是继续往下执行。package testify import ( testing github.com/stretchr/testify/assert ) func Test_assert(t *testing.T) { a : 2 b : 3 // 第一个断言失败故意写错期望值 assert.Equal(t, 6, ab, 第一个断言23应该等于5不是6) // 程序继续执行下面的断言 t.Log(这行代码被执行了说明程序没有中断) // 第二个断言通过 assert.Equal(t, 5, ab, 第二个断言23应该等于5) // 第三个断言也会执行 assert.True(t, a b, 第三个断言2应该小于3) t.Log(所有断言都已执行完毕) }