目录
一、下载安装方式
二、页面操作说明:
1.添加线程组
2.在线程组中添加取样器Sampler
3.添加监听器
4.添加Http Cookie管理器
5.Jmeter参数化(三种方式)
6.同步定时器(集合点)
7.正则表达式提取器
8.Json提取器
9.响应断言
10.压力测试
11.Jmeter生成多维度HTML报告
一些常用小工具,非必须
12.Jmeter函数助手之__time函数(获取当前时间)
Apache JMeter是Apache组织开发的基于Java的压力测试工具。纯java开发的。
一、下载安装方式
1.下载安装JDK(java环境,开源的,网上很容易下载),安装后配置环境变量
![413e8972b3157959ceb9cf2d6275e7c4.png](https://i-blog.csdnimg.cn/blog_migrate/e9a62294c0e7d0f7465a5c3e199c77de.jpeg)
2.下载解压Jmeter压缩包(无需安装,直接解压即可)
打开jmeter/bin/jmeter.bat(批处理文件),直接双击即可打开Jmeter
![b5a59b221b44827053014352ed228aaa.png](https://i-blog.csdnimg.cn/blog_migrate/d2c6439d69cee9a222b5eaa0a8719ecb.png)
二、页面操作说明:
1.添加线程组
![48dd84205ba83425503f1d8b0a18b67f.png](https://i-blog.csdnimg.cn/blog_migrate/3a1c2569da0edb91abd9e46749396709.jpeg)
![349f6b92584cbfabd8638818ef208940.png](https://i-blog.csdnimg.cn/blog_migrate/8d2d7c3beb3c5f2f9194b1446dffbf51.jpeg)
2.在线程组中添加取样器Sampler
![79c19af5ddffdf1e92fd91a25b324996.png](https://i-blog.csdnimg.cn/blog_migrate/036a8832cdbd859b6e42249e0bb85575.jpeg)
![6c55a72189506e36f865312f96d94d8e.png](https://i-blog.csdnimg.cn/blog_migrate/37c87689849e63f286957ad99da83f3e.jpeg)
3.添加监听器
常用的为:查看结果树、聚合报告
![428361ba5b75660b0753830871bdd3e3.png](https://i-blog.csdnimg.cn/blog_migrate/eb245ff87d914defd8795aec3e5fdb14.jpeg)
![064734baca03ce25879118565a1798cd.png](https://i-blog.csdnimg.cn/blog_migrate/1355918999f03cbda828bee6a9902e89.jpeg)
4.添加Http Cookie管理器
保存上一步取样器结果中返回的Cookie值供下一步使用,不用额外配置,一次自上而下的操作认为是一个用户,都会添加同一个Cookie。
![1a3ee31a905652e0628e6c59ba19a0a9.png](https://i-blog.csdnimg.cn/blog_migrate/391b873f2e757d4058ff64bfd459ba04.jpeg)
5.Jmeter参数化(三种方式)
方法1:添加前置处理器——用户参数,使用‘${参数名}’进行调用
![df7a27c2cf491124cda49c45ca6bf129.png](https://i-blog.csdnimg.cn/blog_migrate/9aaa2b3e068f0199e07f62de903d945c.jpeg)
![40b6dc63d1db205230b0e529c564986d.png](https://i-blog.csdnimg.cn/blog_migrate/7b95958fd864b8b667be2e10d62d7fa8.jpeg)
![9a1c8723401879eac13e968b7e27581a.png](https://i-blog.csdnimg.cn/blog_migrate/f18d05a18ca7ffd26f82f94f86401d12.png)
方法2:使用函数读取.csv文件中的数据(.csv可以用Excel建或者用notepad++)
_CSVRead函数原理:先去读取csv文件,然后读取其中的列,挨个赋值给取样器中的参数。
操作步骤:
点击选项→函数助手对话框(快捷键ctrl+shift+F1)→选择CSVRead函数→第一个参数值放文件路径名称,第二个参数是开始的列,0代表第一列→点击生成
然后复制生成的参数化的字符串到Sampler中粘贴即可,注意改下列号
![815b81e879420031eadf1f8a7329412c.png](https://i-blog.csdnimg.cn/blog_migrate/32f953b6fba70c20e763e87b2ed1c919.jpeg)
![3b68470ec50ee031ca70e9e5148c92ff.png](https://i-blog.csdnimg.cn/blog_migrate/78a5a8a3b855bd092db759def17bfa78.jpeg)
![fbb354e7b4e3b624c3d2b4cd21d180ca.png](https://i-blog.csdnimg.cn/blog_migrate/03d7dad8be1d03487e25d8b67458e442.png)
问题排查:如果请求里的参数取的有问题,把.csv文件编码改为‘以utf-8无BOM格式进行编码’(在nodepad里可以改编码)
方法3:使用元件读取CSV Data参数(类似方法1使用函数调用.csv文件数据)
![a99da9320a5c318f9057b85ddc39f748.png](https://i-blog.csdnimg.cn/blog_migrate/6bdd5abe3cac8ba27d29923d272c50e7.jpeg)
![eb7fc59c050a48372ab3cc4899b1baae.png](https://i-blog.csdnimg.cn/blog_migrate/a1a50a7e6f1c5d66cbaf6a7095c3bbb6.jpeg)
Delimiter:变量之间的分隔符,.csv文件用‘,’分隔
Allow quoted data?(是否支持引号,默认选False就可以):选择True,可用双引号来识别内部包含逗号或双引号的数据;
比如数据文件中为1,2,"3,"4",5",为false时,则识别为5个数据a=1,b=2,c=“3,d=“4”,e=5”;为True识别为3个数据a=1,b=2,c=3,"4",5。
Recycle on EOF?:True时读取文件到结尾时,再从头读取;False时读取到文件结尾停止读取。
Stop thread on EOF?:和上一个Recycle on EOF相关,当Recycle on EOF为False时,当读取不到数据时是否停止线程,True为停止,False为继续。Recycle on EOF为True时此项无意义,因为一直能读到数据。
![7185ece00558694cd73509d7e25603bf.png](https://i-blog.csdnimg.cn/blog_migrate/3be684d4f381c8bb0237ec95c57c3322.jpeg)
6.同步定时器(Synchronizing Timer),也叫集合点(就是大家在集合好了一起走)
定时器→同步定时器中添加,目的是并发测试,让多个用户同时调用接口,原理是等待n个用户,满足后才一起运行。
![681bf0b4e7ce0f97db1f15185f911fb6.png](https://i-blog.csdnimg.cn/blog_migrate/b178774b4f259110cb81614782bd1f06.jpeg)
![4865e0f78f55fd62307d0db627908e21.png](https://i-blog.csdnimg.cn/blog_migrate/c19307fddc8a55b19a7d14e4a1289591.jpeg)
7.正则表达式提取器(属于后置处理器,请求结束后拿的响应的数据):并不直接涉及请求测试,但是对数据传递起着很大作用。
添加方式:右键添加→后置处理器→正则表达式提取器,位于具体的请求里面,代表获取这个请求返回的结果中的值。
![09e52d73953a524ec53e943bd51e396a.png](https://i-blog.csdnimg.cn/blog_migrate/79612eb5d87c74792832457634e78849.jpeg)
![9f578af87d581c448f17739b71625194.png](https://i-blog.csdnimg.cn/blog_migrate/b5da2f4ef261a579df4176b57df82e5a.jpeg)
![dbb67935bcbb2a4470719de55affce01.png](https://i-blog.csdnimg.cn/blog_migrate/c3974db72ac6c422306bf15a41c32a0f.jpeg)
说明
引用名称:下一个请求要引用的参数名称,上图中名称为uid,其他请求使用${uid}调用这个参数值。
正则表达式:()起来的部分是要提取的内容,()前后为定位用的内容,一般把目标值前后多复制一些,然后把目标值用()取代
.代表匹配任何字符串,不对一些特殊字符做处理,全部取回
+一次或多次
?匹配到第一个匹配项后就停止
(.+?)经常一起用,代表只取第一个值
模板:正则表达式也可以写多个,用;隔开,$1$代表取第一个模板的正则表达式
扩展
但是,在JDBC请求后的响应结果中,往往需要关联的内容是只有左边界而没有右边界的,此时,我们怎么去关联呢?
实现的关键就在正则表达式的编写,提取一段字符串后所有内容用 [^"]+ 实现,这里的具体实例是n([^"]+)n,意思是提取cpgroupname后面所有内容,加上n是因为这里有换行(空格用s)
![9e0b9af73d6456ac292397ae3a1d7333.png](https://i-blog.csdnimg.cn/blog_migrate/5ff936c17df838f593c3707397452834.jpeg)
8.Json提取器:对于响应结果是Json体的就可以用
![6d7605196603d51ff278da0671736113.png](https://i-blog.csdnimg.cn/blog_migrate/1d12fc5e4748f9250c9db441e042407c.jpeg)
![c9355665a3bc45aa37e294a14627c437.png](https://i-blog.csdnimg.cn/blog_migrate/ed4249a5743b5ac94757e713ce267947.jpeg)
Compute concatenation var(suffix_ALL):用于匹配到多个结果时,勾选此项会生成一个名称为“变量名_ALL”的列表,一般不用。
![577cb0abba524c9398dd05eb44b405ed.png](https://i-blog.csdnimg.cn/blog_migrate/4785fd4ddf8345156a6b0a7bc8190642.jpeg)
说明:如果json路径有层级结构,格式
$.key1.key2[0].key3
.区分层级,列表的话用[]下标
9.响应断言
![d3f8e983a814d2035e60973198416513.png](https://i-blog.csdnimg.cn/blog_migrate/83554a7f3eb77535711c74c6bb546b1d.jpeg)
![1afda24bffad51778934ae0dba10401b.png](https://i-blog.csdnimg.cn/blog_migrate/4473dddc5456bc9cb39e431c31c13180.jpeg)
注意:响应代码取的的是“取样器结果”中的Response Code,不是“响应数据”中的。
响应信息取的是“取样器结果”中的Response message
响应文本取的是“响应数据”中的信息
![7e89077d5238c7d3b4ff21ca0a289dbb.png](https://i-blog.csdnimg.cn/blog_migrate/cb7dbd8ab82bba53c12a494089b6d3cd.jpeg)
匹配模式:包括是包含即可,匹配是完全一样
断言中也可以使用变量${}作为预期结果,需要跟着用户改变的话直接加到用户参数中即可。
10.压力测试
linux服务器上安装插件,帮助统计服务器资源使用情况反馈回来,相当于资源获取器
java -jar /home/AIbert/ServerAgent-2.2.1/CMDRunner.jar(插件地址) --tool PerfMonAgent --udp-port 7777 --tcp-port 4445(分配端口)
服务需要每次开启,测试完成后Crtl+C退出;
![38f9f41a01ca0a281b78a830457bbddf.png](https://i-blog.csdnimg.cn/blog_migrate/1eade38c313178c8a997132bddb0d176.jpeg)
![d97113e42d84f09ef4ebe3b0904e9fa5.png](https://i-blog.csdnimg.cn/blog_migrate/51aba2a8ac6aef13355e87c95d1e1677.jpeg)
说明:PerfMon Metrics Collector资源监听器
Response Times Over Time响应时间监听器
![f4fef35ad29ca180f7bb31e7edb43f09.png](https://i-blog.csdnimg.cn/blog_migrate/9fb644b9810b5bae02f5a78630779369.jpeg)
11.Jmeter生成多维度HTML报告
- 关闭Jmeter
- 如果没有.jtl文件,进入Jmeter下/bin目录,按住shift+右键,选择在此处打开命令窗口;Ctrl+C退出;
![4ffc7632270574ae7b3404030f64dda3.png](https://i-blog.csdnimg.cn/blog_migrate/29c9d50af00b5d07fe4e65d4529faf32.jpeg)
- 运行命令:jmeter -n -t source.jmx -l result.jtl -e -o /tmp/ResultReport
参数说明:-n以非GUI方式运行Jmeter
-t source.jmx脚本路径(改成你的测试计划的路径)
-l result.jtl运行结果保存路径(.jtl),此文件必须不存在
-e 在脚本运行结束后生成HTML报告
-o 用于存放HTML报告的目录(建议放在根目录下,目录中无汉字)
![472460935f6cdf36cd30018e73687e44.png](https://i-blog.csdnimg.cn/blog_migrate/ea041b825655e16289d709f2983a2355.jpeg)
![41f456e20dde89c74902d23ef674112d.png](https://i-blog.csdnimg.cn/blog_migrate/eeb7510f6ca76a94a70da173d810c825.jpeg)
![4d2253f96e177176a75001d7592473f1.png](https://i-blog.csdnimg.cn/blog_migrate/c6f5106a3d284d6861694c0a72186479.jpeg)
图表说明:
![1d09c54ae9ecdbe4abf1a8f69b403bf1.png](https://i-blog.csdnimg.cn/blog_migrate/c8b1613fa453afa67aaa50e078f52d23.jpeg)
Apdex参数越接近1说明性能表现越好,反之越接近0则越差。
![20bbc33edef592b76aa5af46fbd86bde.png](https://i-blog.csdnimg.cn/blog_migrate/b27e436784254c18e2cc5534d3117337.jpeg)
聚合报告图表,和Jmeter聚合报告数据一致
![dc43992aec0567dab6d9e37b195cd44b.png](https://i-blog.csdnimg.cn/blog_migrate/f8f193e9587d8444847aa12c91c9c1ca.jpeg)
12.Jmeter函数助手之__time函数(获取当前时间)
功能:__time函数可以获取到当前的时间并传参供调用
![7505dd08c96494711743bcffdaf1ae0c.png](https://i-blog.csdnimg.cn/blog_migrate/eed6f99491053163ccdd6f8f80f532ad.jpeg)
使用方式:1.打开函数助手,找到__time这个函数,可以看到该函数有两个参数,即格式和参数名称,两者都不是必填项。
- 格式:格式如果不填那么就是默认获取当前时间的毫秒数(此项也常被用于接口参数中那些不允许重复的字段);
- 参数名称:非必填项,如果填了,则生成的时间会被放到该参数中,可以在任意地方调用这个参数,常用于多接口中某个值使用同一个时间参数的情况;
${__time(,)}:获取当前时间的毫秒数;
${__time(,time_ms)}:获取当前时间的毫秒数并存入参数time_ms中;
${__time(/1000,)}:获取当前时间的秒数;
${__time(/1000,time_s)}:获取当前时间的秒数并存入参数time_s中;
${__time(yyyy-MM-dd,)}:获取当前日期;
${__time(yyyy-MM-dd,time_date1)}:获取当前日期并存入参数time_date1中;
${__time(yyyy-MM-dd HH:mm:ss,)}:获取当前时间,固定格式;
${__time(yyyyMMddHHmmss,time_2)}:获取当前时间,固定格式,并存入参数time_2中;
${__time(YMDHMS,)}:获取当前时间,固定格式
2.点击生成按钮即可生成函数字符串,copy后放到需要的位置即可;