百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

jmeter 使用总结

bigegpt 2024-08-04 11:23 1 浏览

背景

很长一段时间没有测试接口了,接到一个测接口的任务起初竟有点手足无措的感觉,和开发沟通一番需求后很快头脑清晰了,首先考虑的是选取哪个接口测试工具能更方便我测试。

虽然只有两个接口,但这次任务跟以前测接口不同的是这两个接口有关联性,第二个接口的入参需要第一个接口的返回结果,返回结果中还有时间戳。

以前使用的是postman,还是从postman开始吧:1.打开postman,2.设置测试环境,3.创建接口,4.发送第一个接口成功返回后又手动的去复制返回结果到第二个接口的请求参数,5.改第二个接口的请求测试数据,6.执行接口。

这次测接口的数据case比较多,这么对于每一条数据case一系列下来感觉左右手一直在执行着粘贴复制点击的操作,因为对postman的认识仅限于简单的使用,一些复杂场景的使用还不了解,想着要不试下jmeter吧,幸运的是之前有配置过jmeter,果断使用起来,这么一使用便开始喜欢上这个工具了,有种相见恨晚的感觉,因为比我想象中的功能多很多。

jmeter的数据传递和处理(参数化):


1.前置处理器和后置处理器:

  • 前置处理器:在发送请求前对数据进行处理,比如有个发表评论不能和上一次相同的场景,这样就需要发送的内容是变化的了,这里选用BeanShell PreProcessor前置处理器,可以使用jmeter自身提供的api内容进行处理,也可以使用java处理。使用java处理可以引用外部的java文件(使用source引用),.class文件(编译后的java源码引入需要先用 addClassPath方法把.class文件路径加入,而且使用时先导入)或者jar文件(把java源码,导出加入到jmeter的xxx\lib\ext目录下)。
  • 后置处理器:可以用来处理请求之后返回的数据,比如从返回结果中提取需要的数据加入到jmeter变量中供下一个接口使用。jmeter提供了Bean Shell PostProcessor,CSS/Jquery Extractor,JSON Extractor,XML Extractor,Result Status Action Handler,正则表达式处理器等多种处理器,需要根据返回的数据特点选用不同的处理器,刚开始很二的选用正则表达式提取器从返回的json格式数据里提取数据,但正则表达式写起来很不方便而且还容易出错,于是改用json extractor了。

使用一个框架或者工具,感觉很好使的上手方法就是查看他们的日志,使用Bean Shell写完脚本可以先执行一次,看下日志输出是否出错来修改脚本。


2.测试数据:CSV Data Set Config用户定义的变量的节点

刚开始使用了用户定义的变量节点,把接口中使用的所有变量都定义在了这个里面,而且每增加一条数据测试需要改下原有的httpsampler或者再添加一条http Sampler,无形中增大了jmx脚本的大小。不知道jmx脚本大小对jmeter的执行效率有没有影响,但感觉还是文件小一点更好一些,于是选取CSV Data Set Config节点把测试数据放在了一个csv文件中。这样数据和sampler分离开来了,还有对excel使用也很熟悉,这样方便了数据集的修改管理,在使用csv这种数据集需要注意线程组中的循环次数,有多少行需要设置循环多少次。


见到其他同学提供的接口参数是json格式的,使用逗号分隔的csv容易出问题,这样就需要修改读取文件的方式,.txt或者.dat都是可采用的格式,在设置上不同而已,具体问题具体分析吧。

3.断言处理器

刚开始使用jmeter竟然忽略了csv是读取一行的,在csv中只设计了接口参数数据而忽略了返回的预期结果,每次执行完后在结果树里一个一个请求的检查返回是不是正确,一天下来眼睛都看花了。后来发现jmeter中断言处理器这么好使的一个节点,在设计特殊数据的时候顺便把预期结果设计好,使用断言处理器把json结果中的数据提取出来作为实际结果,这样减少了很多手动判断结果的时间,瞬间感觉自由时间多了。

线程组定时器和逻辑处理器


定时器

在测试过程中有个场景需要验证接口发送次数,比如常见的一分钟内能发送接收几次的验证码,或者多长时间内抽了几次奖,定时器还是挺实用的。这次只使用了固定定时器,在线程组中添加固定定时器节点,对于线程组中的每个http Sampler都会这么长时间的延时发送。如果通过设置1个线程组循环执行多少次,需要计算好执行的时长(调度器设置)。设置sampler延时执行还可以在sample之前添加think time,感觉没有加定时器更准确些,不知道是不是和每个thinktime节点的延时时间设置有关系,暂时没有试验。


