目录
1 JMeter简介
JMeter是一个纯Java编写的开源软件,主要用于进行性能测试和功能测试。它支持测试的应用/服务/协议包括Web (HTTP, HTTPS)、SOAP/REST Webservices、FTP、Database via JDBC等。我们最常使用的是HTTP和HTTPS协议。
2 JMeter安装配置
2.1 Java环境配置
由于JMeter是基于Java语言开发的,所以使用JMeter需要安装JDK,推荐1.8的版本。
-
JDK1.8下载地址:JDK1.8官网下载
2.2 JMeter下载、安装、配置
2.2.1 JMeter下载
-
JMeter下载地址:JMeter官网下载
2.2.2 JMeter安装
下载安装包后,解压安装 JMeter 即可
主要目录功能说明
bin - Jmeter启动程序jmeter.bat、配置文件jmeter.properties等
lib - 第三方插件(jar包)
printable_docs - 用户帮助手册
2.2.3 环境变量配置
在环境变量中添加 JMETER_HOME,配置为JMeter解压目录
在环境变量中添加Path:%JMETER_HOME%\bin
2.2.4 查看环境变量是否配置成功
-
运行->
cmd-> jmeter -v
命令查看是否能查看到Jmeter版本信息
2.2.5 启动JMeter
进入 apache-jmeter-5.6.3/bin
文件夹,点击 jmeter.bat
文件,运行jmeter
或者 运行-> cmd->jmeter
命令启动jmeter
初始界面如下:
注意:不管用使用哪一种方式打开,都会打开一个cmd窗口。如果关闭这个cmd窗口,打开的jmeter也会被关闭。
2.2.5 JMeter切换中文环境
(1)临时设置
在上方导航栏,选择 Options -> Choose Language -> Chinese(Simplified)
,将语言切换为中文。更换语言过后的界面如下:
(2)永久设置
修改配置文件(jmeter.properties),language=zh_CN,重启jmete
#Preferred GUI language. Comment out to use the JVM default locale's language.
#language=en
language=zh_CN
3 JMeter测试组成
JMeter构建测试类似于组装一台智能电子设备,比如智能手机。智能手机由CPU、内存、输入输出设备(比如USB接口,摄像头等)、屏幕、电池等一系列物理部件构成的。
JMeter测试也是由一系列JMeter元素组合起来构成的,JMeter提供了构建测试的所有元素,你可以随心所欲的将这些元素组装起来完成你想要的测试。
JMeter元素有以下四种类型的测试元素:
- 测试计划
- 线程组
- 组件:包含配置元件、定时器、前置处理器、后置处理器、断言与监听器
- 控制器:包括取样器和逻辑控制器
3.1 测试计划
测试计划描述了JMeter测试在运行时执行的一系列步骤。完整的测试计划由一个或多个线程组、逻辑控制器、取样器、监听器、定时器、断言和配置元件组成。
测试计划元素是JMeter测试树的根节点,是唯一的,所有的测试元素节点都位于根节点之下。
3.2 线程组
在手工测试中,测试用例由测试工程师手动执行完成。而性能测试与自动化测试的测试用例由选择的测试工具代替测试工程师来执行。JMeter执行测试的任务是由线程组来完成的。打个比方,线程组相当于手工测试中执行测试用例的测试工程师。
线程组控制JMeter用来执行测试的线程数。要模拟多少个用户(称之为虚拟用户)来执行测试,可以通过修改线程组的线程数来实现。比如将线程数设置为10,表示模拟10个用户执行测试。
所有的取样器与逻辑控制器都必须位于线程组下,从这个角度理解,JMeter测试计划真正开始于线程组。其他元素,例如监听器,可以直接放在测试计划下,在这种情况下,它们将作用于所有的线程组。
一个测试计划下可以有多个线程组,在测试计划中可以配置以并行或顺序方式启动多个线程组。
3.3 组件
JMeter中最基本的元素为元件,元件是JMeter测试中的最小功能单元,每个元件都具有某种特定的功能。比如“HTTP Request”取样器元件,可以实现HTTP请求发送的功能。
JMeter提供了很多元件,为了方便用户使用与管理众多的元件,JMeter将多个功能类似或逻辑上相关的元件归为一类,称为组件。JMeter包含六大组件: 配置元件、定时器、前置处理器、后置处理器、断言、监听器。
3.3.1 配置元件
配置元件与取样器密切相关。类似于配置文件之于软件,软件配置文件可以影响软件的行为;同样通过配置元件可以新增或修改请求内容,实现对请求的自定义。
3.3.2 定时器
默认情况下,JMeter线程按顺序执行取样器而不会出现暂停的情况。通过将定时器添加到线程组来指定延迟。如果不加延迟,JMeter可能会在很短的时间内发送过多的请求到服务器,导致服务器负载过重而崩溃。
定时器可以使在其作用范围内的每个取样器执行前延迟一段时间。
3.3.3 前置处理器
前置处理器在进行取样器请求之前执行一些操作。
如果前置处理器附加到取样器元素,那么它将在该取样器元素运行之前执行。
前置处理器经常用于在运行之前修改取样器请求的设置,或更新未从响应文本中提取的变量。
3.3.4 后置处理器
后置处理器在取样器请求完成后执行一些操作。
如果后置处理器附加到取样器元素,那么它将在该取样器元素运行之后执行。
后置处理器通常用于处理响应数据,从中提取需要的值。
3.3.5 断言
断言用于验证取样器请求或对应的响应是否返回了期望的结果。
JMeter测试是否执行成功,结果是否预期,都可以通过添加断言来进行验证。
3.3.6 监听器
监听器可以在JMeter执行测试的过程中搜集相关的数据,并将这些数据不同的形式,比如树、图、报告等呈现出来。
比如,“图形结果”监听器绘制响应时间的曲线图,“查看结果树”监听器显示取样器请求和响应的详细信息等。
此外,有些监听器还可以将搜集到的测试数据保存到文件中以供以后使用。
3.4 控制器
3.4.1 取样器
取样器用于构建发给服务器处理的请求,即告诉JMeter怎样将请求发送到服务器。例如,若要发送HTTP请求,可以选择“HTTP Request”取样器,同时还可以通过添加配置元件来自定义请求。
3.4.2 逻辑控制器
取样器请求默认是以先后顺序依次执行的,某些情况下满足了复杂的业务/场景需求。通过逻辑控制器可以控制JMeter发送请求的逻辑,来实现复杂的业务/场景。比如有选择性执行某些请求,循环执行请求,整体执行逻辑上有依赖关系的请求,交替执行请求等。
4 JMeter执行顺序及作用域
4.1 执行顺序
类似于运算符或操作符的优先级,当JMeter测试中包含多个不同的元素时,哪些元素先执行,哪些元素后执行,并不是严格按照它们出现的先后顺序依次有序执行的,而是会遵循一定的内部规则,我们称之为JMeter元素的执行顺序,一般情况下JMeter元素按照如下顺序依次执行:
配置元件 -> 定时器 -> 前置处理器 -> 取样器 -> 后置处理程序 -> 断言 -> 监听器
配置元件:初始化测试数据
定时器:会作用域内的每一个采样器都在执行前等待一个固定时长
前置处理器:对请求参数化进行赋值
取样器:调用GET/POST方法发送请求
后置处理器:提取响应中特定字段的值
断言: 对提取出来的值与预期结果进行对比
监听器:在控制台查看脚本运行的结果
4.2 作域
JMeter测试树中的元素可以分为两类:层次结构与顺序结构
层次结构的元素包括:配置元件、定时器、前置处理器、后置处理器、断言与监听器;
顺序结构的元素包括:取样器和逻辑控制器。
一般而言顺序结构的元素没有作用域的概念,而作用域只针对具有层次结构的组件。
JMeter作用域就是组件对取样器有效的区域,在这个区域内组件是起作用的。
具有层次结构的元素的作用域规则如下:
- 若其父节点为取样器,则其只对该取样器起作用;
- 若其父节点为逻辑控制器,则会影响逻辑控制器下的所有取样器;
- 若其父节点为线程组,则会影响线程组下的所有取样器;
- 若其父节点为测试计划,则会影响测试计划下的所有取样器。
5 一个简单的JMeter测试计划
5.1 JMeter脚本编写
这里以一个 www.baidu.com
为例,来进行基本脚本编写。
5.1.1 添加线程组
右键点击“Test Plan” -> 添加 -> 线程(用户) -> 线程组
,可添加测试需要的线程组
线程组可配置线程组名称、注释、线程数、Ramp-up时间、循环次数、调度器等参数
参数解释:
- 线程数:虚拟用户数。一个虚拟用户占用一个进程或线程。设置多少虚拟用户数就是设置多少个线程数。
- Ramp-Up时间(秒):设置的虚拟用户数需要多长时间全部启动。如果线程数为5,准备时长为1,那么需要1秒钟启动5个线程,也就是每秒钟启动5个线程。
- 循环次数:每个线程发送请求的次数。如果线程数为100,循环次数为10,那么每个线程发送10次请求。总请求数为100*10=1000 。若勾选“永远”,则所有线程会一直发送请求,直到选择停止运行脚本。
- Same user on each iteration:用于控制每次迭代是否使用相同的线程(即用户)。当该参数被勾选时,JMeter在每次迭代时都会使用相同的线程来模拟用户行为。在连续的请求中,会保持相同的用户身份(如会话、Cookie等)。
- 调度器:设置线程组启动的开始时间和结束时间(配置调度器时,需勾选循环次数为永远)
- 启动延迟(秒):测试延迟的启动时间
- 持续时间(秒):测试持续的时间
5.1.2 添加 HTTP 请求
JMeter的HTTP请求是性能测试中常用的功能,用于模拟用户向服务器发送HTTP请求并获取响应。
右键点击线程组 -> 添加 -> 取样器 -> HTTP请求
,添加一个HTTP请求
对网址 http://www.baidu.com/s?ie=utf-8&wd=jmeter
进行性能测试,参考下图进行配置
参数解释:
- Web服务器
- 协议:向目标服务器发送HTTP请求协议,可以是HTTP或HTTPS,默认为HTTP
- 服务器名称或IP :HTTP请求发送的目标服务器名称或IP
- 端口号:目标服务器的端口号,默认值为80
- Http请求
- 方法:发送HTTP请求的方法,可用方法包括GET、POST、HEAD、PUT、DELETE等。
- 路径:目标URL路径(URL中去掉服务器地址、端口及参数后剩余部分)
- 内容编码:编码方式,默认为ISO-8859-1编码,这里配置为utf-8
- 同请求一起发送参数 :在请求中发送的URL参数,可以将URL中所有参数设置在本表中,表中每行为一个参数(对应URL中的 name=value),参数传入中文时需要勾选“编码”
5.1.3 添加查看结果树
JMeter的结果查看树用于查看和分析HTTP请求的响应结果。
右键点击线程组 -> 添加 -> 监听器 -> 查看结果树
,添加一个查看结果树
将查找下方的响应数据格式改为 HTML Source Formatted
,点击上方的绿色三角按钮,运行http请求
运行结果如下:
取样器结果
本次搜索返回结果页面标题为“JMeter性能测试_百度搜索”,与之前设置的发送参数相吻合。
5.1.4 添加聚合报告
聚合报告是JMeter中用于汇总和分析测试结果的工具。它提供了关于测试运行的各种性能指标,如响应时间、吞吐量、错误率等。
右键点击 线程组 -> 添加 -> 监听器 -> 聚合报告
,用以存放性能测试报告
5.1.5 添加用户自定义变量
用户自定义变量作为存储和管理测试期间需要的值,这些变量可以在测试计划中的任何地方引用。
右键点击 线程组 -> 添加 -> 配置元件 -> 用户定义的变量
,以添加用户自定义变量
添加一个参数 wd
,用于存放搜索词
在HTTP请求中使用该参数,格式为 ${变量名称}
,即 ${wd}
5.1.6 添加断言
JMeter中,断言用于验证测试结果是否符合预期。
在HTTP请求中添加响应断言:右键点击 HTTP请求 -> 添加 -> 断言 -> 响应断言
需要校验返回的文本中是否包含搜索词,添加参数 ${wd}
到要测试的模式中
5.1.7 添加断言结果
为查看断言的结果,在HTTP请求中添加断言结果:右键点击 HTTP请求 -> 添加 -> 监听器 -> 断言结果
点击上方的绿色三角形按钮,即可运行并查看断言运行结果。
5.2 执行性能测试
5.2.1 配置线程组
点击线程组,配置本次性能测试相关参数:线程数,Ramp-Up时间,循环次数等参数。
这里我们配置线程数为20,Ramp-Up时间为5秒,循环次数为1次。
5.2.2 执行测试
进入聚合报告,进行测试。测试之前需要点击上方的扫把按钮清楚之前的调试结果。
点击上方的绿色按钮,即可运行测试,性能测试执行完成后,可通过聚合报告看到测试结果。
一般情况下,性能测试中需要重点关注的数据有请求数、平均响应时间、最小响应时间、最大响应时间、吞吐量和错误率
参数说明:
- Label:每个 JMeter 的元素(如 HTTP请求)都有一个 Name 属性,Label显示的就是 Name 属性的值
- #样本:请求数,表示这次测试中一共发出了多少个请求。如模拟100个线程数(即100个用户),每个线程迭代10次,这里就显示100*10 = 1000
- 平均值:平均响应时间,默认情况下是单个请求的平均响应时间。
- 中位数:50% 用户的响应时间
- 90%/ 95%/ 99% 百分位:90%/ 95%/ 99% 用户的响应时间
- 最小值:最小响应时间
- 最大值:最大响应时间
- 异常%:请求错误率,即错误请求数/请求总数
- 吞吐量:——默认情况下表示每秒完成的请求数(Request per Second)
- 接收KB/Sec:每秒从服务器端接收到的数据量
- 发送KB/Sec:每秒发送到服务器端的数据量
以上,就是使用测试工具JMeter对Web应用程序进行性能测试的流程。
5.3 注意事项
- 关闭不必要的监听器:在测试过程中,如果不需要实时查看结果,可以关闭不必要的监听器,以减少资源消耗。
- 合理使用断言:过多的断言会增加测试的复杂性,应根据实际需求合理使用断言。
- 优化测试计划:在测试过程中,应不断优化测试计划,如调整线程数、循环次数等参数,以达到最佳的测试效果。
- 注意测试结果的分析:通过聚合报告等结果分析工具,对测试结果进行深入分析,找出潜在的性能问题。
6 免费的API接口平台
免费的API接口平台,可以让我们快速练习并掌握Jmeter使用的首选。
6.1 山河API
山河 API 提供稳定、快速的免费 API 数据接口服务,服务器采用国内高防,稳定运行。目前共收录了 100duo 个接口,涵盖多个领域。平台致力于为用户提供优质的免费 API 服务,帮助开发者更方便地获取所需数据。
6.2 聚合数据API
聚合数据API 致力于为客户提供标准的API服务和定制化的数据治理解决方案,专注于用数据技术赋能数字经济。提供免费和付费等不同形式 API 服务,帮助开发者更方便地获取所需数据。