一、jemter简介
jmeter是apache公司基于java开发的一款开源压力测试工具,体积小,功能全,使用方便,是一个比较轻量级的测试工具,使用起来非常简 单。因为jmeter是java开发的,所以运行的时候必须先要安装jdk才可以。jmeter是免安装的,拿到安装包之后直接解压就可以使用,同时它在 linux/windows/macos上都可以使用。
jmeter可以做接口测试和压力测试。其中接口测试的简单操作包括做http脚本(发get/post请求、加cookie、加header、加权 限认证、上传文件)、做webservice脚本、参数化、断言、关联(正则表达式提取器和处理json-json path extractor)和jmeter操作数据库等等。
二、jmeter安装
由于jmeter是基于Java开发的一款测试工具,所以需要在安装java环境
(一)首先检查是否有安装jdk
检查方式,在cmd中输入java -version,出现如下信息,即已经安装好jdk,若未安装jdk,则看如下步骤
步骤一:
1、下载jdk,到官网下载jdk,地址:https://www.oracle.com/java/technologies/downloads/
2、安装jdk,下载完成后,双击安装
步骤二:配置jdk环境变量
右键计算机属性->高级系统设置->系统属性->高级->环境变量->添加如下的系统变量:
变量名:【JAVA_HOME】
变量值:【D:\Program Files\Java\jdk1.8.0_92】【jdk安装路径】
变量名:【path】
变量值:【\;%JAVA_HOME%\bin;】
变量名:【CLASSPATH】
变量值:【.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;】
步骤三:在cmd中输入java -version,检查是否显示jdk信息,确定是否安装成功
(二)安装Jmeter
1)下载Jmeter
官网地址:https://jmeter.apache.org/download_jmeter.cgi
2、解压Jmeter安装包
backups:脚本备份目录。格式是JMX
bin目录:存放Jmeter的启动脚本,配置文件,模块文件
jmeter.bat----启动文件
jmeter.properties ----核心配置文件
docs: 离线帮助文档
extras:存放第三方的集成文件,集成Ant,jenkins
lib目录:存放jar包
licenses:认证许可文件
步骤二:配置Jmeter环境变量
按下面变量名和变量值配置Jmeter系统环境变量:
【变量名】JMETER_HOME
【变量值】D:\jmeter\apache-jmeter-4.0(jmeter解压路径)
【变量名】CLASSPATH
【变量值】%JMETER_HOME\lib\ext\ApacheJMeter_core.jar;%JMETER_HOME%\lib\jorphan.jar;%JMETER_HOME%\lib\logkit-2.0.jar;
步骤三:启动Jmeter
双击Jmeter解压路径(apache-jmeter-4.0\bin)的bin下面的jmeter.bat或者是ApacheJMeter.jar,如下图
我这里展示的是一个改成中文的JMeter,英语好的小伙伴也可以不用改哈
默认中文:在jmeter/bin/jmeter.properties在language=en写入 language=zh_CN 默认查看结果处理展示编码为utf-8:jmeter/bin/jmeter.properties写入 sampleresult.default.encoding=utf-8 默认查看结果处理展示编码为utf-8
下面开始使用jmeter工具进行接口测试
接口测试的重点:
- 检查接口功能的正确性;
- 检查接口参数传递的正确性;
- 检查接口输出结果的正确性;
- 对各种异常情况的容错处理以及权限控制,分页,调用次数的限制
三、jmter的用法
3.1创建线程计划和线程组
右键–》添加–》线程–》线程组
- 设置线程数 ,如图所示
线程组:测试里的每个任务都要线程去处理,所以我们的任务必须在线程组下创建。创建步骤:“Test Plan(鼠标右键)”-> 添加 ->Threads(Users) -> 线程组”来建立它,然后在线程组面板里有几个输入栏:线程数、Ramp-Up Period(in seconds)、循环次数,其中Ramp-Up Period(in seconds)表示在这时间内创建完所有的线程。如有8个线程,Ramp-Up = 200秒,那么线程的启动时间间隔为200/8=25秒,这样的好处是:一开始不会对服务器有太大的负载。
Number of Threads(users): 一个用户占一个线程,100个线程就是模拟100个用户。
Ramp-Up Period(in seconds):设置线程需要多长时间全部启动。 如果线程数为200个,准备时长为10s,那么需要1秒钟就要启动20个线程,也就是每秒钟启动20个线程。
Loop Count:每个线程发送请求的次数。如果线程数为200 ,循环次数为10 ,那么每个线程发送10次请求。总请求数为200*10=2000 。如果勾选了“永远”,那么所有线程会一直发送请求,直到选择停止运行脚本。
- 添加请求,如图
设置请求方法,如图所示
请求报文的路径,也可以直接把要输入的内容写入路经中,如图:
或者是在csv或者txt文件中 如图:
模拟多个用户同时登录 这样大量的数据就需要保存在文件中
选取监听的方式
聚合报告界面
图形展示的设置的
表格展示
同时设true和线程的调度器的执行限制时间才能在规定的时间有效,如图
注意:
常用组件的执行顺序:测试计划》线程组》配置元件》前置处理器》定时器》取样器》后置处理器》断言》监听器
四、jmeter指标说明(注:其中)
1、表格显示,属性说明
Sample:每个请求的序号
Start Time:每个请求开始时间
Thread Name:每个线程的名称
Label:Http请求名称
Sample Time:每个请求所花时间,单位毫秒
Status:请求状态,如果为勾则表示成功,如果为叉表示失败。
Bytes:请求的字节数
样本数目:也就是上面所说的请求个数,成功的情况下等于你设定的并发数目乘以循环次数
平均:每个线程请求的平均时间
最新样本:表示服务器响应最后一个请求的时间
偏离:服务器响应时间变化、离散程度测量值的大小,或者,换句话说,就是数据的分布
2、聚合报告显示属性说明
Label:每个JMeter的element的Name值。例如HTTP Request的Name
#Samples:样本数量。多少个请求
Average:平均响应时间(单位:)。默认是单个Request的平均响应时间,当使用了TransactionController时,也可以以Transaction为单位显示平均响应时间
Median:中位数,也就是50%用户的响应时间
90%Line:90%用户的响应时间
95%Line:95%用户的响应时间
99%Line:99%用户的响应时间
注:为什么要有*%用户响应时间?因为在评估一次测试的结果时,仅仅有平均事物响应时间是不够的。假如有一次测试,总共有100个请求被响应,其中最小响应时间为0.02秒,最大响应时间为110秒,平均事务响应时间为4.7秒,你会不会想到最小和最大响应时间如此大的偏差是否会导致平均值本身并不可信?
我们可以在95 th之后继续添加96/ 97/ 98/ 99/ 99.9/ 99.99 th,并利用Excel的图表功能画一条曲线,来更加清晰表现出系统响应时间的分布情况。这时候你也许会发现,那个最大值的出现几率只不过是千分之一甚至万分之一,而且99%的用户请求的响应时间都是在性能需求所定义的范围之内的;如下图则是最低响应时间的值出现几率是很小的,实际99%的用户请求响应时间都要20000+。
Min:最小响应时间
Max:最大响应时间
Error%:本次测试中出现错误的请求的数量/请求的总数
Throughput:吞吐量。默认情况下标示每秒完成的请求数(具体单位如下图)
KB/sec:每秒从服务器端接收到的数据量。
3.summary Report属性说明
所有数据写入一个文件:保存测试结果到本地。
文件名:指定保存结果。
仅日志错误:仅保存日志中报错的部分。
Successes:保存日志中成功的部分。
Configure:设置结果属性,即保存哪些结果字段到文件。一般保存必要的字段 信息即可,保存的越多,对负载机的IO会产生影响。
Label:取样器名称(或者是事务名)。
#Samples:取样器运行次数(提交了多少笔业务)。
Average:请求(事务)的平均响应时间,单位为毫秒。
Min:请求的最小响应时间,单位为毫秒。
Max:请求的最大响应时间,单位为毫秒。
Std.Dev:响应时间的标准方差。
Error%:事务错误率。
Throughput:吞吐率(TPS)。
KB/sec:每秒数据包流量,单位是KB。
Avg.Bytes:平均数据流量,单位是Byte。
五、接口测试
一般分五个步骤:
1)添加线程组
2)添加http请求
3)在http请求中输入url、路径,请求方式和请求参数
4)查看结果树
(一) jmeter 发get/post请求
(二)jmeter 添加cookie
步骤:线程组(鼠标右键)》添加》配置元件》Http cookie管理器
cookie管理器使用方式分两种
- 自动:将cookie管理器添加到测试计划中,cookie管理器会自动记录指定域响应的cookie信息,并且在相同域中,下条请求会自动附加cookie信息
- 手动:有时候需要附件指定cookie,将cookie管理器添加到测试计划中或指定线程组中,点击添加手动添加cookie名、值、域
注意:手动添加cookie时必须添加域(网站域名)
自动:
手动添加cookie:
(三)jmeter 添加header
步骤:线程组(鼠标右键)》添加》配置元件》Http 信息头管理器
当然, 头部管理器也可以添加管理cookie, 与cookie管理器相比, 这里并不需要添加服务器域名
(四)jmeter 参数化
入参经常变化的话,则可以设置成一个变量,方便统一修改管理;如果入参要求随机或可多种选择,则通过函数生成器或者读取文件形成一个变量。
所以参数化有三种方式:用户定义的变量、函数生成器、读取文件。
1)用户定义的变量
步骤:线程组(鼠标右键)》添加》配置元件》用户定义的变量
2)函数生成器
步骤:选项》函数助手
需要用到函数助手功能,可以调用函数生成一些有规则的数据。常用的几个函数有_uuid、_random、_time。_uuid会生成一个随机唯一 的id,比如在避免java请求重发造成未处理数据太多的情况,接口请求可加一个唯一的请求id唯一的响应id进行一一对应;随机数_random,可以 在你指定的一个范围里取随机值;取当前时间_time,一些时间类的入参可以使用,如{__time(,)} 是生成精确到毫秒的时间戳、{__time(/1000,)}是生成精确到秒的时间戳、${__time(yyyy-MM-dd HH:mm:ss,)} 是生成精确到秒的当前时间。
3)读取数据文件
步骤:线程组(鼠标右键)》添加》配置元件》CSV 数据文件设置
1,在本地创建文件,例如在本地创建config.phone.txt文件,文件内容如下
2,新建Csv Data Set Config设置,并配置文件
3,修改请求中引用配置文件中的变量
4)jmeter 断言
步骤:线程组(鼠标右键)》添加》断言》响应断言
jmeter断言是检测请求响应返回值是否与我们的预期值是否一致,若针对整个线程的话,需要在线程组下添加断言-响应断言,若针对某个请求的话,需要改请求下添加断言-响应断言。
Substring:响应内容包含需要匹配的字符串,大小写敏感,不支持正则
包括:响应内容包含需要匹配的字符串,大小写敏感,支持正则
匹配:响应内容完全等于需要匹配的字符串,大小写敏感,支持正则
相等(Equals):响应内容完全等于需要匹配的字符串,大小写敏感,不支持正则
断言结果可以在察看结果树中显示
5)jmeter关联
接口请求之间存在参数调用,为了保存这个参数,建立jmeter关联。比如登陆接口和购买商品接口,购买商品接口就需要登陆接口返回的token等登陆信息,jmeter关联就可以保存这个token信息,方便购买商品接口使用。
jmeter关联可以通过二种方式来完成,获取到返回结果中指定的值。它们分别是正则表达式提取器、 json path extractor。
(1)正则表达式提取器
步骤:线程组(鼠标右键)》添加》后置处理器》正则表达式提取器
为了观察正则表达式提取的数据,需要添加调试取样器(Debug Sampler)
步骤:线程组(鼠标右键)》添加》sampler》调试取样器(Debug Sampler)
a. 关于正则表达式
():括起来的部分就是要提取的内容
.:匹配除换行符外任意的字符串
+:代表+号前面的字符必须至少出现一次(一次或多次)
*:代表*号前面的字符可以不出现,也可以出现一次或多次(0次、1次或者多次)
?:代表?号前面的字符最多可以出现一次,在找到第一个匹配项后就自动停止(0次或1次)
(.*):贪婪模式,匹配尽可能多的字符
(.*?)或(.+?):匹配尽可能少的字符,一旦匹配到第一个就不往下走了。
b. 关于模板
若想提取多个值的话,比如是a和b这两个值,则可以写成:$1$$2$。无论要提取多少个值,引用名称就是一个的,比如名称为id,${id_go}:获取整个字符串ab,${id_g1}:获取的是a,${id_g2}:获取的是b。
(2)json path extractor 提取
步骤:线程组(鼠标右键)》添加》后置处理器》JSON Extractor(或者 json path extractor)
jmeter通过安装json path extractor插件来处理json串,提取json串中的字段值。插件的下载地址:https://jmeter-plugins.org/?search=jpgc-json,下载完成,解压后,直接把lib文件夹放到jmeter相应目录下面。特别说明:jmeter 2.xx左右的版本尝试过无法使用该插件,在jmeter 3.xx左右的版本装完插件后能正常使用。
JsonPath中的“根成员对象”始终称为$,无论是对象还是数组。
JsonPath表达式可以使用点表示法
$.store.book [0].title
或括号表示法
$['store']['book'][0]['title']
6)jmeter 操作数据库
具体jmeter配置,参考此篇文章,比较详细
https://www.cnblogs.com/wolfshining/p/7516681.html
https://www.jianshu.com/p/918ca40e2016
驱动下载地址:
http://www.java2s.com/Code/Jar/c/Downloadcloudmysqlconnectorjava517binjar.htm
操作数据库基本有四个步骤:
(1)导入mysql的jdbc的jar包
(2)创建数据库的连接配置,线程组里添加配置元件-JDBC Connection Configuration
(3)线程组里》sampler》添加jdbc request,写sql语句
(4)添加察看结果树,点击启动按钮,就能看到执行的SQL。具体的实例如下截图所示
-
Variable Name:数据库连接池的名称,我们可以有多个jdbc connection configuration,每个可以起个不同的名称,在jdbc request中可以通过这个名称选择合适的连接池进行使用。
-
Database URL:数据库url,jdbc:oracle:thin:@host_ip or machine_name:Oracle 监听器监听的端口:Oracle实例的名 (可在oracel安装目录下tnsnames.ora文件中找到这些信息)
-
JDBC Driver class:JDBC驱动
-
username:数据库登陆的用户名
-
passwrod:数据库登陆的密码
执行jdbc 请求
-
Variable Name:数据库连接池的名字,需要与JDBC Connection Configuration的Variable Name Bound Pool名字保持一致
-
Parameter valus:参数值
-
Parameter types:参数类型,可参考:Javadoc for java.sql.Types
-
Variable names:保存sql语句返回结果的变量名
-
Result variable name:创建一个对象变量,保存所有返回的结果
-
Query timeout:查询超时时间
-
Handle result set:定义如何处理由callable statements语句返回的结果
特别说明:
jmeter还可以操作oracle、postgreSQL、msSQL、mongodb等等数据库,同时不同的数据库,JDBC Connection Configuration填写的Database url格式和JDBC Driver驱动名称也不相同。jmeter数据库驱动列表如下表所示:
六、压力测试
(一)jmeter在linux下进行压力测试
6.1、jmeter 在linux安装
简单说下,就是要先安装jdk,同时再配置环境变量,最后再上传jmeter压缩的安装包,在linux下解压完安装包就可以使用了。jmeter在linux运行
进入jmeter下的bin目录下运行脚本,未配置jmeter环境变量的条件下,运行的命令:
方式一:
./jmeter -n -t a.jmx -l res.jtl
其中a.jmx是准备好的jmeter脚本,res.jtl是测试结果文件,测试结果文件可以导入到jmeter察看结果树下查看
方式二:
./jmeter -n -t a.jmx -l res.jtl -e -o report
命令行参数:
-n:非界面方式运行
-t:指定jmx文件的位置
-l:指定生成jtl格式的结果
-e:生成HTML报告
-o:指定HTL报告的文件夹(这个文件夹必须是空目录)
6.2 jmeter+Ant+Jenkins实现持续集成
详细操作步骤可以参考:https://blog.csdn.net/wangmiaoyan/article/details/105457632
一)下载Ant并解压,解压之后把ant的bin目录设置到path环境变量中
下载地址:https://ant.apache.org/bindownload.cgi
1)系统变量->新建 ANT_HOME变量
变量值输入ant的安装目录(比如: D:\Sunny Wang\apache-ant-1.9.7)
2)系统变量->寻找 Path 变量->编辑
在最后输入: ;%ANT_HOME%\bin
进入cmd命令窗口,在CMD窗口中输入ant -version,敲击回城键,会显示出你安装的ANT版本,如果成功显示,说明你的配置应该是成功了
二)Jenkins与Ant整合
- 将Jmeter目录下extras子目录里的ant-jmeter-1.1.1.jar复制到ant所在目录lib子目录之下
- 修改Jmeter bin目录下jmeter.properties文件的配置:jmeter.save.saveservice.output_format=xml
- 工具文件夹有提供“两种报告样式”文件夹,分别其中jmeter.results.shanhe.me.xsl和jmeter-results-detail-report_21_TPS_90%_Received_OK.xsl两个文件拷贝到Jmeter目录下extras子目录里
- 在jmeter目录下新建jmeter_test文件夹,在jmeter_test下新建scripts文件夹,用于存放脚本build.xml
- 在jmeter_test下新建report文件夹,再在report下新建jtl及html文件夹,用于存放jtl文件及测试报告。
- 修改build文件内容。你需要准备一个jmeter的jmx文件
示例如下:
<?xml version="1.0" encoding="UTF-8"?> <project name="ant-jmeter-test" default="run" basedir="."> <tstamp> <format property="time" pattern="yyyyMMddhhmm" /> </tstamp> <!-- 需要改成自己本地的 Jmeter 目录--> <property name="jmeter.home" value="D:\jmeter\apache-jmeter-4.0" /> <!-- jmeter生成jtl格式的结果报告的路径--> <property name="jmeter.result.jtl.dir" value="D:\jmeter\apache-jmeter-4.0\jmeter_test\report\jtl" /> <!-- jmeter生成html格式的结果报告的路径--> <property name="jmeter.result.html.dir" value="D:\jmeter\apache-jmeter-4.0\jmeter_test\report\html" /> <!-- 生成的报告的前缀--> <property name="ReportName" value="TestReport" /> <property name="jmeter.result.jtlName" value="${jmeter.result.jtl.dir}/${ReportName}${time}.jtl" /> <property name="jmeter.result.htmlName" value="${jmeter.result.html.dir}/${ReportName}${time}.html" /> <target name="run"> <antcall target="test" /> <antcall target="report" /> </target> <target name="test"> <taskdef name="jmeter" classname="org.programmerplanet.ant.taskdefs.jmeter.JMeterTask" /> <jmeter jmeterhome="${jmeter.home}" resultlog="${jmeter.result.jtlName}"> <!-- 声明要运行的脚本。"*.jmx"指包含此目录下的所有jmeter脚本--> <testplans dir="D:\Sunny Wang\apache-jmeter-4.0\TEST" includes="unicom.jmx" /> <property name="jmeter.save.saveservice.output_format" value="xml"/> </jmeter> </target> <path id="xslt.classpath"> <fileset dir="${jmeter.home}/lib" includes="xalan*.jar"/> <fileset dir="${jmeter.home}/lib" includes="serializer*.jar"/> </path> <target name="report"> <tstamp><format property="report.datestamp" pattern="yyyy/MM/dd HH:mm"/></tstamp> <xslt classpathref="xslt.classpath" force="true" in="${jmeter.result.jtlName}" out="${jmeter.result.htmlName}" style="${jmeter.home}/extras/jmeter-results-detail-report_21.xsl" > <param name="dateReport" expression="${report.datestamp}"/> </xslt> <!-- 因为上面生成报告的时候,不会将相关的图片也一起拷贝至目标目录,所以,需要手动拷贝 --> <copy todir="${jmeter.result.html.dir}"> <fileset dir="${jmeter.home}/extras"> <include name="collapse.png" /> <include name="expand.png" /> </fileset> </copy> </target> </project>
三)设置jenkins全局工具配置
前面jenkins下载的插件下载完成后,进入到系统管理,在全局工具配置中配置jdk及ant,写上本地的地址即可
四)新建item-Freestyle project
五)立即构建
结果:
(二)压力测试场景
压力测试分两种场景:
第一种是单场景,压一个接口的;
第二种是混合场景,多个有关联的接口。压测时间,一般场景都运行10-15分钟。如果是疲劳测试,可以压一个小时、一天或一周,根据实际情况来定。
(三)压测任务需求的确认
压测前要明确压测功能和压测指标,一般需要确定的几个问题:
1,固定接口参数进行压测还是进行接口参数随机化压测?
2,要求支持多少并发数?
3,TPS(每秒钟处理事务数)目标多少?响应时间要达到多少?
4、压服务器名称还是压服务器IP,一般都是压测指定的服务器
(四)压测设置
1,线程数:并发数量,能跑多少量。具体说是一次存在多少用户同时访问
2,Rame-Up Period(in seconds):表示JMeter每隔多少秒发动并发。理解成准备时长:设置虚拟用户数需要多长时间全部启动。如果线程数是20,准备时长为10,那么需要10秒钟启动20个数量,也就是每秒钟启动2个线程。
3,循环次数:这个设置不会改变并发数,可以延长并发时间。总请求数=线程数*循环次数
4,调度器:设置压测的启动时间、结束时间、持续时间和启动延迟时间。
(五)压测结果查看
运行完后,聚合报告会显示压测的结果。主要观察Samples、Average、error、Throughput。
1,Samples:表示一共发出的请求数
2,Average:平均响应时间,默认情况下是单个Request的平均响应时间(ms)
3,Error%:测试出现的错误请求数量百分比。若出现错误就要看服务端的日志,配合开发查找定位原因
4,Throughput:简称tps,吞吐量,默认情况下表示每秒处理的请求数,也就是指服务器处理能力,tps越高说明服务器处理能力越好。
(六)压测结果的分析
有错误率同开发确认,确定是否允许错误的发生或者错误率允许在多大的范围内;
1、Throughput吞吐量每秒请求的数大于并发数,则可以慢慢的往上面增加;
若在压测的机器性能很好的情况下,出现吞吐量小于并发数,说明并发数不能再增加了,可以慢慢的往下减,找到最佳的并发数;压测结束,登陆相应的web服务器查看CPU等性能指标,进行数据的分析;
2、最大的tps:不断的增加并发数,加到tps达到一定值开始出现下降,那么那个值就是最大的tps。
3、最大的并发数:最大的并发数和最大的tps是不同的概率,一般不断增加并发数,达到一个值后,服务器出现请求超时,则可认为该值为最大的并发数。
4、压测过程出现性能瓶颈,若压力机任务管理器查看到的cpu、网络和cpu都正常,未达到90%以上,则可以说明服务器有问题,压力机没有问题。
5、影响性能考虑点包括:数据库、应用程序、中间件(tomact、Nginx)、网络和操作系统等方面。
七:Jmeter设置代理服务器进行抓包
1)HTTP代理服务器
1.1 添加HTTP代理服务器+线程组
步骤1:新建一个干净的线程组,并添加上HTTP Cookie 管理器和察看结果树
步骤2:测试计划(鼠标右键)》添加》非测试元件》HTTP代理服务器
步骤3,设置jmeter 的HTTP代理服务器
2) 设置浏览器代理
设置浏览器代理:IP录入你本地电脑IP。端口填写JmeterHTTP代理服务器设置的端口一致即可,设置完点击保存
3)启动代理进行抓包
浏览器设置代理后,必须要点启动否则浏览器将无法连接到网络
正常启动后,在设置浏览器的网页访问你要抓包的域名,然后返回Jmeter就可以查看到对应的请求信息
Request Filtering 设置包含模式+排除模式
包含模式 .*xfdjm\.kt3\.pagoda\.com\.cn.* 意思是我需要 xfdjm.kt3.pagoda.com.cn
排除模式 .*\.(js|css|png|jpg|ico|png|gif).意思是我需要排除里面的图片.png
在察看结果数里还可以成功看到请求返回的数据信息,当前只限于抓HTTP,想要抓取HTTPS安装证书即可,后续在进行补充
感谢分享:https://blog.csdn.net/fenlin88l/article/details/89394704