Jmeter(3)、脚本增强
在性能测试中,脚本增强主要是指:参数化、关联、事务、检查点、思考时间、集合点。
1、参数化
·参数化注意事项:
1.在Jmeter中,参数、变量、函数的调用格式都是一样的,${参数名、变量名、函数名}
2.在Jmeter中,所有组件中鼠标可以点击输入的地方,都可以实现参数化。
在Jmeter中,实现参数化的方式有两种:函数、文件方式。
1.函数:通过Jmeter内置的函数或者自定义的函数来实现参数值的生成。一般来说,我们都是通过函数助手对话框来进行函数的入参的填写,和自动生成调用字符串。
2.文件:用户将参数值写入到文本文件(逗号分隔),然后通过组件实现读取来实现参数化。一般来说,建议通过组件:配置元件--CSV数据文件设置组件来实现。
·CSV数据文件设置 组件详解:
·文件名:可以填写绝对地址,也可以填写相对地址,相对地址是脚本所在目录
·文件编码:该处填写的是脚本文件的编码格式,默认ansi为空,如果脚本文件为utf8,则该处填写utf8;建议不要使用utf-8,有些情况下会出现无法读取数据的问题。
·变量名称:即参数名称,该处可以不填(建议填写),也可以填写1到N个参数名称。多个参数名称之间使用逗号分隔,和参数文件的分隔符无关。
·不填:则表示将参数文件中第一行的值读取为参数名称。
·填写:则每一个参数都按照顺序和参数文件中的一列值建立对应关系。即第N个参数读取参数文件中的第N列的值。
·忽略首行:表示忽略数据文件的第一行。
·分隔符:默认的分隔符是逗号。用来指定参数文件的列的分隔符,即jmeter将按照指定的分隔符去解析参数文件的数据。
·是否允许带引号?:是指是否允许通过双引号来定义块数据,即通过双引号来屏蔽数据中的分隔符。对于数据中包含分隔符逗号的情况,我们可以通过自定义分隔符的方式来实现同样的效果,重点在于保证分隔符不会出现在数据中即可,因此分隔符可以是一个很长的包含特殊字符的字符串。
·遇到文件结束符再次循环:是否在文件结束的时候循环取值。即当列数据已经全部读取的时候。
·遇到文件结束符停止线程:是指当没有值的时候,是否停止线程。该选项是在循环取值的选项为False的时候才会生效。
·参数取值方式:通过csv来实现参数化的时候,参数的取值方式是和线程共享模式有关的。
·线程共享模式:默认有三种方式:所有线程、当前线程组、当前线程。
·所有线程:是指参数文件中的值被所有线程所共享,采取先到先拿,顺序获取的方式,不按线程组分组。如果循环取值选项设置为false,则能真正意义保证任何一次向服务器提交的值都是唯一的。
·当前线程组:是指每一个线程组都会拥有独立的参数文件的拷贝(副本)。每一个线程组中的所有线程共用一个参数文件的副本,采取先到先拿,顺序获取的方式。如果测试计划下只有一个线程组,则该模式和所有线程模式等价。
·当前线程:是指每一个线程都会拥有独立的参数文件的拷贝(副本)。线程之间相互不影响,线程自己采取顺序取值的方式。
·csv配置元件,参数值的变更时机是和其作用域内最高的具有循环功能的组件(如循环控制器)有关的。
2、关联
关联是用来解决请求之间的依赖关系,从操作上来说,在工具层面,关联要实现的是两个操作:
·先存:保存服务器的响应内容。后用:调用所保存的响应值。
在Jmeter中,先存是通过后置处理器来实现的,常用的后置处理器有:
正则表达式提取器,JSON提取器。
使用提取器时,可以添加一个 调试取样器:可以看到在jmeter生成的所有变量,这些变量是可以直接使用的。
JSON提取器
JSON表达式:$.节点.节点...,若提取的是数组,JSON表达式为 $.data.openid[0],提取的是第一个值;Match No=0(0表示随机);
正则表达式提取器
一般步骤:
·在查看结果树的响应中,找到关联数据的来源
·切换查看结果树的模式,从默认的text,切换为regexp tester模式。
·将包含可疑数据,及其左右边界的字符串放入,并且进行处理:将可疑数据替换为 (.*?) 即可。
·在请求A添加后置处理器-正则表达式提取器,并且填写必要的选项。
·通过search按钮,将脚本中的可疑数据,替换为对应的参数调用格式:${参数名}
·正则表达式提取器详解:
·Apply to:这是用来指定正则表达式提取器的作用对象的。
·Main sample:主请求,即脚本中所定义的请求本身。
·Sub sample:子请求,所有自动跳转or重定向的请求都叫子请求。
·Jmeter variable:该处填写的是Jmeter的变量名称,表示当前的正则表达式处理器的处理对象就是所填写的变量的值。
·要检查的响应字段:设置要检查的对象,一般来说,我们的数据来源有两个:
·body:响应body
·信息头:响应的信息头。
·引用名称:参数名称,由用户自定义,建议有意义即可。
·正则表达式:就是用来查找、获取数据的正则表达式。
PS:
·一定要在查看结果树--regexp tester模式经过测试。
·一般来说建议通过唯一固定的左右边界的方式来编写正则表达式。
然后在正则表达式中,()表示提取保存数据:左边界(.*?)右边界
·模板:该处可以填写的是位置变量(组变量)和字符串常量,单独或者组合都可以。
·位置变量$N$:表示将正则表达式中的第N对括号的值存入参数中。
·常量:所谓常量就是指$N$以外的所有字符,则表示将常量直接赋值给参数。
·匹配数字:该处可以填写的是正整数N,数字0和负数三种。
·正整数N:则表示将第N次查找到的值赋值给参数。
·数字0,则表示将所有找到的值随机抽取一个赋值给参数,默认是0。
·负数,一般填写-1,则表示将所有找到的值以类似于数组的方式存入参数数组。效果为:
ParamName_1=value1,ParamName_2=value2,...,ParamName_N=valueN
并且会自动生成一个参数叫:ParamName_matchNr=N,用来记录参数的个数。
一般来说,当我们设置匹配数字为-1的时候,则意味着我们需要遍历使用或者一次性使用所有的数据。
·遍历使用:一般在jmeter中我们会结合逻辑控制器--foreach 控制器来使用。Foreach控制器的变量前缀就是正则表达式提取器设置的变量,输出变量名称就是设置每次循环时的变量,可以在之后使用这个变量。
·一次性使用所有:这个时候一般就会涉及到数据的封装,则需要通过后置处理器--BeanShell 后置处理程序
beanshell是一种基于java的轻量级脚本语言。在Jmeter中,一般来说,我们常用的beanshell的内置对象主要就是vars,vars对象提供了两个方法:
get(String paramName)是用来获取Jmeter中的参数or变量的值。
put(String paramName,String paramValue)是用来封装值到Jmeter的参数or变量中。
3、事务:
事务的引入是为了度量操作的响应时间和获取tps数据。
在Jmeter中,响应时间和tps数据的获取一般是通过添加 监听器--汇总报告或者聚合报告这两个组件。
·汇总报告列的含义说明:
·Label:请求名称
·#样本:请求执行的次数。
·平均值:请求的平均响应时间,响应时间的单位是毫秒;最小值最大值同理
·异常%:错误率,即出错的请求占请求的总数量的比例。
·吞吐量:TPS。
·接收 KB/second:每秒钟接收的字节数量,单位是KB。
·发送 KB/seconde:每秒钟发送的字节数量,单位是KB。
·平均字节数:平均每个请求所产生的数据量(请求+响应)。
·聚合报告:
·中位数:中位值,即50% Line。
·90%、95%、99% Line:用户体验数据,是指一定百分比的用户的响应时间小于等于该值。这个比例可以通过配置文件jmeter.properties进行配置。
# First percentile to display, defaults to 90%
#aggregate_rpt_pct1=90
# Second percentile to display, defaults to 95%
#aggregate_rpt_pct2=95
# Second percentile to display, defaults to 99%
#aggregate_rpt_pct3=99
在Jmeter中,对于事务的处理,分为两种情况:
·如果要度量的操作是一个独立的请求,则不需要做任何额外的处理。
·如果要度量的操作是包含多个请求的,则需要通过逻辑控制器--事务控制器来包含多个请求,统一计时。
PS:需要勾选Generate parent Sample,不勾选Include选项。不勾选Generate parent Sample的话,则最后的事务时间还会包含一部分的脚本执行的浪费时间。这个时间的大小取决于负载机的性能。性能越好,值越小,性能越差,值越大。
4、检查点(断言)
在Jmeter中,检查点一般都是通过断言--响应断言来实现。
·匹配规则:
·包括和匹配:是支持正则表达式的。
·相等和 字符串(SubString):是不支持正则表达式的。
·包括和SubString是指响应中包含我们设定的预期值(预期正则表达式)即可。
·匹配和相等l是指响应要和预期完全一致or匹配。
·否:就是改变判断逻辑,找到就是错误,没有找到就是正确。
如果要实现多个条件且的关系,则可以直接添加多个要测试的模式即可。
如果要实现多个条件或的关系,则建议使用包括模式,通过正则表达式来实现(a|b)。
PS:添加模式的时候,要注意不要添加空白的,并且不要敲回车。
5、思考时间
在Jmeter中,思考时间一般是通过定时器组件来实现。
常用的有两种:
·固定定时器:单位是毫秒。
·高斯随机定时器:
·固定延迟偏移:相当于是平均值。
·偏差:相当于是方差。
高斯随机定时器会按照标准正态分布来生成随机时间。
68.27%的值会分布在:固定+-偏差 的范围。
95%的值会分布在:固定+-1.96×偏差 的范围。
99%的值会分布在:固定+-2.58×偏差 的范围。
6、集合点
集合点是用来实现模拟严格并发的。
在Jmeter中,集合点是通过定时器组件--(同步定时器)Synchronizing Timer来实现。
·(用户组数量)Number of Simulated Users to Group by:该选项是用来设置一次集合等待的最大人数。默认值为0,则表示等待人数=线程组中所设置的线程数。
如果自己设置,则要保证:
等待人数<=线程数
·(超时时间)Timeout in milliseconds:,单位是毫秒。
是指第一个到达集合点的线程,开始计时,时间到达,则直接释放所有到达集合点的线程,不再等待后续的线程。
PS:对于检查点、思考时间、集合点在使用的过程中,一定要注意的就是作用域问题。
·场景:
·单一场景:一个测试计划下,只有一个线程组。
·混合场景:有两种实现方式:
·一个线程组下,通过随机控制器实现混合。
·一个测试计划下,添加多个线程组,每个线程组实现不同的业务请求。