使用Apache JMeter做性能测试

1、JMeter新建一个测试工程
默认包含两个部分:测试计划和工作台。

2、 “测试计划”下添加“线程组”
测试计划–添加–Threads(Users)–线程组
设置“线程组”
线程数:并发数
Ramp-Up Period:并发数从0到设定值花费多少时间(单位:秒)
循环次数:每个并发循环的次数,可通过调度器设置运行时长

3、添加“HTTP请求默认值”
测试计划–线程组–添加–配置元件–HTTP请求默认值
如果是在同一个网站下做测试,可添加该“配置元件”,设置默认的服务器ip和端口,后面添加的“HTTP请求”取样器就不需要每个都设置ip和端口,只需要设置路径即可。

4、添加“HTTP Cookie管理器”
测试计划–线程组–添加–配置元件–HTTP Cookie管理器
当测试的网站需要登陆后才可访问,需添加该“配置元件”,配置项均默认即可。
之后的每个请求需要用到登录的cookie时。
在这里插入图片描述
设置之后,之后请求信息头会带上登录返回的cookie信息
在这里插入图片描述

5、添加“取样器”->“HTTP请求”
测试计划–线程组–添加–Sampler–HTTP 请求

设置“HTTP请求”
填写协议,方法,路径,勾选Use KeepAlive
a. 设置请求协议为“http”,方法一般为get或post,可以通过httpwatch工具查看。
b. 发送请求用到的参数有专门的录入域做设置。
c. 如果使用了HTTP Cookies管理器,就不要勾选“自动重定向”和“跟随重定向”了,这里指的是同一线程组下添加的所有“HTTP 请求”。

请求参数包括中文,content encoding填写UTF-8

入参3种方式
Parameters:一个一个参数填写
Body Data:信息体
Files Upload:请求参数中包含附件
把除了文件之外的其他参数接在接口后面,文件的参数名称和类型取抓包工具中的数据。
举例:
url为:http://icore-agr-gateway-stg1.paic.com.cn/agr-accept/farmerbills/import/farmerList
入参的Form data如下
------WebKitFormBoundaryH2uL9l8yMqdimyrp
Content-Disposition: form-data; name=“technicProductCode”
TP1400051
------WebKitFormBoundaryH2uL9l8yMqdimyrp
Content-Disposition: form-data; name=“departmentCode”
21136
------WebKitFormBoundaryH2uL9l8yMqdimyrp
Content-Disposition: form-data; name=“applyPolicyNo”
51136003900218703236
------WebKitFormBoundaryH2uL9l8yMqdimyrp
Content-Disposition: form-data; name=“riskType”
------WebKitFormBoundaryH2uL9l8yMqdimyrp
Content-Disposition: form-data; name=“farmersCountStart”
------WebKitFormBoundaryH2uL9l8yMqdimyrp
Content-Disposition: form-data; name=“insuredNumberStart”
------WebKitFormBoundaryH2uL9l8yMqdimyrp
Content-Disposition: form-data; name=“isGovSubsidy”
1
------WebKitFormBoundaryH2uL9l8yMqdimyrp
Content-Disposition: form-data; name=“file”; filename=“传统种植清单模板.csv”
Content-Type: application/vnd.ms-excel
------WebKitFormBoundaryH2uL9l8yMqdimyrp–

jmeter的http请求里填写:
url为
http://icore-agr-gateway-stg1.paic.com.cn/agr-accept/farmerbills/import/farmerList?technicProductCode=TP1400023&departmentCode=21136&applyPolicyNo=${applyPolicyNo}

不需要http信息头管理工具,
勾选跟随重定向,use keepalive,use multipart/form-data for POST

files upload填写文件名称,参数名称,MIME类型
文件名称:D:\work\农险\jmeter\暂存\test1-MP14000027.csv
参数名称:file
MIME类型:application/vnd.ms-excel

6、请求数据的参数化及传递–从外部文件传入数据文件
测试计划–线程组–添加–配置元件–CSV Data Set Config
在对应HTTP 请求下添加配置元件“CSV Data Set Config”,指定文件路径及解析格式。
举例:
Filename:one-vehicleframe.csv
Variable Names:vehicleFrameNO1,engineNO1,vehicleLicenceCode1
Delimiter:,
Allow Quoated data:True
Recycle on EOF:False
Stop Thread EOF:True
Sharing Mode:All threads

