25 | 更多的测试手法
25 | 更多的测试手法
讲述:黄洲君
时长14:29大小6.63M
前导内容:-cpu 的功能
问题解析
知识扩展
问题 1:-parallel标记的作用是什么?
问题 2:性能测试函数中的计时器是做什么用的?
总结
思考题
赞 10
提建议
精选留言(14)
- 属雨2018-10-08第一个问题: -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类型转换为计数器,在测试过程中,记录执行次数,用于找出被频繁执行的代码块,方便优化。展开共 1 条评论73
- Sky2019-07-11-cpu=2,4 -count=210
- 晒太阳2019-09-27老师,回到MPG模型,我的理解是多级的关系,但M和P之间是否是一对多的关系,一个M对应着多个P,P对应着多个G(G队列runqueues),只有这样才能做到成千上万的G。我的理解对不对?M和P之间是否是一对多的关系?希望老师解惑,感谢啊。
作者回复: M 和 P 是多对多的,或者说是动态结合的。一个 P 在不同时刻可能会对接不同的 M,反过来也是如此。而且 M 和 P 在数量上没有直接的关系。P 和 G 表面上说是一对多的,但其实一个 G 在它的生命周期中也可能会在不同 P 的可运行队列之间游走。更详细的东西,可以看我写的那本书。
共 3 条评论6 - KK2020-07-27如何对接口测试呢?其他语言中,比如php需要需要nginx作为代理处理请求,go是如何调试接口的呢?
作者回复: 你说的是直接测试Web接口么?可以使用 net/http/httptest 这个包。
4 - 大王叫我来巡山2019-09-12慢慢的感觉就跟不上了,主要是还没有遇到这个应用的场景,评论也越来越少,不过老师确实很赞,不管是我提问题,还是吐槽,老师都很耐心的回答,但是我感觉不知道是不是我写的太少了,这个内容距离实践还有段距离
作者回复: 确实需要多多练习。自己做项目吧。
共 2 条评论3 - MClink2022-07-08假设男女搭配才能干活,男生是G,女生是M,P就是男生的队列,有多条。每次有女生空闲了,就可以在P队列中拿一个男生和女生搭配,然后干活,干完后男生又随机回到某个队列,女生又等下一个男生,当女生不够多的时候,可以申请要多几个女生,因此每个女生都可能和不同的男生搭配干活,每个男生都可能和不同的女生搭配干活,也就是多对对的关系,不知道这样解释是否正确。
作者回复: 哈哈哈,你这个解释够奇葩...不过,要是能促进知识记忆的话也未尝不可,哈哈哈,这些女生好累啊,男生还可以回队列歇一歇(我觉得要是男女角色互换的话应该效率更高^-^)...
共 2 条评论2 - wangkaiyuan2020-12-15老师,我想问一下,P大于M的时候,是不是会有P没有和M绑定,其中的G没有执行的机会呢
作者回复: 这个绑定是动态的,择机绑,择机断,所以不会出现有可运行G但绑不上M的情况,只不过需要多等等(时间很短)罢了。另外M不够用的话,Go运行时系统会向OS申请创建新线程。
1 - poettian2020-11-19老师,这里有个疑惑:一个P在把G对接到M后,是会等待这个G运行结束或挂起后才会再次执行下一个G到M的对接吗?如果是,那我能理解设置多个P可以提高并发能力;如果不是,那不是只有一个P就够了,毕竟M数量是有限的。
作者回复: 这个问题的答案不是“非0即1”的。 在G运行的过程中,相应的P要负责维护。所以,如果只有一个P那就相当于没有并发。 然而,当G等待锁或等待IO的时候,P会试图从可运行队列里再拿一个G。所以一个P可以同时负责好多个G的运行。 另外,Go调度器里还有共享的可运行G队列,其中的G可供所有的P获取,而且,P还可能会从其他P那里“偷”可运行G。因此,这个调度过程不是那么简单的。 你可以去看看我写的那本《Go并发编程实战》,对Go并发有一个更全面的了解。
1 - 現實2022-08-01 来自北京老师你的图是用什么软件画的呀?看着蛮不错的,可以分享一下吗
作者回复: 工具很普通啊,用的就是 Power Point 。
- 喬2022-03-26老师,我有个疑惑,希望能帮我解答一下。 文中有说:"通过-cpu标记,我们还能够模拟被测程序在计算能力不同计算机中的性能表现。" 在下面的示例结果中,虽然P数量不同,但是同一个测试函数中 被测函数的调用次数 几乎是一样的 所以我想问的是,在性能测试中,-cpu的参数设置 和 被测函数的调用次数之间有什么关联呢展开
作者回复: 你说的“被测函数的调用次数”有些模糊,我不太清楚你想指的是什么(也许是我想多了)。如果按字面理解的话,那我的回答就是“它俩之间没有必然的关联关系”。 更具体地说,-cpu属于测试前设置,被测函数的执行次数属于测试运行时的一种测量(结果)。当然了前者可能会影响后者,但是可以影响后者的因素还有很多。 换句话说,在性能测试中,我们最终看的还是,被测函数在一段时间的执行次数(也就是单次执行的到底有多快)。而 -cpu 只是决定了一个前置条件而已,它并不会(也不能)充分决定被测函数的执行次数。
1 - 明远2022-03-23花了三章讲的全是命令行参数,具体的测试技巧和方法都没有提,怎么mock 断言,参数构造啥都没有说
作者回复: 那些东西通过官方文档和博客都可以获得,何必再提。 你有啥问题可以直接在文章下面留言问。
- 一步2021-11-08对于功能测试 -cpu 参数没有意义啊,为什么还会挨个遍历逻辑 CPU 切片执行多次呢?
作者回复: -cpu 针对的是性能测试(基准测试)
- 一步2021-11-07在性能测试 探索式执行达到执行时间上限的的过程中,对于被测试函数的执行时间会越来越大吗? 是由于资源竞争导致被测试函数的执行时间越来越大吗?
作者回复: 时间一般是设定死的,变动的是你的程序在单位时间内的循环执行次数。 如果你的程序有内存泄露的话,肯定会越来越慢。程序正常运行导致的GC属于常规情况(在正式环境也不可能不GC啊)。 另外,如果你要是让 go test 并行运行多个性能测试,那么就需要考虑互相干扰的问题。性能测试最好还是独占运行,而且颗粒度越小越好,这样才利于发现问题和记录最严谨的运行数据。
- Lucas WANG2018-10-09Go语言都有哪些框架?我查了一下,貌似只有Web框架?共 2 条评论