1.单元测试
1.1.go test 目录
go test,将对当前目录下的所有*_test.go文件进行编译并自动运行测试
go test xxx 将对指定目录下的所有*_test.go文件进行编译并自动运行测试
1.2.go test 测试源码文件 测试的源码文件
运行test目录下t.go文件的所有测试用例
go test test/t_test.og test/t.go
1.3.go test -run=正则表达式与之对应的测试用例执行 目录名称,执行./test目录下正则匹配的所有单元测试
go test -v -run=Test ./test
1.4.go test -v -run=T ./test -timeout 100ms timeout指定单元测试的超时时间,超过指定时间测试用通不通过
go test -v -run=T ./test -timeout 100m
1.5.go test 并发测试
go test -v ./test -parallel=5
运行条件
1.功能测试函数加入t.Parallel()
2.runtime.GOMAXPROCS设置go的最大并发处理数量,默认值为1
3.测试用例源码文件init中设置runtime.GOMAXPROCS最大并发数据
4.通常-parallel不需要设置,默认让它与runtime.GOMAXPROCS数据相同
package test
import (
"time"
"fmt"
"strconv"
)
func test() {
//fmt.Println("test")
time.Sleep(time.Nanosecond)
}
func test2() {
i := 1
name := "jingyanlei"
age := 18
fmt.Sprintf("i:%d, name:%s, age:%d", i, name, age)
}
func test3() {
i := 1
name := "jingyanlei"
age := 18
_ = "i:"+strconv.Itoa(i)+"name:"+name+"age:"+strconv.Itoa(age)
}
package test
import (
"testing"
"runtime"
)
func init() {
runtime.GOMAXPROCS(10)
}
func TestTest(t *testing.T) {
t.Parallel()
test()
}
func TestTest2(t *testing.T) {
t.Parallel()
test2()
}
2.基准测试
2.1.运行基准测试
运行指定的基准测试
go test -bench regexp
go test -bench=Test ./test/
运行所有基准测试
go test -bench. 或go test -bench=".*"
对某个go文件进行benchmark测试
go test ./test/t_test.go -=".*"
-benchmem 基准测试中包含内存分配信息
go test -bench=Test ./test/ -benchmem
-benchtime t 用来间接控制基准测试函数的操作次数 t时间 1s 1秒
go test -bench=Test ./test/ -benchmem -benchtime 1s
-cpu 自定义测试运行次数,并在测试运行时间改变go语言的最大并发处理数的标记
go test -bench=Test ./test/ -benchmem -benchtime 1s -cpu=1,4,16
b.SetBytes(1024) MB/s 每秒被处理的字节数量
ns/op 平均耗时
B/op 每次操作分配的字节平均数
allocs/op 每次操作分配内存的次数
3.样本测试
样本测试函数需要以"Example"作为开始,并且在这类的函数体的最后还可以有若干个注释行,作用比较在该测试函数被执行期间,标准输出上出现的内容是否与预期相符
按照惯例,根据被测试的程序实体的种类,应该遵循这样的命名规则
1.当被测试对象是整个代码包时,样本测试的函数名称应该是Example,即直接以样本测试函数名的统一前辍作为函数名称
2.当被测试对象是一个函数时,对于函数F,样本测试的名称应该是ExampleF
3.当被测试对象是一个类型时,对于类型T,样本测试函数的名称应该是ExampleT
4.当被测试对象是某个类型中的一个方法时,对于类型T的方法M,样本测试测试函数的名称应该是ExampleT_M
5.如果需要在样本测试的名称后添加上后辍,需要用下划线把该后辍与名称其它部分隔开,该后辍的首字母必须小写,如ExampleT_M_basic
go test test/et
package et
import "fmt"
func ExampleHello() {
fmt.Println("Hello,Golang~")
//Output:Hello,Golang~
}
func ExampleHello2() {
for i:=0; i<3; i++ {
fmt.Println("Hello,Golang~")
}
//Output:Hello,Golang~
//Hello,Golang~
//Hello,Golang~
}
4.测试运行记录
在测试运行时资源的使用情况监控方面,go语言提供了3个可用的标记。只能运行在一个代码包下。
标记名称 |
标记描述 |
-cpuprofile cpu.out |
记录cpu使用情况,记写到指定文件中直到测试退出 |
-memprofile mem.out |
记录内存使有情况,并在所有测试通过后将内存使用概要写入到指定的测试文件中 |
-memprofilerate |
此标记记录内存分配操作的行为,设置分析器的取样时间间隔,这些记录将会被写到内存使用概要文件中 |
go test ./test -cpuprofile cpu.out
目录下会生成cpu.out文件
使用go tool pprof命令来交互式的对这个概要文件进行查看
go tool pprof ./test.test ./cpu.out
(pprof) top10
go test ./test -memprofile mem.out -memprofilerate 10
查看
go tool pprof ./test.test ./mem.out
(pprof) top10
2319B of 2319B total ( 100%)
Dropped 38 nodes (cum <= 11B)
Showing top 10 nodes out of 26 (cum >= 95B)
flat flat% sum% cum cum%
1664B 71.76% 71.76% 1664B 71.76% runtime.malg
240B 10.35% 82.10% 240B 10.35% runtime.acquireSudog
192B 8.28% 90.38% 1984B 85.55% runtime.systemstack
128B 5.52% 95.90% 128B 5.52% runtime.allgadd
48B 2.07% 97.97% 48B 2.07% runtime.rawstringtmp
47B 2.03% 100% 47B 2.03% os.NewFile
0 0% 100% 48B 2.07% fmt.Sprintf
0 0% 100% 80B 3.45% go-test/test.TestTest
0 0% 100% 80B 3.45% go-test/test.TestTest2
0 0% 100% 95B 4.10% main.main
标记名称 |
标记描述 |
-blockprofile block.out |
记录Goroutine阻塞事件,并在所有测试通过后将概要信息写到指定文件中. |
-blickprofilerate n |
这个标记用于控制记录Goroutine阻塞事件的时间间隔,n的单位为次,默认值为1 |
go test ./test -blockprofile block.out -blockprofilerate 1
查看
go tool pprof ./test.test ./block.out
(pprof) top10
312.26us of 312.26us total ( 100%)
Showing top 10 nodes out of 15 (cum >= 4.84us)
flat flat% sum% cum cum%
296.58us 94.98% 94.98% 296.58us 94.98% runtime.chanrecv1
15.69us 5.02% 100% 15.69us 5.02% runtime.chansend1
0 0% 100% 41.67us 13.34% go-test/test.TestTest
0 0% 100% 10.10us 3.23% go-test/test.TestTest2
0 0% 100% 123.37us 39.51% main.main
0 0% 100% 312.26us 100% runtime.goexit
0 0% 100% 123.37us 39.51% runtime.main
0 0% 100% 123.37us 39.51% testing.(*M).Run
0 0% 100% 51.76us 16.58% testing.(*T).Parallel
0 0% 100% 4.84us 1.55% testing.(*T).Run
5.测试覆盖率
go test cover
...