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

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
...
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,600评论 18 139
  • 转:http://www.jianshu.com/p/d5fca0185e83 Xcode测试 前言 总算在今天把...
    测试小蚂蚁阅读 2,842评论 0 20
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,587评论 18 399
  • 作者:廖飞全文约 7778 字,读完可能需要 15 分钟。 原文链接:http://www.cnblogs.com...
    罗义的夏天阅读 4,541评论 1 2
  • 一年前母亲悄无声息的走了,看到儿孙们都生活的很幸福,为了不拖累儿女们,她悄悄的走了。 十几年前父亲就因...
    hesiting阅读 277评论 4 3