a)Filename:文件路径,例子中指定的是相对路径(Jmeter3.1\apache-jmeter-3.1\bin),也可以填写绝对路径;
b)Delimiter:分隔符,例子中使用逗号
c)Variable Names:参数名字,多个参数用分隔符分隔(数据文件中首行不需要写对应的参数名)
文件内容如下
911WAA1S1234TW156 ASD2323dvxzs5488 赣D-3WS349
911WAA1S1234TW157 ASD2323dvxzs5489 -
911WAA1S1234TW158 ASD2323dvxzs5490 赣D-3WS350
911WAA1S1234TW159 ASD2323dvxzs5491 -

d)、Allow Quoated data: 双引号相关,例:如果参数中需包含,或者”等,该项可以选择True。
e)、Recycle on EOF: 设置为True后,允许循环取值
f)、Stop Thread EOF:
当Recycle on EOF为false并且Stop Thread EOF 为true,则读完csv文件中的记录后,停止运行,线程数及执行次数无效。
g)、Sharing Mode:共享模式:
All threads:所有线程,所有线程循环取值,
线程1取第一行,线程二取下一行。
Current thread group:当前线程组,各个线程组分别循环取值。
线程1取第一行,第二行,第三行…线程2取第一行,第二行,第三行…线程3取第一行,第二行,第三行…
Current thread:当前线程
该测试计划内的所有线程都取第一行。

7、请求数据的参数化及传递——从上一个请求的响应中提取参数
对应的http请求–添加–后置处理器–正则表达式提取器
在需提供参数值的请求下添加“后置处理器”->“正则表达式提取器”。

a)引用名称:提取后生成的参数名称,供下别的请求调用;
b)正则表达式:填写响应信息里的代码段,“()”内部是要提取的内容,填写正则表达式,“()”两端是定位信息;
c)模板:格式为“ n n n”,n为数字,表示需提取第n个匹配的值
d)匹配数字:0表示随机,-1表示所有,1表示精确匹配值;

举例:
引用名称:mainquotation
正则表达式:mainQuotationNo = '(.
)';
模板: 1 1 1
匹配数字:1

解释:提取第一个格式为mainQuotationNo = ‘xxxxx’; 的数据里的xxxxx值**

参数 释义
a)引用名称: 在HTTP等请求中,引用此数据,需要用到的名称
b)正则表达式: 用于将需要的数据提取出来
c)模板 :表示使用提取到的第几个值:
− 1 -1 1:表示取所有值
0 0 0:表示随机取值
1 1 1:表示取第1个
2 2 2:表示取第二个
以此类推: n n n:表示取第n个
d)匹配数字:(0代表随机) 0 代表随机取值,1 代表全部取值
e)缺省值: 如果正则表达式没有搜找到值,则使用此缺省值

举例子
在这里插入图片描述
8、请求数据的参数化及传递——参数传递引用
当上一个请求已声明参数名称后,可在后续的请求中做引用,语法是${参数名}
${mainQuotationNo }

9、添加断言
对应的http请求–添加–断言–响应断言
添加断言作为检查点,一遍需要从响应文本中匹配目标字符串即可。

a)apply to
应用范围: main sample and sub sample, main sample only , sub-sample only , jmeter variable
关于应用范围,我们大多数勾选“main sample only” 就足够了,因为我们一个请求,实质上只有一个请求。但是当我们发一个请求时,可以触发多个服务器请求,类似于ajax那种,那么就有main sample 和 sub-sample之分了。
此外,对于有重定向的请求,并且勾选了“跟随重定向”, 那么这两个请求都是 sub-sample,重定向后的请求(第二个请求)就是main-sample
b)响应字段:
响应文本,Document(Text),url样本,响应代码,响应信息,Response Header,ignore status
响应文本: 服务器响应文本,一般普通http响应,都勾选这个。
c)模式匹配规则:
包括,匹配,equals,substring

1、包括:返回结果包括你指定的内容,支持正则匹配
例如:
响应字段为: 响应文本
模式匹配规则:包括
断言为:1、invalid 2、[a-z]+
当返回值为:{“msg”:“channel invalid.”} , 这两个断言都是ok的,返回true
2、匹配:
(1) 相当于 equals 。当返回值固定时,可以返回值做断言,效果和equals相同
(2) 正则匹配 。 用正则表达式匹配返回结果,但必须全部匹配。 即正则表达式必须能匹配整个返回值,而不是返回值的一部分。
例如:
响应字段为: 响应文本
模式匹配规则:匹配
断言为:1、{“msg”:“channel invalid.”} 2、{“msg”:“[a-z]+ invalid.”} , 3、[a-z]+
当返回值为:{“msg”:“channel invalid.”} ,断言1 2 是ok的, 断言3是false
当返回值为:{“msg”:“channel invalid.”} , 断言1 3是false, 断言2才是ok的。
原因是,断言1 只能用于equals,而断言3 只匹配了返回值部分,而不是全部匹配。
3、Equals : 返回结果与你指定断言完全一致
4、SubString:与 “包括”差不多,都是指返回结果包括你指定的内容,但是subString不支持正则字符串
例如:
响应字段为: 响应文本
模式匹配规则:SubString
断言为:1、invalid 2、[a-z]+
当返回值为:{“msg”:“channel invalid.”} , 断言1返回true, 但断言2返回false
5否:就相当于取反。
如果上面断言结果为true,勾选“否”后,最终断言结果为false。如果上面断言结果为false,勾选“否”后,则最终断言结果为 true。

