目录

最全面的Jemter性能测试教程Jmeter安装基本组件使用Windows和Linux上命令行执行

最全面的Jemter性能测试教程——Jmeter安装、基本组件使用、Windows和Linux上命令行执行

由于之前用Jmeter做了几次性能测试,所以写了下面这篇博客总结下。但是性能测试的知识点有很多,这个只能算一个初级教程。写的不好的地方,还请见谅。如果写的可以的话,可以关注我的博客,或者查看我的博客目录:

目录

一、Jmeter下载、安装、启动、基本配置

1.1 Java环境
  • 由于Jemter是基于java语言开发的,所以使用Jemter需要安装JDK。(Jemter5.0版本要求JDK版本为1.8或1.9,一般来说就是安装JDK1.8)。
  • JDK1.8下载 :链接: 提取码:fbhv
  • java环境变量配置
1.2 Jmeter下载
  • 最新版Jemter下载路径

  • 其他版本Jmeter下载路径

    一般来说,都是下载 二进制的bin文件

    https://i-blog.csdnimg.cn/blog_migrate/9c62c282f677d6d3a90613137bc958d7.png

1.3 Jmeter安装及环境变量配置
  • 安装的话,解压安装即可
  • 环境变量配置
    • JMETER_HOMED:\jmeter\apache-jmeter-5.1.1 (Jmeter解压后目录)

      https://i-blog.csdnimg.cn/blog_migrate/1d79bb7a2b03d3acebc487342ddc831a.png

    • Path%JMETER_HOME%\bin

      https://i-blog.csdnimg.cn/blog_migrate/ec21604f573477170798e9f9595f570a.png

  • 查看环境变量是否配置成功
    • 运行->cmd-> jmeter -v 命令查看是否能查看到Jmeter版本信息
    • 运行->cmd-> jmeter 命令查看是否能启动jmeter
1.4 启动Jmeter
  • 启动jmeter的bin目录下的 jmeter.bat 文件

    https://i-blog.csdnimg.cn/blog_migrate/5b8ee935d6875852c6642e3f260b8607.png

  • 在jmetet配置环境变量后, cmd中输入jmeter 打开。

    https://i-blog.csdnimg.cn/blog_migrate/a063d37899aa0426bfbf94b26c6efacf.png

  • 注意:不管用那种方式打开,都会打开一个cmd窗口。如果关闭这个cmd窗口,打开的jmeter也会被关闭。

    https://i-blog.csdnimg.cn/blog_migrate/1ca638c234f4dea621c918272e2525f3.png

1.5 Jemter配置中文环境
将Jemter的bin目录下的Jmeter.properties文件
将language=en修改为language=zh_CN

https://i-blog.csdnimg.cn/blog_migrate/e7b8d15555a04742e70e8ea380960ba9.png

参考链接:

二、Jmeter基本使用

首先介绍Jemter基本使用,这里我就以一个登录接口作为例子,来进行基本脚本编写。

  • Jemter常用按钮 https://i-blog.csdnimg.cn/blog_migrate/84b01edebef6cf7ccc9a642bec86fa41.png
2.1.接口信息查看

第一步肯定是了解需要进行性能测试的接口信息,如果有现成的接口文档更好。这里是在浏览器中通过F12键去网页中获取接口信息。

  • General数据

    https://i-blog.csdnimg.cn/blog_migrate/b5702f28608f382ada3b57cd423a5083.png

协议类型:http或者https
域名或者IP:例如访问百度就是www.baidu.com
方法类型:POST或GET
请求路径:例如我这里是/auth/oauth/token
端口号:例如我这里是443
  • Request Headers请求头

一般情况下,对一个借口进行访问的时候,必须带上相关的请求头。如果不清楚哪些请求头参数需要添加上,就一个个添加 名称中不含: 的请求头。例如我这里就需要将 authorization 这个请求头加上。 https://i-blog.csdnimg.cn/blog_migrate/513664564f5b369b10981e940f5624b3.png

  • 请求参数

请求参数有的时候是以Form Data形式,有的时候是以JSON串的形式显示。

https://i-blog.csdnimg.cn/blog_migrate/b70ad46f4dc836e32ae79b6f1106d5c8.png

2.2 脚本编写
  • 创建线程组

(1)测试计划下添加->线程->线程组

https://i-blog.csdnimg.cn/blog_migrate/ef15e0109aef2fc9b8d35ba69586b22b.png

(2)填写相关参数

