go 语言测试工具

go test 工具

Go 语言中的测试使用 go test命令。

go test 命令是一个按照一定约定和组织的测试代码的驱动程序。

在项目目录内,所有以_test.go为后缀名的源代码文件都是 go test 测试文件,不会被编译到最终的可执行文件中。

go test 参数

go test 是 go 语言自带的测试工具,其中包含的是两类,单元测试和性能测试 :

go test -c
编译 go test 成为可执行的二进制文件,但是不运行测试。

go test -v
显示详细的流程

go test -run
测试指定文件的指定函数,如 :
go test -v -run TestSay user_test.go
go test -v -run TestSay

go test 文件命名规则

要开始一个单元测试,需要准备一个 go 源码文件,在命名文件时需要让文件必须以_test结尾。

在*_test.go文件中有三种类型的函数,单元测试函数、基准测试函数和示例函数。

类型	    格式	          作用
测试函数	函数名前缀为 Test	测试程序的一些逻辑行为是否正确
基准函数	函数名前缀为 Benchmark	测试函数的性能
示例函数	函数名前缀为 Example	为文档提供示例文档

go test 命令会遍历所有的*_test.go文件中符合上述命名规则的函数,然后生成一个临时的main包用于调用相应的测试函数,然后构建并运行、报告测试结果,最后清理测试中生成的临时文件。

go test 函数命名规则

单元测试函数需要以Test为前缀,例如:

func TestXXX( t *testing.T )

go test 示例

项目目录结构

|_ 项目根目录
    |_ user // 模拟一个测试模块
        |_ user.go
    |_ main.go
    |_ user_test.go // 测试文件

user.go 源码

package user

import "time"

func Info() {
	println("Info start...")
	time.Sleep(time.Second * 2)
	println("Info end ... ")
}

func Say() {
	res := 0
	for i := 0; i < 9900000; i++ {
		res += i
	}
	println(res)
}


user_test.go 源码

package main

import (
	"godemo/user"
	"testing"
)

func TestUserInfo(t *testing.T) {
	user.Info()
}

func TestSay(t *testing.T) {
	user.Say()
}

测试命令

go test -v
go test -v -run TestSay

go test 基准测试

基准测试就是在一定的工作负载之下检测程序性能的一种方法。基准测试的基本格式如下:

func BenchmarkName(b *testing.B){
    // ...
}

示例 :

func BenchmarkSay(t *testing.B) {
	user.Say()
}

测试命令 :

go test -bench=Say -benchmem

结果 :

go test -bench=Say -benchmem

goos: windows
goarch: amd64
pkg: godemo
cpu: AMD Ryzen 5 3600 6-Core Processor
BenchmarkSay-12
 1000000000 0.005001 ns/op 0 B/op 0 allocs/op
PASS
ok 
godemo  0.350s

其中 BenchmarkSay-12 表示对 Say 函数进行基准测试,数字12表示 GOMAXPROCS 的值,这个对于并发基准测试很重要。

1000000000 和 0.005001 ns/op 表示每次调用 Say 函数耗时 0.005 ns,这个结果是 1000000000 次调用的平均值。