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入门实践------实战小记

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

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

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

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

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

jmeter入门实践------实战小记

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

以事件办结接口为例,事件办结的前提是查询到需要办结的事件,需要传递参数eventId和taskId,因此需要将事件查询接口与事件办结接口相关联。

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

解决办法:

正则表达式提取器

将登录接口和签到打卡接口置于同一线程组。在登录接口中添加正则表达式提取器,用来提取登录接口的token。

在签到打卡接口中添加HTTP信息头管理器,将获取的token值传入。此时运行线程组时,就实现了接口相互关联的压力测试。

jmeter入门实践------实战小记

JSON提取器

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

jmeter入门实践------实战小记

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

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

解决办法:在线程组中添加CSV Data Set Config,并填写参数化文件的路径以及需要进行参数化的请求参数名。例如登录接口进行参数化时,参数化文件中的内容为许多组用户名和密码的组合,进行参数化的参数为username和password。

jmeter入门实践------实战小记

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

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

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

jmeter入门实践------实战小记

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

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

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

jmeter入门实践------实战小记

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

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

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

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

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

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

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

jmeter入门实践------实战小记

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

(1)下载插件

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

jmeter入门实践------实战小记

(2)配置客户端

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

jmeter入门实践------实战小记

(3)启动服务端

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

jmeter入门实践------实战小记

(4)监测服务器性能

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

(5)观察监测结果

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

    jmeter入门实践------实战小记

相关文章:

  • 2021-12-19
  • 2021-04-29
  • 2021-04-08
  • 2021-09-24
  • 2021-12-27
  • 2019-08-29
  • 2021-05-11
猜你喜欢
  • 2021-05-17
  • 2021-12-05
  • 2022-02-27
  • 2021-07-16
  • 2022-12-23
相关资源
相似解决方案