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