jmeter脚本增强

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/Rainday666/article/details/102641465
·Jmeter脚本增强
	·性能测试的脚本增强技术:参数化、关联、事务、检查点、思考时间和集合点。


·参数化:在Jmeter中,实现参数化的方式很多。
	本质上来说,参数化的实现方式有两种:
	·文件方式:一般建议通过配置元件--CSV DATA SET CONFIG组件来实现。
	·函数方式:一般通过调用Jmeter内置的、第三方插件、自定义的函数来实现。
		一般通过函数助手来生成调用的字符串。


	·调用方式:在jmeter中,任何鼠标点击可以输入的地方(输入字符串),都可以实现参数化操作,在Jmeter中,参数、变量、函数的调用方式是固定的:
	${参数名}   ${变量名}   ${函数名}

·CSV DATA SET CONFIG组件详解:
	·FileName:文件名,即参数文件的名称。
		可以使用相对地址,也可以使用绝对地址。
		
	·File encoding:参数文件的编码,要求和实际编码保持一致。
		默认为空,对应的文件编码格式为ANSI。
		PS:建议参数文件使用记事本进行编辑,编码格式采用默认的ANSI。

	·Variable Names:参数名称,又叫变量名称。该处可以填写一个or多个参数名,也可以不填写。
		PS:
		·如果有多个参数名,则不论参数文件中的值的实际分隔符是什么,参数名之间始终使用逗号进行分隔。
		·一个参数名只会读取参数文件中的一列值。参数名和值是按顺序一一对应。即第一个参数对应第一列值,第N个参数对应第N列值。
		·如果该处为空,则Jmeter会读取参数文件中的第一行的值作为参数名,然后从第二行开始取值。不建议留空。

	·Ignore first line:表示忽略参数文件的第一行,直接从第二行开始读值。

	·Delimiter:分隔符,用来指定参数文件的列的分隔符,要求和实际的分隔符保持一致。
	·Allow quoted data?:是否允许通过双引号定义块数据。即通过双引号屏蔽值本身所携带的分隔符字符。
			
	·Recycle on EOF?:是指没有值的时候,循环读取。

	·Stop thread on EOF?:该选项是在循环选项的值为false时才会起效。
		作用表示没有值的时候,停止线程。

	·sharing mode:该选项影响的是Jmeter中的参数的取值方式。
		可选模式有三种:
		·All threads:默认方式,所有线程。表示当前的测试计划下的所有线程共用一个参数文件的副本。对于参数值采取先到先拿,顺序获取的方式。
		如果不设置Recycle on EOF为true,则作用就是唯一取值。

		·Current thread group:当前线程组。表示一个线程组中的所有线程共用一个参数文件的副本。如果有多个线程组,则参数文件会生成多个副本。线程组之间相互不影响,独立取值。每一个线程组中,还是采取先到先拿,顺序获取的方式。

		·Current thread:当前线程。表示每一个线程都会拥有一个独立的参数文件的副本。线程自己采取顺序获取的方式。线程之间相互不影响。
		该方式等价于LR中的默认参数取值方式。

	PS:CSV DATA SET CONFIG中的变量更新变量值的时机是受到所在作用域的最高循环组件的影响的。


·关联:
	关联是用来解决请求之间的依赖关系的。
	在工具层面,工具需要解决的问题其实是两个:
	·先存:先保存服务器响应的数据
	·后用:在后续的请求中调用所保存的数据。

	在Jmeter中,关联一般都是通过后置处理器组件来实现。
	常用的是:正则表达式提取器、JSON Extractor。。

·正则表达式提取器:
	·要检查的字段:默认是主体,即要从响应主体里提取数据。
		·信息头:是指响应的信息头,目前很多token相关的数据可能是通过响应头来返回的。

	·引用名称:即变量名称,由用户自己指定,建议有意义。
		
	·正则表达式:该处填写的是用来获取数据的正则表达式。
		·通常来说,我们截取关联数据的左右固定的字符串,然后将需要关联的数据替换为"(.*?)"即可。   
