Go语言核心36讲
郝林
《Go并发编程实战》作者,前轻松筹大数据负责人
立即订阅
24139 人已学习
课程目录
已完结 54 讲
0/4登录后,你可以任选4讲全文学习。
开篇词+学习路线 (3讲)
开篇词 | 跟着学,你也能成为Go语言高手
免费
预习篇 | 写给0基础入门的Go语言学习者
50 | 学习专栏的正确姿势
模块一:Go语言基础知识 (6讲)
01 | 工作区和GOPATH
02 | 命令源码文件
03 | 库源码文件
04 | 程序实体的那些事儿(上)
05 | 程序实体的那些事儿(中)
06 | 程序实体的那些事儿 (下)
模块二:Go语言进阶技术 (16讲)
07 | 数组和切片
08 | container包中的那些容器
09 | 字典的操作和约束
10 | 通道的基本操作
11 | 通道的高级玩法
12 | 使用函数的正确姿势
13 | 结构体及其方法的使用法门
14 | 接口类型的合理运用
15 | 关于指针的有限操作
16 | go语句及其执行规则(上)
17 | go语句及其执行规则(下)
18 | if语句、for语句和switch语句
19 | 错误处理(上)
20 | 错误处理 (下)
21 | panic函数、recover函数以及defer语句 (上)
22 | panic函数、recover函数以及defer语句(下)
模块三:Go语言实战与应用 (27讲)
23 | 测试的基本规则和流程 (上)
24 | 测试的基本规则和流程(下)
25 | 更多的测试手法
26 | sync.Mutex与sync.RWMutex
27 | 条件变量sync.Cond (上)
28 | 条件变量sync.Cond (下)
29 | 原子操作(上)
30 | 原子操作(下)
31 | sync.WaitGroup和sync.Once
32 | context.Context类型
33 | 临时对象池sync.Pool
34 | 并发安全字典sync.Map (上)
35 | 并发安全字典sync.Map (下)
36 | unicode与字符编码
37 | strings包与字符串操作
38 | bytes包与字节串操作(上)
39 | bytes包与字节串操作(下)
40 | io包中的接口和工具 (上)
41 | io包中的接口和工具 (下)
42 | bufio包中的数据类型 (上)
43 | bufio包中的数据类型(下)
44 | 使用os包中的API (上)
45 | 使用os包中的API (下)
46 | 访问网络服务
47 | 基于HTTP协议的网络服务
48 | 程序性能分析基础(上)
49 | 程序性能分析基础(下)
尾声与思考题答案 (2讲)
尾声 | 愿你披荆斩棘,所向无敌
新年彩蛋 | 完整版思考题答案
Go语言核心36讲
登录|注册

25 | 更多的测试手法

郝林 2018-10-08
在前面的文章中,我们一起学习了 Go 程序测试的基础知识和基本测试手法。这主要包括了 Go 程序测试的基本规则和主要流程、testing.T类型和testing.B类型的常用方法、go test命令的基本使用方式、常规测试结果的解读等等。
在本篇文章,我会继续为你讲解更多更高级的测试方法。这会涉及testing包中更多的 API、go test命令支持的,更多标记更加复杂的测试结果,以及测试覆盖度分析等等。

前导内容:-cpu 的功能

续接前文。我在前面提到了go test命令的标记-cpu,它是用来设置测试执行最大 P 数量的列表的。
复习一下,我在讲 go 语句的时候说过,这里的 P 是 processor 的缩写,每个 processor 都是一个可以承载若干个 G,且能够使这些 G 适时地与 M 进行对接并得到真正运行的中介。
正是由于 P 的存在,G 和 M 才可以呈现出多对多的关系,并能够及时、灵活地进行组合和分离。
这里的 G 就是 goroutine 的缩写,可以被理解为 Go 语言自己实现的用户级线程。M 即为 machine 的缩写,代表着系统级线程,或者说操作系统内核级别的线程。
Go 语言并发编程模型中的 P,正是 goroutine 的数量能够数十万计的关键所在。P 的数量意味着 Go 程序背后的运行时系统中,会有多少个用于承载可运行的 G 的队列存在。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Go语言核心36讲》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(5)

  • 属鱼
    第一个问题:
    -benchmem 输出基准测试的内存分配统计信息。
    -benchtime 用于指定基准测试的探索式测试执行时间上限
    示例:
    $ go test -bench=. word
    goos: linux
    goarch: amd64
    pkg: word
    BenchmarkIsPalindrome-4 2000000000 0.00 ns/op
    PASS
    ok word 0.002s
    $ go test -bench=. -benchmem -benchtime 10s word
    goos: linux
    goarch: amd64
    pkg: word
    BenchmarkIsPalindrome-4 10000000000 0.00 ns/op 0 B/op 0 allocs/op
    PASS
    ok word 0.003s
    注意输出部分多的那两部分(0 B/op,0 allocs/op)以及执行次数。
    第二个问题:
    使用 -coverprofile=xxxx.out 输出覆盖率的out文件,使用go tool cover -html=xxxx.out 命令转换成Html的覆盖率测试报告。
    覆盖率测试将被测试的代码拷贝一份,在每个语句块中加入bool标识变量,测试结束后统计覆盖率并输出成out文件,因此性能上会有一定的影响。
    PS:使用-covermode=count标识参数将插入的标识变量由bool类型转换为计数器,在测试过程中,记录执行次数,用于找出被频繁执行的代码块,方便优化。
    2018-10-08
    30
  • 晒太阳
    老师,回到MPG模型,我的理解是多级的关系,但M和P之间是否是一对多的关系,一个M对应着多个P,P对应着多个G(G队列runqueues),只有这样才能做到成千上万的G。我的理解对不对?M和P之间是否是一对多的关系?希望老师解惑,感谢啊。

    作者回复: M 和 P 是多对多的,或者说是动态结合的。一个 P 在不同时刻可能会对接不同的 M,反过来也是如此。而且 M 和 P 在数量上没有直接的关系。P 和 G 表面上说是一对多的,但其实一个 G 在它的生命周期中也可能会在不同 P 的可运行队列之间游走。更详细的东西,可以看我写的那本书。

    2019-09-27
    2
    1
  • Sky
    -cpu=2,4 -count=2
    2019-07-11
    1
  • 大王叫我来巡山
    慢慢的感觉就跟不上了,主要是还没有遇到这个应用的场景,评论也越来越少,不过老师确实很赞,不管是我提问题,还是吐槽,老师都很耐心的回答,但是我感觉不知道是不是我写的太少了,这个内容距离实践还有段距离

    作者回复: 确实需要多多练习。自己做项目吧。

    2019-09-12
    1
  • Charles WANG
    Go语言都有哪些框架?我查了一下,貌似只有Web框架?
    2018-10-09
收起评论
5
返回
顶部