用JMeter做http压力测试,这一篇就够(六-参数)

    xiaoxiao2022-07-04  180

    上文提到了我们已经让雇佣的一堆人(线程组)知道干什么事情了,也知道他们干的怎么样,但是我不能每次都让他们干一个事情(发同样的请求)呀,那么这里就要引进参数的概念。 所谓参数,可以是配置的绝对参数,也就是不变的量,也可以是随机改变的量,亦或者在多请求交互中上层请求返回的结果中的量,这些量在请求数据中的引用就能不断地改变请求数据,让线程组每次请求都能在符合要求的数据中不断变化,从而模拟出真实的压测环境。 在本文中我暂且将参数分为两类:静态参数和动态参数,静态参数可分布在项目、线程组和请求三个维度,动态参数一般置放于请求维度,以免多请求之间使用时发生混乱。当多个维度都定义了同一个参数时,参数取值按照就近原则进行。 上面提到了参数引用,在JMeter中参数的引用很简单,只需要用 ${}将参数括起来即可,例如:${IP}


    静态参数

    通常情况下,我们在相对固定的参数上使用静态参数,比如请求端口、请求路径、服务IP亦或者相对固定的请求内容。 我们用到的静态参数组件有三个:User Defined Variables、CSV Data Set Config和User Parameters。


    User Defined Variables 该组件定义单一参数,比如我有的服务是集群部署,IP地址有多个,但是端口和请求路径确是一致的,那么我就可以使用该组件来定义端口和路径。 创建User Defined Variables User Defined Variables组件界面 点击Add添加参数,Detele删除参数,Up/Down对参数进行位置调整,Detail显示参数详细信息,另一个不知道干啥的。
    User Parameters 该组件就是为了弥补上面User Defined Variables组件对IP地址无法定义的缺憾,它可以让一个参数对应有多个取值,从而满足对集群服务的压测 创建User Parameters User Parameters界面介绍 Add Variable:增加参数,Add User:增加用户(其实就是一个参数对应多个取值)
    CSV Data Set Config 该组件可以定义的参数就灵活多了,他是通过文件的形式读取参数值,因此可以方便的定义任意多行参数,它与User Parameters的区别在于,CSV可以通过一个值一换行来模拟User Parameters,还可以多个值通过分隔符放在一行来应对请求内容中关联数值的取值。他的一行代表一组数值。 创建CSV Data Set Config CSV Data Set Config配置介绍 参考CSV Data Set Config设置 (1)Filename:文件名,指保存信息的文件目录,可以相对或者绝对路径(比如:D:\压力测试\JMeter.txt),文件可以使CSV文件,也可以是TXT文件; (2)File encoding:文件编码格式,可以不填,有中文时最好填上; (3)Variable Names:变量名,多个变量用“,”分开,例如:one,two,three,four,使用时可以单独使用,一起使用时一行为一组数据; (4)Delimiter:文件中的分隔符(用”\t”代替tab键)(一般情况下,分隔符为英文逗号) (5)Allow quoted data:是否允许引用数据(尚不清楚) (6)Recycle on EOF :到了文件尾处,是否循环读取参数,选项:true和false。因为CSV Data Set Config一次读入一行,分割后存入若干变量交给一个线程,如果线程数超过文本的记录行数,那么可以选择从头再次读入 (7)Stop thread on EOF:到了文件尾处,是否停止线程,选项:true和false;当Recycle on EOF 选择true时,Stop thread on EOF选择true和false无任何意义,通俗的讲,在前面控制了不停的循环读取,后面再来让stop或run没有任何意义:当Recycle on EOF 选择flase时,Stop thread on EOF选择true,线程4个,参数3个,那么只会请求3次 当Recycle on EOF 选择flase时,Stop thread on EOF选择flase,线程4个,参数3个,那么会请求4次,但第4次没有参数可取,不让循环,所以第4次请求错误 (8)Sharing mode:共享模式,All threads –所有线程,Current thread group—当前线程组,Current thread—当前线程。经试验得出来的结果是(不考虑线程组迭代): 如果测试计划中有线程组A、线程组B,A组内有线程A1到线程An,线程组B内有线程B1到线程Bn,CSV Data Set Config放在线程组A的下级组织树,不管怎么设置Sharing mode,都只针对线程组A且取之情况一样:线程A1取第一行,线程A2取第二行。CSV Data Set Config放在测试计划下级组织树(与线程组并列),情况如下 :   All threads:测试计划中所有线程,线程组A、线程组B共用一个CSV文件,所取数据与线程实际执行顺序有关(先执行先取)。补充一点:线程组之间是并行执行,各线程实际执行时间根据Ramp-UP Period而来,如下图,若线程A、线程B均设置Ramp-Up Period:2,取之情况是:线程A1取第1行,线程B1取第2行,线程A2取第3行,线程B2取第4行。

    动态参数

    一般情况下每个请求的内容都要在符合规定的范围内不断变化才符合模拟测试的场景,或者当有一个接口依赖与另一个接口的返回值时,我们就需要用到动态参数。 我们用到的动态参数组件有很多,这里我只介绍两个较为常用的:Random Variables、Regular Expression Extractor。


    Random Variables 该组件定义随机数,是使用最多的动态参数组件之一。 创建Random Variables Random Variables配置 (1)Variable Name:变量名称 - 用于控制在其它元素中引用该值,形式:$(variable_name}; (2)Output Format:可选格式,比如000,格式化为001,002,Minimum Value,Maximum Value都设置为1,Number format设置为000,那么格式化后,第一个参数值为001,第二个为002,……,以此类推,假设format设置为user_000,那么格式化后,第一个参数值为user_001,第二个参数值为user_002,…,以此类推。默认格式为Long.toString(); (3)Minimum Value:生成的最小随机数; (4)Maximum Value:生成的最大随机数; (5)Seed for Random function: 供随机数生成器使用的seed.如果为空,则使用默认的Random构造器; (6)Per Thread(User): 如果设置为False,那么所有线程共享同一个随机数生成器,如果设置为True,那么每个线程独享各自的随机数生成器
    Regular Expression Extractor 正则表达式提取器,提取请求返回结果中的数据,适用于一个请求依赖于其他请求结果的场景(多接口串跑); 创建Regular Expression Extractor Regular Expression Extractor参数介绍 (1)Apply to:作用域,主要作用在于是否作用在sub-sampler; (2)Field to check:分的很细,意思是你打算去哪里取值; (3)Name of created variable:变量名,取值后存储的对象名,可以用作 变 量 名 , 另 外 {变量名},另外 {变量名}_g#,#代表第几组,g0表示完全匹配,包含整个字符串,g1代表从第对括号开始匹配,g2表示第二对括号开始的匹配; (4)Regular Expression: 正则表达式-正则表达式中,括号中匹配到的内容会存储到缓存中,赋给变量以备后续引用时提取,例如图中"mercOrderNo":"(.+?)",会将接口返回结果中的"mercOrderNo":“abc12345678”,abc12345678匹配到并赋值给参数mercOrderNo; (5)Template: 1 1 1指向group 1,即匹配第一个正则表达式括号内的内容,依次类推; (6)Match No: 选择第几次匹配到的值,有可能一个Sampler下面匹配到多个值,这时这个变量就可以用到,0代表随机取,可以用在每次取到的值是一样的情况下; (7)Default Value: 如果没有匹配到的默认值,建议设置,可以快速定位问题。

    其实还有一种场景,虽然两个接口之间对某一个接口的结果有依赖,但是我依旧希望一个接口一个接口来进行压力测试,那么就需要把生成结果的那个接口的返回参数保存起来,然后用CSV来提取静态参数的方式进行下一个接口的压力测试,具体该如何保存提取的结果呢,我这里就不重复说明了,大家可参考Jmeter怎么将请求返回的一个字段保存到文件


    文已至此,其实通过JMeter来进行压力测试已经基本可以实现了,但是现在还不知道你所压的服务器到底是什么情况,那么接着我还将介绍几个常用的监听器,来监视服务器性能指标,详情请点击用JMeter做http压力测试,这一篇就够(七-监听器)

    最新回复(0)