[TOC] # 自动化测试框架 * testing包提供了自动化测试相关的框架 * 支持单元测试和压力测试 **go test介绍** * `go test`加包名,执行这个包下面的所有测试用例 * `go test`加测试源文件,执行这个测试源文件里的所有测试用例 * `go test -run`选项,执行指定的测试用例 # 测试规范 * 用来测试的代码必须以`_test.go`结尾 * 单元测试的函数名必须以Test开头,并且只有一个参数,类型是`*Testing.T` * 基准测试或压力测试必须以Beanchmark开头,并且只有参数,类型是`*Testing.B ` # 单元测试 Go 的测试方法看上去相对比较低级,它依赖于命令`go test`和一些能用`go test`运行的测试函数的编写约定。但是,我认为这就是所谓的 Go 风格,用 Go 以来,我的感受是 Go 语言就是保持了 C 语言编程习惯的一门语言。 首先,为了开始这篇文章,我写写一个简单的函数用作后面要测试的例子,但是,考虑到后面可能要讲一些稍微复杂一点的内容,所以,这个例子我留有一些可以改变的地方,大家可以选择着看 ~~~ func Add(x, y int) int { return x + y } func main() { fmt.Println(Add(1, 2)) } ~~~ 这个例子就是这么简单,将这个文件命名为**main.go**,然后我们就应该编写测试代码了。测试代码的文件放置的位置可以随意,`package`也可以随意写,但是,**文件名必须以 \_test 结尾**,所以,我这里就命名为**main\_test.go**。 这里编写测试函数,有几个需要注意的点: 1. 每个测试文件必须以**\_test.go**结尾,不然`go test`不能发现测试文件 2. 每个测试文件必须导入**testing**包 3. 功能测试函数必须以**Test**开头,然后一般接测试函数的名字,这个不强求,**Test后面的也要首字母大写** 根据这些条件,我们可以写出一个测试文件 ~~~ func TestAdd(t *testing.T) { sum := Add(1, 3) t.Logf("打印日志: %s", "logf日志") fmt.Println(sum) if sum != 3 { t.Error("测试失败") t.Fatalf("打印Fatalf日志: %s", "Fatalf日志") } } ~~~ 测试文件写完之后,我们就应该执行测试了,打开命令行工具,敲入这条命令:`go test main_test.go main.go -v -cover` 然后就应该等待测试结果了,这里加了两个参数,分别是`-v`和`-cover`,如果不加上的话你会发现只有**Test Pass**的简单提示,而看不到我们加了参数的具体提示: # 压力测试 ~~~ func BenchmarkAdd(b *testing.B) { for i := 0; i < b.N; i++ { a := 10 b := 20 Add(a, b) } } ~~~ ~~~ go test -bench . ~~~ 输出 ~~~ goos: darwin goarch: amd64 pkg: clientTcp BenchmarkAdd-8 2000000000 0.35 ns/op PASS ~~~ 那么多次,表示每次调用才花了0.35纳秒