10、HTTP信息头管理器
对应的http请求–添加–配置元件–HTTP信息头管理器
填写该请求的一些信息头信息
比如
名称: Content-Type
值: application/json;charset=utf-8

信息头管理器配置在http请求下面,代表该信息头只对当前http请求生效。
信息头管理器配置在线程组下面,代表该信息头对该线程组的所有http请求生效。

11、取list中数据
返回结果是list,从list里取数据,例如:
{“statuscode”:200,”data”:[{“code”:”54214”,”id”:”155”,”name”:”1455”}]}
取data的id
$.data[0].id

参考
http://blog.csdn.net/wxyyxc1992/article/details/31069617

12、用户定义的变量
测试计划–线程组–添加–配置元件–用户定义的变量
“名称”:变量名称
“值”:
1)可以直接输入值,
2)也可以通过Jmeter的函数__CSVRead,__StringFromFile从csv或dat文件中读取
当参数值没有规律的且量不太大时,可以通过KaTeX parse error: Expected group after '_' at position 2: {_̲_CSVRead(,)},{__StringFromFile(,)}从文件中读取

如将用户名和密码保存在user.csv文件中,user.csv的内容如下:
oriana,123456
admin,admin
dandan,123456

因为user.csv文件中有两列数据,所以只能用KaTeX parse error: Expected group after '_' at position 2: {_̲_CSVRead(,)}函数 …{__CSVRead(user.csv,0)},
password参数后的值设为${__CSVRead(user.csv,1)}。

3)还可以通过前缀加随机数的方法设置参数。
当参数值是某个前缀加一个数字时,可以用前缀名加KaTeX parse error: Expected group after '_' at position 2: {_̲_Random(,,)}或{__threadNum}的方法设置参数值。

如进行登录测试之前,先准备了用户名为perf_0到perf_1000的用户,
那么用户名就可以设为perf_{__Random(0,1000,)}。

http://www.51testing.com/html/12/252512-222896.html

ps: 使用Jmeter自带函数获取参数值

Jmeter中可以产生值的函数有:__Random( , , ),__threadNum,__CSVRead( , ),__StringFromFile( , , , ) [补充各函数调用方法如下:
a)__Random( , , ),获取值的方式:KaTeX parse error: Expected group after '_' at position 2: {_̲_Random( param1…{__threadNum},这个函数没有任何参数,它用于得到当前运行的线程编号。
c)__CSVRead( , ),获取值的方式:KaTeX parse error: Expected group after '_' at position 2: {_̲_CSVRead(param1…{__StringFromFile(param1,param2,param3)},param1是文件名,param2、param3为选填项:param2—存储结果的变量,param3—文件开始列,网上找到一点此函数的用法,来自:http://www.cnblogs.com/morebetter/archive/2005/03/04/112871.html
1.函数: S t r i n g F r o m F i l e ( 文件名 . d a t ) 2. 外部文件的格式必须为 . d a t 3. 默认读取位置为 / b i n 下,也可以自己设定文件存放路径,如: {_StringFromFile(文件名.dat)} 2.外部文件的格式必须为.dat 3.默认读取位置为/bin下,也可以自己设定文件存放路径,如: StringFromFile(文件名.dat)2.外部文件的格式必须为.dat3.默认读取位置为/bin下,也可以自己设定文件存放路径,如:{_StringFromFile(e:user.dat)},从e盘下读取user.dat文件中的数据
4.每次读取文件中的一行
5.如果我有多个user文件,想一起读取,文件名分别为user1 user2。函数写为:KaTeX parse error: Expected '}', got '#' at position 22: …ngFromFile(user#̲.dat,,1,2)},从默认…{_StringFromFile(user.dat,2)},user1文件读取2次

【说明】关于Jmeter的函数使用,可以用Jmeter的函数助手对话框:点击Jmeter的“选项”,选择“函数助手对话框”(或者使用快捷键“Ctrl+F”),在“选择一个功能”的下拉框中选择你所要是有的函数,在函数参数列表的“值”这一栏,填写好相应的参数值,点击按钮【生成】,就可以拷贝生成的函数字符串进行使用了。用函数助手生成函数__Random字符串的截图如下:
在这里插入图片描述
生成函数
在这里插入图片描述

13、 等待时间
第一部分:Request之间的等待时间的设置
对应的http请求–添加–定时器–
先明确一些概念:
1)定时器是在每个sampler(采样器)之前执行的,而不是之后;不管这个定时器的位置放在sampler之后,还是之下,它都在sampler之前得到执行。
2)定时器是有作用域的;当执行一个sampler之前时,所有当前作用域内的定时器都会被执行;
3)如果希望定时器仅应用于其中一个sampler,则把该定时器作为子节点加入;
4)如果希望在sampler执行完之后再等待,则可使用Test Action;