线程数:即为虚拟用户数。一个虚拟用户占用一个进程或线程。
Ramp-Up时间:设置虚拟用户数启动需要的时间。
循环次数:即为循环
调度器:需要设置持续时间或者启动延迟的时候,才需要勾选。勾选该选项后,需要将循环次数勾选永远
持续时间:测试持续时间

下面给出两种设置的情况:
一种是设置线程数、Ramp-Up时间、循环次数。
另一种是设置线程数、Ramp-Up时间、持续时间
  • 设置10、2、10,含义就是在2秒内启动10个线程,并循环10次,最后发送的总请求数就为10*10=100.

    https://i-blog.csdnimg.cn/blog_migrate/b1b3f346a2930da18d3ffa2837b41a90.png

  • 设置10、2、10,含义就是在2秒内启动10个线程,并持续压测10秒。 在实际情况中,我们进行性能测试中,一般会对一个接口压测5~10分钟,甚至更长。

    https://i-blog.csdnimg.cn/blog_migrate/df2ce2ffe2b33b295041af1f6e84e6c2.png

  • 创建HTTP请求

线程数上 添加->取样器->HTTP请求,然后根据最初查看到的接口信息,填写相关数据。 https://i-blog.csdnimg.cn/blog_migrate/968ebb5a467eaeb43181b7a7a34b26b8.png

https://i-blog.csdnimg.cn/blog_migrate/8fb9fa587ceb9fba65ae81534757f9f8.png

  • 创建HTTP信息头管理器

HTTP请求上 添加->配置原件->HTTP信息头管理器,然后填写请求信息头相关的数据。

https://i-blog.csdnimg.cn/blog_migrate/9f15fa95955f0d73ec2c8ca731dbd77b.png

https://i-blog.csdnimg.cn/blog_migrate/1453c02da9a56951a617af4346034b1e.png

  • 创建响应断言

没有断言的测试,是没有意义的。所以需要根据响应结果添加断言。HTTP请求上添加->断言->响应断言。

https://i-blog.csdnimg.cn/blog_migrate/96b00e119289752c17d036f0e14b50ac.png

https://i-blog.csdnimg.cn/blog_migrate/70e79d05b9df1a564e98570b0929631b.png

https://i-blog.csdnimg.cn/blog_migrate/5c2430c94bf4af67e0578a51d5b14ef6.png

  • 创建监听器(察看结果树、聚合报告)

在线程组上右键添加->监听器->察看结构树、聚合报告。

察看结果树:能查看每个请求的详细数据。请求相关信息、响应相关数据。
聚合报告:查看整体所有请求的整体数据。

https://i-blog.csdnimg.cn/blog_migrate/ce41e44b54277deff44c6e541b156e67.png

https://i-blog.csdnimg.cn/blog_migrate/152b4420c22d51773c048733c8880292.png

https://i-blog.csdnimg.cn/blog_migrate/f9020d202ffd3e4d24a2efbc181ec399.png

三、Jmeter常用组件

上面以一个简单的登录接口,讲解了Jemter的基本使用。下面以组件的分类,讲解一下常用的几大类组件。按照组件执行顺序,依次为: 配置原件->前置处理器->定时器->取样器->后置处理器->断言->监听器同一层级的,顺序执行

3.1 配置原件

https://i-blog.csdnimg.cn/blog_migrate/7cb9b9b1af55654e94a0ed46c2341ef8.png

重点介绍一下 CSV数据文件设置 这个配置原件,因为参数化在性能测试中几乎是必不可少的。因为在实际相关接口性能测试时,不太可能每次请求都是同一个请求参数。

  • 设置CSV数据文件

    https://i-blog.csdnimg.cn/blog_migrate/f51617d52249741a066e3574bab8f5a0.png

    https://i-blog.csdnimg.cn/blog_migrate/1e7c50253cd7630f29175b49c8f11be8.png

  • 读取变量

    https://i-blog.csdnimg.cn/blog_migrate/25e9d5b9dbf9312d544ec25d80a934fe.png

3.2 前置处理器

前置处理器的含义:即为在请求启动前运行的原件。由于使用的较少,就不在这里说了,可自行百度。

3.3 定时器

https://i-blog.csdnimg.cn/blog_migrate/8a19fb85578caac618a51bf89b42c4f6.png

参考链接:

同步定时器:

3.4 取样器

