go test # 最基础的使用方式,测试一个Package
/magic_math/basic.go
package magic_math import ( "math/rand" "time" ) func Add(x, y int32) int32 { r := rand.New(rand.NewSource(time.Now().UnixNano())) if x == 0 && y == 0 { return int32(r.Intn(2)) } else { return x + y } }
/magic_math/basic_test.go
// 测试文件的命名:*_test.go,在go build的时候会被忽略 // package name有两种选择 // 1. 和其他普通go文件保持一致,这样可以访问package内部非公开函数,白盒测试 package magic_math // 2. 使用原本的包名加上"_test",比如"magic_math_test" // 这样就只能访问公开函数了,黑盒测试 // package magic_math_test // 必须的 import "testing" // 测试函数的名字必须以Test开头,可选的后缀名必须以大写字母开头 func TestAdd(t *testing.T) { // 给出几组测试数据,如果出错了就报告 if Add(1, 1) != 2 { t.Error("1 + 1 = 2") } if Add(0, 0) != 0 { t.Error("0 + 0 = 0") } } // 基准测试函数和普通测试函数写法类似 // 但是以Benchmark为前缀名,并且带有一个*testing.B类型的参数 func BenchmarkAdd(b *testing.B) { // b自带了一个参数N表示测试次数 for i := 0; i < b.N; i++ { Add(0, 0) } } // 默认情况下不运行任何基准测试 // 执行Benchmark的方式(Benchmark路径和上面普通test的路径写法一样) // go test -bench=. # 匹配所有Benchmark函数,都执行 // go test -bench=Add # 执行BenchmarkAdd函数 // 再加上这个参数[-benchmem],可以记录内存使用