一、固定定时器(Constant Timer)
这是最重要的定时器。
需要注意的是,固定定时器的延时不会计入单个sampler的响应时间,但会计入事务控制器的时间。
定时器时长并不计入请求的响应时间,但被计入“事务控制器”的总时间
对loadrunner的think time和pacing这两个概念
对于这个http请求(sampler)来说,定时器相当于loadrunner中的pacing;对于“事务控制器”来说,定时器相当于loadrunner中的think time。

我们通常说的响应时间,应该大部分情况下是针对某一个具体的sampler(http请求),而不是针对一组sampler组合的事务
当放置Constant Timer于两个http请求之间,那么它代表的含义是:在上一个请求发出至完成后,开始Contant Timer指定的时间,最后再发出第二个请求.它并不是代表两个请求之间的发送间隔时间.
第一个请求发出,经过1.36s时间完成接收,再等待Constant Timer的1s,再开始第二个请求。

二、高斯随机定时器(Gaussian Random Timer)
基本同上,只是定时器的延时时间是在指定范围内的正态分布。
三、均匀随机定时器(Uniform Random Timer)
同上,延时时间是在指定范围内,并且每个时间取值的概率相同。
四、固定吞吐量定时器(Constant Throughput Timer)
可以让JMeter以指定数字的吞吐量(即指定TPS,只是这里要求指定每分钟的执行数,而不是每秒)执行。吞吐量计算的范围可以为指定为当前线程、当前线程组、所有线程组,并且计算吞吐量的依据可以是最近一次线程的执行时延。
相信这种定时器在特定的场景下,还是很有用的。
五、同步定时器(Synchronizing Timer)
在该定时器处,使线程等待,一直到指定的线程个数达到后,再一起释放。可以在瞬间制造出很大的压力。
没错,它和loadrunner的集合点(rendezvous point)差不多的功能。
六、BeanShell定时器(BeanShell Timer)
这个定时器,平时用不上。但实际上,它是最强大的,因为可以自己编程实现想要干的任何事。
有复杂需求时,就要靠它了。例如,希望在每个线程执行完等待一下,或者希望在某个变量达到指定值的时候等待一下。

第二部分:线程之间的时间设置
测试计划–线程组–添加–Sampler–Test Action
持续压力测试时,当线程完成所有的动作进行第二次操作时需要设置一定的等待时间,把它放在所有的请求后面即可。
选择:pause,设置等待时间

14、添加监听器——用表格查看结果
测试计划–线程组–添加–监听器–用表格查看结果
该视图可详细列出每个线程每次请求的状态,使用意义不是太大

15、添加监听器——聚合报告
测试计划–线程组–添加–监听器–聚合报告
显示每个请求的采样率(运行次数)、最小、最大、平均、90%线内响应时间,差错率,吞吐量,流量(接收、发送)等统计信息,使用意义很大,属于必须的结果数据。
时间单位ms
TPS:每秒事物处理数
压测:到CPU70%,TPS最大值,相应时间变得很大再压就时间变小。得到最大并发量和最佳并发量

请求名称 请求数量 平均响应时间 90%响应时间 错误率 吞吐量(换算成s是TPS)

16、添加监听器——查看结果树
测试计划–线程组–添加–监听器–查看结果树
可以显示每个请求的状态,并能查看详细信息,调试阶段使用意义很大。
可以对返回结果选择正则调试、json调试
在这里插入图片描述
可以点击查看日志
在这里插入图片描述
17、添加监听器——图形结果
测试计划–线程组–添加–监听器–图形结果
可直观显示响应时间曲线,作为报告辅助资料。