逻辑处理器

目前用到的不多,上下关联的两个接口可以放在一块儿组成一个事务处理器,如果设置的线程数比较多,发送的数据量比较多这样控制一下结果会清晰很多;如果有些接口在循环执行中只需要执行一次,可以使用once only controller,比如用在登录,关注,取消关注这样的场景。


两个常用的结果监听器

  • 查看结果树监听器: jmeter提供了多种方式查看结果,从结果树中查看接口发送和接收的具体信息。


  • 聚合报告监听器: 聚合报告显示线程组执行过程中接口的执行情况,在进行压力测试的过程中可以简要查看执行情况。执行结束后也可以点击“Save Table Data”保存执行结果。 还有其他的监听器也可以用来作为压力测试的数据参考。

测试结果文件

jmeter的结果文件一般是.jtl格式文件,xml格式的,如果执行的时间比较久,请求参数很多,会生成一个很大的jtl,根据我们关注点不一样,我们可以对结果的节点进行设置,这样让结果文件小一点。然后可以结合其他语言python 或者 java对文件进行简单分析,比如统计各种请求返回码的比例,也可以使用现有的jtl文件通过jmeter提供的命令转换为html报告。


测试执行

执行jmeter脚本可以使用jmeter GUI执行,使用GUI直接打开GUI执行脚本就可以;也可以使用GUI设置好各个节点后使用命令执行,jmeter -n -t xxxjmeterscript.jmx -l xxxjmeterlog.jtl,这里-n 表示非 GUI 模式下运行 JMeter,-t表示要运行的 JMeter 测试脚本文件,-l 记录脚本的文件,常用的是-n,-t,-l,还有-r,启动远程服务,-H,设置 JMeter 使用的代理主机,-P,设置 JMeter 使用的代理主机的端口号,还没有试过。-e,在脚本执行结束后生成html报告,-o,用于存放html报告的路径;在使用命令生成html报告需要注意需要把jmeter.properties文件中的jmeter.save.saveservice.output_format保存格式改为csv,保存csv的时候,有些节点是必须设置的,如果为了减少csv文件大小,有些不关心的节点也可以省掉。

#---------------------------------------------------------------------------
# Results file configuration
#---------------------------------------------------------------------------

# This section helps determine how result data will be saved.
# The commented out values are the defaults.

# legitimate values: xml, csv, db.  Only xml and csv are currently supported.
jmeter.save.saveservice.output_format=csv


# true when field should be saved; false otherwise

# assertion_results_failure_message only affects CSV output
#jmeter.save.saveservice.assertion_results_failure_message=true
#
# legitimate values: none, first, all
#jmeter.save.saveservice.assertion_results=none
#
#data type is not required when generate html report,data type column can be removed from csv 
jmeter.save.saveservice.data_type=false
#jmeter.save.saveservice.label=true
jmeter.save.saveservice.response_code=true
# response_data is not currently supported for CSV output
jmeter.save.saveservice.response_data=true
# Save ResponseData for failed samples
#jmeter.save.saveservice.response_data.on_error=false
#jmeter.save.saveservice.response_message=true
#jmeter.save.saveservice.successful=true
#thread_name is required when generate html report,the thread_name column must be in csv column
jmeter.save.saveservice.thread_name=true
#jmeter.save.saveservice.time=true
#jmeter.save.saveservice.subresults=true
#jmeter.save.saveservice.assertions=true
#latency is required when generate html report,the latency column must be in csv column
jmeter.save.saveservice.latency=true
# Only available with HttpClient4
#jmeter.save.saveservice.connect_time=true
jmeter.save.saveservice.samplerData=true
jmeter.save.saveservice.responseHeaders=true
jmeter.save.saveservice.requestHeaders=true
#jmeter.save.saveservice.encoding=false
#bytes is required when generate html report,the bytes column must be in csv column
jmeter.save.saveservice.bytes=true
# Only available with HttpClient4
# sent_bytes is not required when generate html report,sent_bytes column can be removed from csv 
jmeter.save.saveservice.sent_bytes=false
#url is not required when generate html report,url column can be removed from csv 
jmeter.save.saveservice.url=false
#jmeter.save.saveservice.filename=false
#jmeter.save.saveservice.hostname=false
#jmeter.save.saveservice.thread_counts=true
jmeter.save.saveservice.sample_count=true
#jmeter.save.saveservice.idle_time=true