取样器,即为发送的请求。常用的有HTTP请求、调试取样器、FTP请求、JDBC Request(连接数据库)等。HTTP请求由于上面已经说过了。

  • 调试取样器

用于查看测试计划中及外部文件中的变量,可以定位问题,使用就是查看调试取样器的响应结果。

  • JDBC Request

3.5 后置处理器

后置取样器,即为发送请求完成后的处理,也是比较常用的一个组件。常用的后置处理器有正则表达式提取器、JSON提取器、调试后置处理程序、BeanShell后置处理程序。这里就重点说一下 正则表达式提取 以及 关联

  • 正则表达式提取器
参考链接:
https://www.jianshu.com/p/d47a1f67c959
https://blog.csdn.net/quiet_girl/article/details/50724313
https://www.cnblogs.com/tudou-22/p/9566894.html

引用名称:下一个请求中引用的参数名称
正则表达式:
    () 括起来的部分为提取的内容
    . 匹配任意字符串
    + 匹配一次或多次
    ? 找到第一个匹配项之后就停止匹配
    \d 匹配数字
    \n 匹配结尾,例如匹配响应头中一行的数据
    带有转义字符的:id?test\":"1234"   id\?test\\":"(.+?)" 提取出1234
模板:用$$引用起来,$1$表示将匹配到的第一个值赋给引用名称、同理可以使用$1$$4$是将
      第一个和第四个值赋给引用名称。例如引用名称为user,模板为$1$$4$,后续取第一个
      正则的值就是user_g1,第四个就是user_g4.
匹配数字:0代表随机取值、1代表全部取值
缺省值:即为正则表达式没有匹配到值,则使用缺省值给引用名
实际举例
响应文本内容:
{"access_token":"0cdd295e-3803-4201-b945-2149bebda9a4",
"token_type":"bearer","refresh_token":"b832edd8-ed5b-4fd2-980b-65036412410b"
,"expires_in":6636,"scope":"read write","isDeviceValidate":true}

引用名称:token
正则表达式:"access_token":"(.+)","token_type":"(.+)","refresh_token":"(.+)","expires_in"
模板:$1$$2$$3$
匹配数字:1
Debug调试取样器结果
token=0cdd295e-3803-4201-b945-2149bebda9a4bearerb832edd8-ed5b-4fd2-980b-65036412410b
token_g=3
token_g0="access_token":"0cdd295e-3803-4201-b945-2149bebda9a4",
  "token_type":"bearer","refresh_token":
  "b832edd8-ed5b-4fd2-980b-65036412410b","expires_in"
token_g1=0cdd295e-3803-4201-b945-2149bebda9a4
token_g2=bearer
token_g3=b832edd8-ed5b-4fd2-980b-65036412410b

所以后续想要调用相关的参数的时候可以通过 引用名_g下标
  • 关联

关联:可以理解为我们需要 取服务器返回的值 。举个常用的例子,就是一般系统一些接口请求的时候,请求头中参数需要登录返回的响应数据。关联中有两种情况,一种是一个线程组内请求之间的关联;另一种是两个线程组之间的关联。

相关参数一个线程组两个线程组
正则表达式提取器引用名称:_access_token 正则表达式:“access_token”:"(.+?)"引用名称:_access_token 正则表达式:“access_token”:"(.+?)"
BeanShell 后置输入值
后面取值${_access_token}${__P(_access_token)}

输入值为:

参数:${_access_token}
输入框值:
${__setProperty(_access_token,${_access_token})}

https://i-blog.csdnimg.cn/blog_migrate/582b991c2aa6ce89f3912a1450ff4a67.png

https://i-blog.csdnimg.cn/blog_migrate/e7e7f1efd5f454443e85a1b30ff7981b.png

3.6 响应

断言,由于前面也大致说过了,具体可以参考下面链接。

3.7 监听器

监听器,由于前面也大致说过了,具体可以参考下面链接。

察看结果树:

聚合报告:

3.8 逻辑控制器
  • 事务控制器

将多个请求当做一个事务,由于实际场景中不仅有数据返回,还有页面渲染加载,所以需要将多个接口放在一个事务中。

参考链接:

  • ForEach控制器

通常是几个类似的值需要循环使用的时候,通常结合自定义变量来使用。(是把ForEach控制器套在请求的上面)。

参考链接:

  • if控制器

参考链接:

3.9 BeanShell

由于BeanShell是Jmeter中一个强大的功能,这里可以参考下面链接。

四、命令行执行压测

