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

jmeter 使用总结

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

背景

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

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

以前使用的是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接口了,其他类型的接口用到再探索吧。

相关推荐

当Frida来“敲”门(frida是什么)

0x1渗透测试瓶颈目前,碰到越来越多的大客户都会将核心资产业务集中在统一的APP上,或者对自己比较重要的APP,如自己的主业务,办公APP进行加壳,流量加密,投入了很多精力在移动端的防护上。而现在挖...

服务端性能测试实战3-性能测试脚本开发

前言在前面的两篇文章中,我们分别介绍了性能测试的理论知识以及性能测试计划制定,本篇文章将重点介绍性能测试脚本开发。脚本开发将分为两个阶段:阶段一:了解各个接口的入参、出参,使用Python代码模拟前端...

Springboot整合Apache Ftpserver拓展功能及业务讲解(三)

今日分享每天分享技术实战干货,技术在于积累和收藏,希望可以帮助到您,同时也希望获得您的支持和关注。架构开源地址:https://gitee.com/msxyspringboot整合Ftpserver参...

Linux和Windows下:Python Crypto模块安装方式区别

一、Linux环境下:fromCrypto.SignatureimportPKCS1_v1_5如果导包报错:ImportError:Nomodulenamed'Crypt...

Python 3 加密简介(python des加密解密)

Python3的标准库中是没多少用来解决加密的,不过却有用于处理哈希的库。在这里我们会对其进行一个简单的介绍,但重点会放在两个第三方的软件包:PyCrypto和cryptography上,我...

怎样从零开始编译一个魔兽世界开源服务端Windows

第二章:编译和安装我是艾西,上期我们讲述到编译一个魔兽世界开源服务端环境准备,那么今天跟大家聊聊怎么编译和安装我们直接进入正题(上一章没有看到的小伙伴可以点我主页查看)编译服务端:在D盘新建一个文件夹...

附1-Conda部署安装及基本使用(conda安装教程)

Windows环境安装安装介质下载下载地址:https://www.anaconda.com/products/individual安装Anaconda安装时,选择自定义安装,选择自定义安装路径:配置...

如何配置全世界最小的 MySQL 服务器

配置全世界最小的MySQL服务器——如何在一块IntelEdison为控制板上安装一个MySQL服务器。介绍在我最近的一篇博文中,物联网,消息以及MySQL,我展示了如果Partic...

如何使用Github Action来自动化编译PolarDB-PG数据库

随着PolarDB在国产数据库领域荣膺桂冠并持续获得广泛认可,越来越多的学生和技术爱好者开始关注并涉足这款由阿里巴巴集团倾力打造且性能卓越的关系型云原生数据库。有很多同学想要上手尝试,却卡在了编译数据...

面向NDK开发者的Android 7.0变更(ndk android.mk)

订阅Google官方微信公众号:谷歌开发者。与谷歌一起创造未来!受Android平台其他改进的影响,为了方便加载本机代码,AndroidM和N中的动态链接器对编写整洁且跨平台兼容的本机...

信创改造--人大金仓(Kingbase)数据库安装、备份恢复的问题纪要

问题一:在安装KingbaseES时,安装用户对于安装路径需有“读”、“写”、“执行”的权限。在Linux系统中,需要以非root用户执行安装程序,且该用户要有标准的home目录,您可...

OpenSSH 安全漏洞,修补操作一手掌握

1.漏洞概述近日,国家信息安全漏洞库(CNNVD)收到关于OpenSSH安全漏洞(CNNVD-202407-017、CVE-2024-6387)情况的报送。攻击者可以利用该漏洞在无需认证的情况下,通...

Linux:lsof命令详解(linux lsof命令详解)

介绍欢迎来到这篇博客。在这篇博客中,我们将学习Unix/Linux系统上的lsof命令行工具。命令行工具是您使用CLI(命令行界面)而不是GUI(图形用户界面)运行的程序或工具。lsoflsof代表&...

幻隐说固态第一期:固态硬盘接口类别

前排声明所有信息来源于网络收集,如有错误请评论区指出更正。废话不多说,目前固态硬盘接口按速度由慢到快分有这几类:SATA、mSATA、SATAExpress、PCI-E、m.2、u.2。下面我们来...

新品轰炸 影驰SSD多款产品登Computex

分享泡泡网SSD固态硬盘频道6月6日台北电脑展作为全球第二、亚洲最大的3C/IT产业链专业展,吸引了众多IT厂商和全球各地媒体的热烈关注,全球存储新势力—影驰,也积极参与其中,为广大玩家朋友带来了...