使用非GUI时,可以重新设置概要采集的时间间隔,默认的是30s

#
# interval between summaries (in seconds) default 30 seconds
summariser.interval=30

有个问题是设置了执行时长同一个脚本,使用命令执行时发送的请求数比用GUI的多一些,或许使用非GUI模式省下的资源有用在这里了。还有jmeter线程数设置可能也跟电脑性能有关系,设置到300以上总是报错,以下倒是可以。

压测过程

jmeter的压测过程中,数据的变化看起来不太直观,而且也不实时,jmeter提供了Backend Listener监听器,可以和influxDB和 Grafana这两个结合起来使用,这样jmeter把显示实时数据的任务交给其他工具展示。在配置过程中要注意2003是jmeter和influxdb通信的端口,还有个好像是8086,是influxdb和grafana通信的默认端口。

环境调通,接下来是在Grafana中设置图表要显示的项目,好不好看就全靠自己了,这也是一个慢慢熟练的过程,挺有趣的。

###问题

每次执行jmeter命令都要手动修改命令的各个参数后才开始执行,于是把参数生成和命令执行写在批处理文件中了,和直接在cmd窗口中输入命令执行不一样的地方是输出的内容不会写在指定的文件中了,暂时还不知道什么原因,用到的整个脚本是:

rem *** need to set java and jmeter system variables in advance.And need an executable jmx script,my script name is "zhengshihuanjingdata_v2" ***
rem get time and date for createing filename,
set CURRENTDATE=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%
echo  %CURRENTDATE%

set CURRENTTIME=%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%%TIME:~9,2%
echo  %CURRENTTIME%


set CURRENTTS=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%%TIME:~9,2%

set "CURRENTTS=%CURRENTTS: =%"
echo CURRENTTS

set JMXFILENAME=zhengshihuanjingdata_v2


rem create jtlreport,summaryreport,htmlreport directory in current dir if doesn't exist these.

set JTLFOLDER=jtlreport\
set SUMMARYFOLDER=summaryreport\
set HTMLFOLDER=htmlreport\

if exist %~dp0%JTLFOLDER% (
    rem jtlreport directoy exists
    echo jtlreport directoy exists
) else (
    rem jtlreport directoy doesn't exist,need to create
    echo %JTLFOLDER% directoy doesn't exist, create %JTLFOLDER%
    md %~dp0%JTLFOLDER%
)

if exist %~dp0%SUMMARYFOLDER% (
    rem summaryreport directoy exists
    echo %SUMMARYFOLDER% directoy exists
) else (
    rem summaryreport directoy doesn't exist,need to create
    echo %SUMMARYFOLDER% directoy doesn't exist, create %SUMMARYFOLDER%
    md %~dp0%SUMMARYFOLDER%
)

if exist %~dp0%HTMLFOLDER% (
    rem htmlreport directoy exists
    echo %HTMLFOLDER% directoy exists
) else (
    rem htmlreport directoy doesn't exist,need to create
    echo %HTMLFOLDER% directoy doesn't exist, create %HTMLFOLDER%
    md %~dp0%HTMLFOLDER%
)

pause
rem call bat2.bat %~dp0%JMXFILENAME% %~dp0%JTLFOLDER%%CURRENTTS% %~dp0%HTMLFOLDER%%CURRENTTS% %~dp0%SUMMARYFOLDER%%CURRENTTS%
jmeter -n -t %~dp0%JMXFILENAME% -l %~dp0%JTLFOLDER%%CURRENTTS%.jtl -e -o %~dp0%HTMLFOLDER%%CURRENTTS% ^>^> %~dp0%SUMMARYFOLDER%%CURRENTTS%.txt
pause

为了看下summary的数据,后来还是改用python实现将cmd的输出写入到文件中。

post请求参数中有中文

post请求是json格式的数据并且含有中文,在使用jmeter3.3的时候发送到服务器出现了乱码,虽然已经将cotent encoding设置成utf-8,还是需要先将中文转换为Unicode才行,不知道是我设置的问题还是3本身的问题,一样的设置在jmeter5上倒是很顺利。。


jmeter对非http接口的支持

目前接触到最多的就是http接口了,其他类型的接口用到再探索吧。