18、jmeter导入jar包
使用jmeter实现对jar包的调用
参看 https://blog.csdn.net/dushu990/article/details/51719630

如何在Jmeter中使用外部的java文件
https://blog.csdn.net/quiet_girl/article/details/50747666

19、json提取器

在这里插入图片描述

1)Apply to:应用范围
2)Names of created variables :接收值的变量名,自定义,多个变量用分号分隔
3)JSON Path expression: json path表达式,也是用分号分隔

$.info.indexes[9]._id  表示:第1层为info,第二层为indexes,取下标为9的第二层数据,第三层为_id。

4)Match No.(0 for Random):0表示随机;n取第几个匹配值;-1匹配所有。若只要获取到匹配的第一个值,则填写1
5)Compute concatenation var(suffix_ALL):如果找到许多结果,则插件将使用’ , '分隔符将它们连接起来,并将其存储在名为 _ALL的var中
6)Default Values: 缺省值,匹配不到值的时候取该值,可写error。

使用json提取器,或者在查看结果树查看json数据,报错。

java.lang.NoClassDefFoundError: Could not initialize class org.apache.jmeter.extractor.json.jsonpath.JSONManager

将json-path-0.8.1.jar和json-smart-1.1.1.jar删除
使用json-path-2.4.0.jar和json-smart-2.3.jar

在这里插入图片描述

20、linux上执行jemter
配置环境变量

vi /etc/profile
export JMETER_HOME=/home/jmeter/apache-jmeter-5.2.1
export CLASSPATH=$JMETER_HOME/lib/ext/ApacheJMeter_core.jar:$JMETER_HOME/lib/jorphan.jar:$CLASSPATH
export PATH=$JMETER_HOME/bin:$PATH
source /etc/profile

检查是否成功

[root@zlbz-auto bin]# jmeter -v
    _    ____   _    ____ _   _ _____       _ __  __ _____ _____ _____ ____
   / \  |  _ \ / \  / ___| | | | ____|     | |  \/  | ____|_   _| ____|  _ \
  / _ \ | |_) / _ \| |   | |_| |  _|    _  | | |\/| |  _|   | | |  _| | |_) |
 / ___ \|  __/ ___ \ |___|  _  | |___  | |_| | |  | | |___  | | | |___|  _ <
/_/   \_\_| /_/   \_\____|_| |_|_____|  \___/|_|  |_|_____| |_| |_____|_| \_\ 5.2.1

Copyright (c) 1999-2019 The Apache Software Foundation

修改jmeter.properties配置

jmeter.save.saveservice.output_format=csv

执行脚本

jmeter -n -t /home/probeTest/probe-test.jmx -l /home/probeTest/jtl/probe-test-06051340.jtl -e -o /home/probeTest/report/report-06051340

-n:以NoGUI方式运行脚本
-t:后面接脚本名称
-l:后面接日志名称,保存运行结果
-e: 测试结束后,生成测试报告
-o: 指定测试报告的存放位置

带参数执行脚本

JVM_ARGS="-Xms10g -Xmx20g" /tmp/apache-jmeter-5.2.1/bin/jmeter -n -t /tmp/scripts/download-server-20M.jmx -Jthread=200 -Jrampup=60 -Jcycle=10 -Jduration=600 -Jtps=12000 -l /tmp/scripts/jtl/download-server-20M-200vu-03031503.jtl -e -o /tmp/scripts/output/download-server-20M-200vu-03031503

注意:当脚本中使用到csv文件,且为相对路径(在bin目录下),需要在bin目录下执行脚本,不然会存在找不到文件的问题。

./jmeter -n -t /home/probeTest/probe-test.jmx -l /home/probeTest/jtl/probe-test-06051340.jtl -e -o /home/probeTest/report/report-06051340

高并发时,执行报错

WARNING: Couldn't flush user prefs: java.util.prefs.BackingStoreException: Couldn't get file lock.

是linux中限制了默认打开文件的数量,需要调整

1、查看打开文件数量限制
ulimit -a  (open files一项)
ulimit -n

2、临时修改
ulimit -n 10240

3、永久修改
vi /etc/security/limits.conf
追加
* soft nofile 65535
* hard nofile 65535
注意前面的星号(*)要保留

不知道为什么执行时无法生成html报告,需要执行完成之后,手动将jtl文件生成html报告

./jmeter -g /home/probeTest/jtl/probe-test-06051340.jtl -o /home/probeTest/report/report-06051340
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值