Go 语言自带了一个测试框架,可以用来编写三种类型的测试:单元测试(test),性能测试(benchmark)和示例测试(example)。

单元测试(test)

单元测试用于验证某个函数或方法是否按预期工作。单元测试使用 testing 包,在测试文件后加上 _test,测试函数以 Test 打头,并接收一个*testing.T 类型的参数。

// main.go
package main

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

// main_test.go
package main

import "testing"

func TestAdd(t *testing.T) {
	result := Add(2, 3)
	if result != 5 {
		t.Errorf("Expected 5, but got %d", result)
	}
}

使用以下命令运测试并查看结果:

// 运行当前文件夹下所有的测试文件
go test

// 运行特定的测试文件
go test 文件名_test.go

当 Add 函数的执行结果与期望值不符,就会输出错误信息。

性能测试(benchmark)

性能测试用于测试代码在特定条件下的执行速度和效率。性能测试函数以 Benchmark 开头,并接收一个*testing.B 类型的参数。

// fib.go
package main

func Fibonacci(n int) int {
	if n <= 1 {
		return n
	}
	return Fibonacci(n-1) + Fibonacci(n-2)
}

// fib_test.go
package main

import "testing"

func BenchmarkFibonacci(b *testing.B) {
	for i := 0; i < b.N; i++ {
		Fibonacci(20)
	}
}

使用以下命令运测试并查看结果:

// 运行当前文件夹下所有的测试文件
go test -bench=.

// 通过使用正则表达式来匹配特定的测试函数
go test -bench=BenchmarkFibonacci

示例测试(example)

示例测试用于提供使用示例和文档的代码片段,并且可以作为文档的一部分显示在 godoc 网页上。示例测试函数以 Example 开头。

// hello.go
package main

import "fmt"

// Hello returns a greeting message.
func Hello(name string) string {
	return fmt.Sprintf("Hello, %s!", name)
}


// hello_test.go
package main

import (
	"fmt"
)

func ExampleHello() {
	greeting := Hello("Clei")
	fmt.Println(greeting)
	// Output: Hello, Clei!
}

使用以下命令生成测试文档:

go doc -all