示例:  服务器返回:aaa数据bbb
	aaa和bbb是固定不变的,即为左右边界,数据是变化的。则最终的正则表达式可以写为
		aaa(.*?)bbb
	PS:不论是左右边界还是数据本身包含回车换行的话,则不能用点“.”,要用“[\\s\\S]”替代。
	
	·模板:该处可以填写的内容有两种:字符串常量、位置变量$N$,当然也可以是组合。
		·字符串常量:不是位置变量格式的都是字符串常量。表示将字符串常量的值直接赋值给引用变量。
		·位置变量$N$:	N表示将正则表达式第N对括号所对应匹配的值赋值给变量。
		PS:一般来说,我们的正则表达式只有一对括号,所以模板很多时候就写$1$即可。

	·匹配数字:该处可以填写的数字有三种:正整数N,数字0,负数。
		·正整数N:表示将第N次匹配到的值赋值给变量。
		·数字0:表示将所有匹配到的值随机取一个赋值给变量。
		·负数:通常填写-1,表示将所有匹配到的值以类似数组的方式存入参数数组。	效果为:ParamName_1=Value_1,ParamName_2=Value_2,...,ParamName_N=Value_N.
		并且会自动生成一个参数叫ParamName_matchNr=N,用来存储匹配到的值的个数。


	·如果要全部拼装为一个特定的格式,则需要继续添加后置处理器--BeanShell PostProcessor

	示例代码:
		int num = Integer.parseInt(vars.get("pa_matchNr"));
		String outstr="";
		for(int i=1;i<num;i++){
			String index="pa_"+i;
			outstr=outstr+vars.get(index)+",";
		}
		String index="pa_"+num;
		outstr=outstr+vars.get(index);
		vars.put("str",outstr);


	·如果要遍历,或者部分遍历,则可以通过逻辑控制器--foreach控制器来实现。





·性能测试的脚本增强:

·事务:
	引入事务的目的是为了度量响应时间和TPS。
	在Jmeter中,对于事务的处理是分两种情况:
	·事务只是一个请求:只需要修改请求的名称,使其具有唯一性。不需要其它额外的操作。
	
	·事务包含多个请求:则需要使用逻辑控制器--事务控制器。
		·PS:建议勾选Generate parent sample,这样得到的时间会更加准确。


·检查点:
	在Jmeter,检查点通常都是通过断言组件来实现的。
	常用的断言组件就是:响应断言。
	·响应断言:
		·模式匹配:
			需要注意的就是:
			·包括和SubString的意义相当。服务器的响应中包含指定的预期值。
			·匹配和Equals的意义相当。服务器端响应等于or符合指定的预期值。

			·包括和匹配是支持正则表达式的,而SubString和Equals是不支持正则表达式的。
		·要测试的模式:就是预期值。
	
			
·思考时间:在Jmeter中,常用的思考时间组件有两个:
	·固定定时器:单位是毫秒
	·高斯随机定时器:作用就是:用来模拟:固定延迟+-2×偏差值。
		最小值等于0.

	PS:一般来说,在性能测试过程中,我们往往建议通过随机思考时间的方式来模拟负载。	

·集合点:在Jmeter中,集合点是通过定时器--Synchronizing Timer组件实现。
	·Number of Users:一次集合的人数。
	默认值为0,表示集合人数等于线程组中的线程总数。
	·Timeout:超时时间,是指第一个到达集合点的线程的等待时间,如果时间到达,则所有到达集合点的线程都会释放执行后续的请求。
	默认值为0,表示不超时,即必须等到足够的线程才会释放。

PS:以上组件的使用,一定要注意组件的作用域问题。

·Jmeter的场景相关的操作:
	
·联机负载和IP欺骗:

·联机负载:
	Jmeter本身的性能问题,导致很多时候我们都需要采用分布式(联机负载)的方式来进行性能测试。

·前提条件:
	·控制机和负载机、负载机和被测服务器之间的网络是通畅。
	·控制机和负载机上具有相同的jmeter环境。

·操作步骤:
	·第一步:启动负载机上的Jmeter-server.bat。
		PS:默认情况下,server端采用的通信端口是1099,不被占用即可。如果需要修改该端口,则修改jmeter.properties文件中的server_port属性即可。要求端口未被占用。
		如果负载机的server_port被修改,则控制机上添加负载机的时候,host:port中的port也要对应修改。(不需要修改控制机上的server_port属性)。

	·第二步:在控制机上添加负载机。
		是通过修改控制机的jmeter.properties文件来实现。
		属性:remote_hosts。
		示例:
		remote_hosts=127.0.0.1
		#remote_hosts=localhost:1099,localhost:2010
		remote_hosts=192.168.2.212:8000,192.168.2.100:1099
		PS:表示新增两台负载机,分别是2.212:8000,2.100:1099
		多台负载机之间使用逗号分隔。
	     	     修改之后,需要重启jmeter。

	·第三步:启动。
	在jmeter中,远程启动有两种方式:
	·远程启动:选中某一台负载机,运行脚本。
	·远程全部启动:直接启动所有的负载机运行脚本。