相关推荐

得物可观测平台架构升级:基于GreptimeDB的全新监控体系实践

一、摘要在前端可观测分析场景中,需要实时观测并处理多地、多环境的运行情况,以保障Web应用和移动端的可用性与性能。传统方案往往依赖代理Agent→消息队列→流计算引擎→OLAP存储...

warm-flow新春版:网关直连和流程图重构

本期主要解决了网关直连和流程图重构,可以自此之后可支持各种复杂的网关混合、多网关直连使用。-新增Ruoyi-Vue-Plus优秀开源集成案例更新日志[feat]导入、导出和保存等新增json格式支持...

扣子空间体验报告

在数字化时代,智能工具的应用正不断拓展到我们工作和生活的各个角落。从任务规划到项目执行,再到任务管理,作者深入探讨了这款工具在不同场景下的表现和潜力。通过具体的应用实例,文章展示了扣子空间如何帮助用户...

spider-flow:开源的可视化方式定义爬虫方案

spider-flow简介spider-flow是一个爬虫平台,以可视化推拽方式定义爬取流程,无需代码即可实现一个爬虫服务。spider-flow特性支持css选择器、正则提取支持JSON/XML格式...

solon-flow 你好世界!

solon-flow是一个基础级的流处理引擎(可用于业务规则、决策处理、计算编排、流程审批等......)。提供有“开放式”驱动定制支持,像jdbc有mysql或pgsql等驱动,可...

新一代开源爬虫平台:SpiderFlow

SpiderFlow:新一代爬虫平台,以图形化方式定义爬虫流程,不写代码即可完成爬虫。-精选真开源,释放新价值。概览Spider-Flow是一个开源的、面向所有用户的Web端爬虫构建平台,它使用Ja...

通过 SQL 训练机器学习模型的引擎

关注薪资待遇的同学应该知道,机器学习相关的岗位工资普遍偏高啊。同时随着各种通用机器学习框架的出现,机器学习的门槛也在逐渐降低,训练一个简单的机器学习模型变得不那么难。但是不得不承认对于一些数据相关的工...

鼠须管输入法rime for Mac

鼠须管输入法forMac是一款十分新颖的跨平台输入法软件,全名是中州韵输入法引擎,鼠须管输入法mac版不仅仅是一个输入法,而是一个输入法算法框架。Rime的基础架构十分精良,一套算法支持了拼音、...

Go语言 1.20 版本正式发布:新版详细介绍

Go1.20简介最新的Go版本1.20在Go1.19发布六个月后发布。它的大部分更改都在工具链、运行时和库的实现中。一如既往,该版本保持了Go1的兼容性承诺。我们期望几乎所...

iOS 10平台SpriteKit新特性之Tile Maps(上)

简介苹果公司在WWDC2016大会上向人们展示了一大批新的好东西。其中之一就是SpriteKitTileEditor。这款工具易于上手,而且看起来速度特别快。在本教程中,你将了解关于TileE...

程序员简历例句—范例Java、Python、C++模板

个人简介通用简介:有良好的代码风格,通过添加注释提高代码可读性,注重代码质量,研读过XXX,XXX等多个开源项目源码从而学习增强代码的健壮性与扩展性。具备良好的代码编程习惯及文档编写能力,参与多个高...

Telerik UI for iOS Q3 2015正式发布

近日,TelerikUIforiOS正式发布了Q32015。新版本新增对XCode7、Swift2.0和iOS9的支持,同时还新增了对数轴、不连续的日期时间轴等;改进TKDataPoin...

ios使用ijkplayer+nginx进行视频直播

上两节,我们讲到使用nginx和ngixn的rtmp模块搭建直播的服务器,接着我们讲解了在Android使用ijkplayer来作为我们的视频直播播放器,整个过程中,需要注意的就是ijlplayer编...

IOS技术分享|iOS快速生成开发文档(一)

前言对于开发人员而言,文档的作用不言而喻。文档不仅可以提高软件开发效率,还能便于以后的软件开发、使用和维护。本文主要讲述Objective-C快速生成开发文档工具appledoc。简介apple...

macOS下配置VS Code C++开发环境

本文介绍在苹果macOS操作系统下,配置VisualStudioCode的C/C++开发环境的过程,本环境使用Clang/LLVM编译器和调试器。一、前置条件本文默认前置条件是,您的开发设备已...