一、jmeter实现定量测试
在接口测试中,我们常常需要控制某次测试进行请求的总次数,在jmeter中,控制请求次数有多种实现方式,小编常用的有3种:
1、设置线程组的循环次数(精确控制) 2、设置的线程组的执行时间(非精确控制) 3、通过设置参数化列表(CSV
Data)来限制请求数量(精确控制)
这3种方式都可以控制请求的次数,大家在使用jmeter的过程中想必也会有所应用。但其实这3种方式在效果上却有着很大区别,并不是哪种用着方便我们就随意选择一种来使用,还需要结合实际情况来决定具体使用的控制方式,以实现我们想达到的效果,同时避免对测试结果造成额外的影响。下面小编结合自身经验,来介绍下这几种控制方式的特点和如何进行选择。
首先,这3种方式中,只有设置线程组循环次数和通过设置参数化列表来限制请求数量可以实现对请求次数的精确限制,而设置线程组的执行时间是不能做到这一点的,因为它控制的是时间而不是具体次数。因此,在需要严格控制请求执行次数的测试场景下,设置线程组的执行时间显然就不能采用了。设置执行时间这种限制方式通常应用在对测试次数要求不精确或是不限制次数,只限制请求时间的场景下,比如在一段时间内,对接口进行不同并发数的性能测试。
而对于同样可以精确限制请求次数的两种方式,设置线程组的循环次数看上去是比较简单的一种,最终请求次数=线程数*循环次数,但其实这种方式却存在两个问题,我们必须要格外注意。第一个问题是,请求的总次数只能是线程数和循环次数的公倍数,这样可能造成无法正好达到我们想要的次数。第二个问题比较隐蔽,却可能对测试结果产生较大影响:在这里,我们限制的是每个线程的循环次数,而在实际测试中,每次请求有快有慢,这样有可能造成某个线程达到循环次数的时间远远超前其他线程,在后面一段时间中,线程组实际没有达到预期的并发线程数,从而对测试结果,尤其是性能结果造成影响(如图所示,某次设置了循环次数的测试中,后面一段时间实际使用的线程数Active,比设置的线程数Started要小)。
因此,限制线程组循环次数这种方式不太适用于大量密集请求场景下的性能测试,多用于请求次数固定,且单次请求时间相对固定的场景,比如定长音频的语音识别请求等。
最后一种设置参数化列表来限制请求数量的方式,可以有效避免设置线程组循环次数方式中存在的两个问题,首先,列表中有多少个请求,实际就进行多少次请求,不会受到线程数倍数之类的限制,再有,只要设置了线程组中所有线程共享一份参数列表,那么就不会出现到后面由于某个线程循环次数到了,实际并发数下降的问题,只要列表中还有值,那么就会分配给空闲的线程。这里要注意的是,如果列表中参数值的数量不是线程数的倍数,在最后一轮请求中,还是可能造成并发数下降,但只会影响最后一轮请求,影响程度会大大降低。因此参数化列表的方式基本适用于各种场景的测试。而使用参数化列表的方式最大的问题是比较麻烦,只要请求次数不同,每个分组我们都要准备不同的参数化列表,这对测试效率和测试数据管理会产生较大影响,因此还是要结合实际情况酌情使用。
二、jmeter随机函数的使用
在上期的文章中,小编介绍了jmeter中的时间函数,相比于时间函数的“确定性”,本期要给大家介绍的则是几个常用的“随机性”函数,它们同样在jmeter的使用中起着关键作用。
打开jmeter的函数助手,我们可以看到有如下几个以Random开头的,这些便是jmeter的随机函数:
这几个随机函数基本能满足我们的日常使用。他们各有特点:
__Random 生成随机整数的函数,通过指定一个范围,随机产生整数值。
__RandomDate 生成随机日期的参数,通过指定日期格式和范围来随机生成一个日期。
__RandomString 生成随机字符串的函数,通过给出一系列备选字符和长度,来随机生成一个定长字符串。
__RandomFromMultipleVars 从指定的若干个变量中随机选取一个作为返回值。
其中,Random、RandomDate、RandomString这三个函数比较相近,都是从一个固定的范围中取值,这几个函数的用法相对比较固定,大家应该都比较熟悉。而RandomFromMultipleVars有些区别,是取随机变量。因为是取随机变量,RandomFromMultipleVars这个函数非常有意思,可以完成一些其他随机函数不能完成的特殊操作。下面就来简单说说。
RandomFromMultipleVars函数可以实现从一些完全不连续的值中随机取值、从小数中随机取值、甚至按不同的概率随机取值等等。比如,按不同概率随机取值,这个功能非常实用,可一般实现起来会相对麻烦,而在jmeter中,单独使用这一个函数即可完美实现:
假设有3个变量v1,v2,v3,现在要随机从3个变量中取出一个,并要求取到v1的概率是1/2,v2的概率是1/3,v3的概率是1/6,那么就可以通过以下方式实现:
${__RandomFromMultipleVars(v1|v1|v1|v2|v2|v3|)}
是不是非常方便~
关于随机函数的使用方式还有很多,合理使用随机函数可以有效提高测试覆盖度,使得一些测试场景与实际场景更加接近。
小结
本文主要分享了在使用jmeter进行测试时的一些心得体会。以上内容均来自小编自身在测试中所遇到的问题以及总结的经验,后续还会继续为大家带来这方面的分享,如果大家有不同的看法或更好的建议,欢迎一起讨论~
最后,下面是我整理出来的一份软件测试工程师发展方向知识架构体系图。
希望大家能在这个成长过程中收益良多。可以说,这个过程会让你痛不欲生,但只要你熬过去了。以后的生活就轻松很多。正所谓万事开头难,只要迈出了第一步,你就已经成功了一半,古人说的好“不积跬步,无以至千里。”等到完成之后再回顾这一段路程的时候,你肯定会感慨良多。
由于CSDN上传图片大小有限,有需要的朋友可以关注我的公众号:程序员二黑,回复1,即可获取原图。
下面是一份配套的软件测试资源包:
上面是一些配套资源,对于软件测试的的朋友来说应该是最全面最完整的备战仓库,为了更好地整理每个模块,我也参考了很多网上的优质博文和项目,力求不漏掉每一个知识点,很多朋友靠着这些内容进行复习,拿到了BATJ等大厂的offer,这个仓库也已经帮助了很多的软件测试的学习者,希望也能帮助到你。
关注我的微信公众号:程序员二黑,即可免费获取!
最困难的时候,也就是我们离成功不远的时候!如果你不想再体验一次自学时找不到资料,没人解答问题,坚持几天便放弃的感受的话,可以加入我们的群:785128166 大家一起讨论交流学习。
推荐阅读
高薪程序员也躲不过35岁这一关…当能力与年龄脱节,我们该如何自救?