单元测试&基准测试&样本测试&测试覆盖率

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数据相同
  • t.go
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)
}
  • t_test.go
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
  • Example
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

  • 记录程序中GOroutine阻塞事件
标记名称 标记描述
-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
...

你可能感兴趣的:(单元测试&基准测试&样本测试&测试覆盖率)