jmeter入门实践------实战总结

                                         jmeter压测过程及常见问题总结

       本次博客分享以一个javaweb项目(后台使用springboot框架)的性能测试实施作为背景,主要分享三部分内容,一是使用jmeter进行压力测试具体过程,二是遇到的问题及解决办法,三是jmeter服务器性能监测插件的使用。

一.jmeter压测过程

(1)使用抓包工具抓取被测接口,并在postman上将接口调试通过。

(2)将调试通过的接口录入到压测工具jmeter中,并且根据测试需求设置线程组、调度器以及其他的相关参数。完成多组jmeter脚本的录制。设置参数的思路是给系统逐渐加压,目的是找到系统性能的瓶颈。

(3)在实施压力测试的服务器上安装测试工具jmeter以及jmeter的插件,用以执行压力测试脚本以及监测服务器性能。并对其进行调试,使其可以正常使用。

(4)将录制好jmeter脚本上传到服务器,执行linux命令运行脚本,开始执行压力测试。

  Linux运行脚本命令

  #将路径切换到jmeter工具的bin路径下

  cd /home/stressTest/apache-jmeter-3.1/bin

  #运行jmeter.sh,标蓝部分分别为脚本所在路径和生成的结果文件所在路径

  nohup sh jmeter.sh -n -t /home/stressTest/apache-jmeter-3.1/Mytest/stressTest.jmx/sign.jmx -l /home/stressTest/apache-jmeter-3.1/Mytest/stressTest.jtl/sign.jtl

(5)查看聚合报告,服务器日志,jmeter日志,分析压力测试结果并得出结论。

二、问题及解决办法

(1)背景:只有接口请求响应成功了,对该接口执行的压力侧测试得到的结果才是有意义的。而jmeter的察看结果树中图标显示为绿色。此时并不代表接口已经响应成功。还需要进一步判断。

jmeter入门实践------实战总结_第1张图片

问题:如何判断接口请求响应成功?

解决办法:两种方法判断接口是否响应成功(以签到打卡接口为例):一是看响应数据,只有接口的返回code值与期望返回的code值一致时,即为响应成功。二是去数据库查看是否有签到记录。

(2)背景:不同接口传递的参数形式和传递的内容不同。

问题:签到打卡接口只填写Body Data参数,为什么请求失败?

解决办法:对于登录接口,它只需要传递Parameters形式的username和password,而签到打卡接口既需要传递Body Data形式的参数,也需要在HTTP信息头管理器中传递token值。对于不同的接口要判断好需要传递哪些信息才能最终使接口请求成功。

jmeter入门实践------实战总结_第2张图片

(3)背景:在压测过程中,很多时候不是只对一个接口进行压力测试。以签到打卡接口为例,签到打卡的前提是需要登录系统获取token值。因此将登录接口与签到打卡接口进行关联。以事件办结接口为例,事件办结的前提是查询到需要办结的事件,需要传递参数eventId和taskId,因此需要将事件查询接口与事件办结接口相关联。

问题:接口相互关联的压力测试如何设计脚本?

解决办法:

正则表达式提取器

将登录接口和签到打卡接口置于同一线程组。右击登录接口,添加->后置处理器->正则表达式提取器。

jmeter入门实践------实战总结_第3张图片

添加正则表达式提取器后,填写相应的参数用来提取登录接口返回的token值。

jmeter入门实践------实战总结_第4张图片

下表是各参数的含义

参数

释义

引用名称

在HTTP等请求中,引用此数据,需要用到的名称

正则表达式

用于将需要的数据提取出来。

 

模板

表示使用提取到的第几个值

${-1}:表示取所有值

${0}:表示随机取值

${1}:表示取第一个值

${2}:表示取第二个值

依此类推,${n}表示取第n个值

匹配数字

0代表随机取值,1代表全部取值

缺省值

如果正则表达式没有提取到值,则使用此缺省值

注:此处说明一下正则表达式的含义

正则表达式各个符号的含义如下:

():括起来的部分就是要提取的。

.:匹配除换行符以外的任意字符

+:重复一次或更多次

?:重复零次或一次,在找到第一个匹配项后停止

*:重复零次或更多次

返回的token格式为"token":"token的具体数值"

因此正则表达式"token":"(.*?)"与上述返回的token值格式一致,可以提取出token的值。

        在签到打卡接口中右击,添加->配置元件->HTTP信息头管理器,以${token}的形式将获取的token值传入。添加过程及token的传入如下图所示。此时运行线程组时,就实现了接口相互关联的压力测试。

jmeter入门实践------实战总结_第5张图片

jmeter入门实践------实战总结_第6张图片

注:此处为Bearer ${token},为传递token的一种方式

JSON提取器

      在事件查询接口中添加JSON提取器,需要提取几个参数就参加几个提取器,JSON提取器中匹配的表达式需要根据具体的JSON格式进行确定,如果匹配的表达式输入错误,则无法提取到相应的参数值。在事件办结接口中进行参数传递时,以${参数}的形式传递在事件查询接口中提取的参数。例如传递${eventId}和${taskId}。此时运行线程组时,就实现了接口相互关联的压力测试。

JSON提取器创建过程如下:

       右击事件查询接口,点击添加->后置处理器->JSON提取器。填写相关参数,Variable names是需要提取的变量名,JSON Path expressions 是表达式,根据json的格式来提取相应的变量值。Match Numbers是匹配数字,0代表随机,1表示第一个,-1表示所有。

       针对JSON Path expressions需要说明一下,此处填写的是$.data.list[0].eventId,这是根据json的格式确定的。需要提取的json的格式如下图,这个表达式的意思是提取data中的list首元素中的eventId。