在打开Jmeter的时候,就会有一个提示。大致含义就为 不要用GUI界面来做测试,只用GUI界面来做调试脚本 。给出的命令模板为: jmeter -n -t [jmx file] -l [result file] -e -o [Path to web report folder]

https://i-blog.csdnimg.cn/blog_migrate/775dc8e1d686f36997163fa219a8e6b0.png

4.1 Windows环境

  • 执行命令

例如:这里默认Windows中安装好Jmeter环境,且配置环境变量。执行命令。

jmeter -n -t G:\Test\1.jmx -l G:\Test\result\result.jtl -e -o G:\Test\htmlReport\1

https://i-blog.csdnimg.cn/blog_migrate/1fec31df3f888a1220ee82af7ce9e08c.png

https://i-blog.csdnimg.cn/blog_migrate/806039b2822df261939ffd6e92f5cd10.png

压测报告:

  • 注意点
    • bin\jmeter.properties配置 jmeter.save.saveservice.output_format=xml 需要注释掉,才能执行成功
    • jtl文件路径和html报告路径需要不存在,否则会提示错误

4.2 Linux环境

4.2.1 Linux上Jemter环境搭建
  • (1)确定Java环境

java -version

  • (2)下载和解压安装Jmeter
/*wget命令下载Jmeter或者上传Jemter的tgz包*/
wget http://mirrors.tuna.tsinghua.edu.cn/apache//jmeter/binaries/apache-jmeter-5.1.1.tgz
/*解压Jemter*/
[yff@192 Desktop]$ ls
apache-jmeter-5.1.1.tgz
[yff@192 Desktop]$ tar zxvf  apache-jmeter-5.1.1.tgz -C ./

  • (3)配置环境变量
/*1.修改/etc/profile文件*/
vim /etc/profile

/*2.添加配置 路径根据实际修改*/
export PATH=/home/yff/Jmeter/apache-jmeter-5.2.1/bin/:$PATH

/*3.生效配置*/
source /etc/profile

/*查看配置是否成功*/
jmeter -v
  • (4)修改端口

将/bin/jmeter.properties文件修改为 jmeterengine.nongui.port=0

  • (5)创建相关文件夹
/*在apache-jmeter-5.1.1目录下创建文件夹,为后续性能测试做准备*/
mkdir result log script file htmlReport

/*每个文件夹含义*/
result文件夹:用于存放压测结果 
log文件夹:用于存放日志文件
file文件夹:用于存放CSV等文件 
script文件夹:用于存放脚本文件
htmlReport文件夹:存放压测html报告
4.2.2 修改脚本
  • CSV数据文件路径

如果Jmeter脚本中使用到CSV文件,在Linux执行性能测试前,需要将CSV文件上传到Linux上刚才创建的file文件夹下,然后将脚本中CSV数据文件路径修改为Linux上对应路径。

  • 线程组参数参数化

由于在实际性能测试过程中,会进行不同并发数、不同持续时间的性能测试,就将线程组中相关参数修改为指定参数,然后执行命令中对参数赋不同的值。

${__P(threadCount,)}	线程数
${__P(startTime,)}	启动时间
${__P(time,)}		持续时间

https://i-blog.csdnimg.cn/blog_migrate/b26f1f8977b74ce9919b03fb47ae2784.png

4.2.3 执行性能测试

执行下面命令运行测试并生成报告。

/*执行命令*/
nohup jmeter -n -t /home/yff/Jmeter/apache-jmeter-5.1.1/script/1.1login_linux.jmx  -l /home/yff/Jmeter/apache-jmeter-5.1.1/reslt/$(date +%y%m%d%H%M).jtl > /home/yff/Jmeter/apache-jmeter-5.1.1/log/$(date +%y%m%d%H%M).log -e -o /home/yff/Jmeter/apache-jmeter-5.1.1/htmlReport/8 -JthreadCount=0 -JstartTime=2 -Jtime=3
/*命令含义*/
nohup jmeter -n -t jmx脚本路径 -l jtl文件路径 > log文件路径 -e -o html路径 参数赋值

需要注意的是,html路径应该是不存在的,如果命令中html路径已经存在,执行命令时会报错

脚本参数设置及命令对应
${__P(threadCount,)}	
${__P(startTime,)}	
${__P(time,)}

-JthreadCount=10	
-JstartTime=2 	
-Jtime=3
4.2.4 HTML报告解读

关于HTML中数据的解析,可以参考下面链接