·注意事项:
1、从jmeter4.0开始,分布式负载开始支持基于https的模式(默认)。该模式下,需要额外进行操作:
	·在控制机上运行bin目录下的脚本:create-rmi-keystore.bat
		则会在bin目录下生成密钥文件:rmi_keystore.jks
	·将密钥文件rmi_keystore.jks复制到负载机的Jmeter的bin目录即可。

	当然,也可以通过修改控制机与负载机的配置文件jmeter.properties,设置不使用https模式,而是采用http模式。
		#server.rmi.ssl.disable=false
		默认值是false,表示使用ssl模式。
		如果不希望使用,则修改为:
		server.rmi.ssl.disable=true
	PS:控制机和负载机都修改。

2、联机负载时,脚本的运行环境是负载机。
	这就意味着我们在做联机负载时,要尽可能的保证负载机和控制机的环境的一致性。
	常见的有:
		·系统环境变量
		·基础环境,比如说jmeter版本和JDK版本。
		·第三方文件(参数文件),需要人为的复制分发到负载机。脚本中的访问路径:
	·如果控制机和负载机的操作系统类型一致,则建议使用绝对路径。
	·如果控制机和负载机的操作系统类型不一致,则只能使用相对路径。
		·在本地(控制机上),当前路径是脚本所在路径。
		·在远程(负载机上),当前路径是Jmeter的bin目录所在路径。

3、远程全部启动时,如果负载机的数量大于等于两台。脚本是分别、独立、同步在不同的负载机上运行的。
	这就意味着,对于服务器而言,承受的压力是:
		线程组设计的压力×负载机的数量。

4、如果需要获取错误响应,则需要修改模式为:standard。
	默认情况下,负载机是只会将一些特定的数据反馈给控制机的,通常不会包含服务器的响应。
	则需要修改以下配置(包括控制机和负载机)。
	jmeter.save.saveservice.output_format=xml
	jmeter.save.saveservice.response_data.on_error=true

	#Remote batching support
	mode=Standard


·IP欺骗:
	Jmeter的http请求也是可以实现IP欺骗的。
	具体操作:
	·在负载机上,绑定IP地址。
	·在脚本中,http请求的实现模式要切换到httpclient模式。
	·Source IP Address中,填写绑定好的IP地址即可。
		PS:一般都是把绑定好的IP地址,写入参数文件,实现参数化。

·注意事项:
	参考LR讲课。


·监控:
·监听器:
·Summary report和聚合报告:在实际的测试过程中,我们一般是不会使用查看结果树组件,通常使用的是Summary report和聚合报告。
	·Summary report和聚合报告的指标解释:
		·Label:请求名称。
		·# Samples:请求所执行的次数。
		·Average:请求的平均响应时间
		·Min:请求的最小响应时间
		·Max:请求的最大响应时间
		·Std.Dev.:标准方差。
		PS:以上时间的单位都是毫秒。
		
		·error%:出错请求的比例。
		·Throughput:吞吐量,就是相当于LR中的TPS。
		PS:如果该值很小,会自动变更单位为/min(每分钟).

		·Received KB/sec:每秒钟接收到的字节大小。
		·Sent KB/sec:每秒钟发送的字节大小。
		·Avg.Bytes:平均每个请求所产生的字节大小。

	·聚合报告对比与Summary Report:
		·Median:中位值,又叫50% line,即50%的用户的响应时间小于等于该值。
		·90%line(95、99):是指90%的用户(请求)的响应时间是小于等于该值。
	PS:比例是可以通过jmeter.properties配置文件进行修改的。
	配置文件关键字:
	#aggregate_rpt_pct1=90
	#aggregate_rpt_pct2=95
	#aggregate_rpt_pct3=99
	PS:#表示注释,表示不起效(默认值).

	




















	
		

	

猜你喜欢

转载自blog.csdn.net/Rainday666/article/details/102641465