jmeter入门实践------实战总结_第7张图片

jmeter入门实践------实战总结_第8张图片

jmeter入门实践------实战总结_第9张图片

将由事件查询接口提取的eventId和taskId在事件办结接口中以参数的形式进行传递,如下图所示

jmeter入门实践------实战总结_第10张图片

 

(4)背景:需要模拟不同用户的登录

问题:如何将请求传参设置为参数化?

解决办法:在登录接口进行参数化时,首先在登录接口中传递参数时使用${username}和${password}的形式。然后在线程组中添加CSV Data Set Config,并填写参数化文件的路径以及需要进行参数化的请求参数名。参数化文件中的内容为许多组用户名和密码的组合,进行参数化的参数为username和password。上述相关操作以及参数化文件的部分截图如下图所示:

jmeter入门实践------实战总结_第11张图片

jmeter入门实践------实战总结_第12张图片

jmeter入门实践------实战总结_第13张图片

jmeter入门实践------实战总结_第14张图片

(5)背景:想单独对打卡签到接口进行压力测试,但是又必须和登录接口相互关联才能请求成功。

问题:接口相互关联后,如何实现对单独接口的压力测试?

解决办法:签到打卡接口只是需要从登录接口处获得token值,因此给登录接口添加一个仅一次控制器,这样运行线程组后,登录接口只运行一次,其余时间都是签到打卡接口在运行。实现了关联接口后单独接口的压力测试。

添加过程为:右击线程组,点击添加->逻辑控制器->仅一次控制器。

添加过程的截图以及添加后的结果如下图所示:

jmeter入门实践------实战总结_第15张图片

jmeter入门实践------实战总结_第16张图片

(6)背景:线程组持续运行时,同一线程组中接口的运行相互竞争,运行顺序是随机的。此时可能会出现错误,例如,事件办结接口如果在事件查询接口之前运行,那么就会报错,因为查询不到事件,自然无法办结;从而影响测试的结果。

问题:同一线程组中如何控制接口的执行顺序?

解决办法:在同一线程组的每个接口中添加Critical Section Controller(临界区控制器),确保它的子元素(samplers /控制器等)在执行控制器的子程序之前只执行一个线程作为指定的锁。并且将事件办结接口置于事件查询接口之后。这样就可以保证每个事件办结的接口都是在事件查询之后运行了,从而达到控制接口执行顺序的目的。

添加过程为,右击线程组,添加->逻辑控制器->临界部分控制器。然后将接口推动到临界部分控制器下。创建过程及创建后的效果如下图所示:

jmeter入门实践------实战总结_第17张图片

jmeter入门实践------实战总结_第18张图片

(7)背景:使用xshell远程连linux服务器后,使用sh jmeter.sh命令运行jmeter脚本,运行一段时间后,服务器出现断开连接的现象,脚本的运行也停止了。脚本的运行很不稳定。

问题:怎样才能使脚本不间断运行?

解决办法:在sh jmeter.sh命令前添加nohup命令,实现脚本的不挂断运行。这样在长时间执行压力测试时,就不用担心远程连接工具掉线从而影响测试结果的现象再发生。

(8)背景:进行压测时,如果接口报错,需要定位错误原因。

问题:如何定位错误原因?

解决办法:定位错误原因需要进行综合分析,可以查看服务器的日志(该接口所在服务的日志),也可以查看jmeter的日志。

如果想要查看jmeter的日志,需要在接口中添加后置处理器BeanShell PostProcessor并编写相应的脚本获取接口每次的响应结果,输出到日志文件中。

jmeter入门实践------实战总结_第19张图片

脚本如下所示:

String response = "";
String Str ="{\"code\":\"1000";
response = prev.getResponseDataAsString();
if(response == ""){
	Failure =true;
	FailureMessage = "系统无响应,获取不到响应数据!";
	log.info(FailureMessage);
	}
else if(response.equals(Str) == false){
	Failure = true;
	String Msg ="\n系统返回响应结果与期望结果不一致!请排查是性能问题,还是程序代码问题";
	FailureMessage = Msg +"\n" + "期望结果:\n" + Str + "\n" + "响应内容:\n" + response + "\n";
	 log.info(FailureMessage);
}

三、jmeter服务器性能监测插件

(1)下载插件

     访问网址http://jmeter-plugins.org/downloads/all/,下载三个文件。其中JMeterPlugins-Standard和JMeterPlugins-Extras是客户端的,ServerAgent是服务端的。

jmeter入门实践------实战总结_第20张图片

(2)配置客户端

      解压客户端的两个文件,进入其路径JMeterPlugins-Extras(Standard)-1.3.1\lib\ext,复制JmeterPlugins-Extras.jar(JmeterPlugins-Standard.jar)两个文件,放到JMeter客户端的lib/ext文件夹中,打开JMeter,可在监听器中看到Permon Metrics Collector,客户端配置成功。

jmeter入门实践------实战总结_第21张图片

(3)启动服务端

     将ServerAgent-2.2.1.jar上传到被测服务器,解压,进入目录,Windows环境,双击ServerAgent.bat启动;linux环境执ServerAgent.sh启动,默认使用4444端口

jmeter入门实践------实战总结_第22张图片

(4)监测服务器性能

     添加线程组,设置循环次数为"永远";为线程组任意添加一个Sampler(并不设置参数);添加一个PerfMon Metrics Collector监听器;在Server to Monitor中添加Host/IP(执行压测的服务器IP),Port,以及Metric to collect(包括CPU,内存等)点击运行。

(5)观察监测结果

     在监听器下方的Chart中记录被压测服务器的实时性能指标。

    jmeter入门实践------实战总结_第23张图片

你可能感兴趣的:(压力测试)