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:对于检查点、思考时间、集合点在使用的过程中,一定要注意的就是作用域问题。

 

·场景:

·单一场景:一个测试计划下,只有一个线程组。

·混合场景:有两种实现方式:

·一个线程组下,通过随机控制器实现混合。

·一个测试计划下,添加多个线程组,每个线程组实现不同的业务请求。

posted @ 2020-03-26 23:32  hjy1995  阅读(386)  评论(0编辑  收藏  举报