1 JMeter基础
1.1 JMeter概述
JMeter简介
Apache JMeter™是Apache组织开发的一款开源软件,是典型的纯Java开发的应用程序,可以在不同平台比如Windows、Linux或macOS系统上进行软件测试。JMeter主要用于应用程序的功能负载测试以度量软件的性能,也可以用于其他类型的测试比如接口测试,API测试等。
JMeter版本
JMeter不同的版本,功能有所差异,对JDK的支持也不尽相同。新的JMeter版本有些功能会逐渐改进完善,还会引入新的功能组件,性能也会逐步提升。因此在JMeter官方网站的最佳实践中,建议用户无论如何最好使用最新的JMeter版本。
这里以最新的JMeter5.1.1版本进行介绍。
JMeter GUI界面
当JMeter以GUI模式运行时,窗口主要由三部分构成:
1.功能区
上方菜单栏,下方工具栏。菜单栏展示了JMeter提供的功能菜单,而工具栏中的图标是常见功能的快捷方式。
2.视图区
以树状结构呈现JMeter元素,其中“Test Plane”是树的根节点,每一个节点就是一个JMeter元素。
在此区域可以添加、删除节点,或者通过拖曳调整节点的位置。
3.内容区
在视图区选中一个JMeter元素节点,相应地在内容区则会显示该元素的内容。可以对其内容进行查看、设置等操作。
1.2 JMeter测试组成
JMeter构建测试类似于组装一台智能电子设备,比如智能手机。智能手机由CPU、内存、输入输出设备(比如USB接口,摄像头等)、屏幕、电池等一系列物理部件构成的。
JMeter测试也是由一系列JMeter元素组合起来构成的,JMeter提供了构建测试的所有元素,你可以随心所欲的将这些元素组装起来完成你想要的测试。
JMeter元素有以下四种类型的测试元素:
1)测试计划
2)线程组
3)组件
包含配置元件、定时器、前置处理器、后置处理器、断言与监听器
4)控制器
包括取样器和逻辑控制器
1.2.1 测试计划
测试计划描述了JMeter测试在运行时执行的一系列步骤。完整的测试计划由一个或多个线程组、逻辑控制器、取样器、监听器、定时器、断言和配置元件组成。
测试计划元素是JMeter测试树的根节点,是唯一的,所有的测试元素节点都位于根节点之下。
1.2.2 线程组
在手工测试中,测试用例由测试工程师手动执行完成。而性能测试与自动化测试的测试用例由选择的测试工具代替测试工程师来执行。JMeter执行测试的任务是由线程组来完成的。打个比方,线程组相当于手工测试中执行测试用例的测试工程师。
线程组控制JMeter用来执行测试的线程数。要模拟多少个用户(称之为虚拟用户)来执行测试,可以通过修改线程组的线程数来实现。比如将线程数设置为10,表示模拟10个用户执行测试。
所有的取样器与逻辑控制器都必须位于线程组下,从这个角度理解,JMeter测试计划真正开始于线程组。其他元素,例如监听器,可以直接放在测试计划下,在这种情况下,它们将作用于所有的线程组。
一个测试计划下可以有多个线程组,在测试计划中可以配置以并行或顺序方式启动多个线程组。
1.2.3 组件
JMeter中最基本的元素为元件,元件是JMeter测试中的最小功能单元,每个元件都具有某种特定的功能。比如“HTTP Request”取样器元件,可以实现HTTP请求发送的功能。
JMeter提供了很多元件,为了方便用户使用与管理众多的元件,JMeter将多个功能类似或逻辑上相关的元件归为一类,称为组件。JMeter包含六大组件: 配置元件、定时器、前置处理器、后置处理器、断言、监听器。
配置元件
配置元件与取样器密切相关。类似于配置文件之于软件,软件配置文件可以影响软件的行为;同样通过配置元件可以新增或修改请求内容,实现对请求的自定义。
定时器
默认情况下,JMeter线程按顺序执行取样器而不会出现暂停的情况。通过将定时器添加到线程组来指定延迟。如果不加延迟,JMeter可能会在很短的时间内发送过多的请求到服务器,导致服务器负载过重而崩溃。
定时器可以使在其作用范围内的每个取样器执行前延迟一段时间。
前置处理器
前置处理器在进行取样器请求之前执行一些操作。
如果前置处理器附加到取样器元素,那么它将在该取样器元素运行之前执行。
前置处理器经常用于在运行之前修改取样器请求的设置,或更新未从响应文本中提取的变量。
后置处理器
后置处理器在取样器请求完成后执行一些操作。
如果后置处理器附加到取样器元素,那么它将在该取样器元素运行之后执行。
后处理器通常用于处理响应数据,从中提取需要的值。
断言
断言用于验证取样器请求或对应的响应是否返回了期望的结果。
JMeter测试是否执行成功,结果是否预期,都可以通过添加断言来进行验证。
监听器
监听器可以在JMeter执行测试的过程中搜集相关的数据,并将这些数据不同的形式,比如树、图、报告等呈现出来。
比如,“图形结果”监听器绘制响应时间的曲线图,“查看结果树”监听器显示取样器请求和响应的详细信息等。
此外,有些监听器还可以将搜集到的测试数据保存到文件中以供以后使用。
1.2.4 控制器
取样器
取样器用于构建发给服务器处理的请求,即告诉JMeter怎样将请求发送到服务器。例如,若要发送HTTP请求,可以选择“HTTP Request”取样器,同时还可以通过添加配置元件来自定义请求。
逻辑控制器
取样器请求默认是以先后顺序依次执行的,某些情况下满足了复杂的业务/场景需求。通过逻辑控制器可以控制JMeter发送请求的逻辑,来实现复杂的业务/场景。比如有选择性执行某些请求,循环执行请求,整体执行逻辑上有依赖关系的请求,交替执行请求等。
1.3 JMeter执行顺序与作用域
1.3.1 执行顺序
类似于运算符或操作符的优先级,当JMeter测试中包含多个不同的元素时,哪些元素先执行,哪些元素后执行,并不是严格按照它们出现的先后顺序依次有序执行的,而是会遵循一定的内部规则,我们称之为JMeter元素的执行顺序,一般情况下JMeter元素按照如下顺序依次执行:
0. 配置元件
1. 定时器
2. 前置处理器
3. 取样器
4. 后置处理器
5. 断言
6. 监听器
一个简单的例子:
其中①为取样器、②为配置元件、③为定时器、④为监听器、⑤为前置处理器、⑥为后置处理器、⑦为断言。
执行顺序为:②-->③-->⑤-->①-->⑥-->⑦-->④
1.3.2 作用域
JMeter测试树中的元素可以分为两类:层次结构与顺序结构
层次结构的元素包括:配置元件、定时器、前置处理器、后置处理器、断言与监听器;
顺序结构的元素包括:取样器和逻辑控制器。
一般而言顺序结构的元素没有作用域的概念,而作用域只针对具有层次结构的组件。
JMeter作用域就是组件对取样器有效的区域,在这个区域内组件是起作用的。
层次结构的元素作用域
具有层次结构的元素的作用域规则如下:
(1)若其父节点为取样器,则其只对该取样器起作用;
(2)若其父节点为逻辑控制器,则会影响逻辑控制器下的所有取样器;
(3)若其父节点为线程组,则会影响线程组下的所有取样器;
(4)若其父节点为测试计划,则会影响测试计划下的所有取样器。
一些例子:
1.父节点为取样器
-Test Plan
-Thread Group
HTTP Request1
Response Assertion
View Results Treel
HTTP Request2
View Results Tree2
解析:
“Response Assertion”断言的父节点为“HTTP Request1”取样器,则只会对“HTTP Request1”进行断言,不会断言“HTTP Request2”取样器。
2.父节点为逻辑控制器
-Test Plan
-Thread Group
-Loop Controller
Response Assertion
-HTTP Request1
View Results Treel
-HTTP Request2
View Results Tree2
解析:
“Response Assertion”断言的父节点为“Loop Controller”逻辑控制器,“Response Assertion”会对逻辑控制下的“HTTP Request1”取样器和“HTTP Request2”取样器进行断言。
3.父节点为线程组
-Test Plan
-Thread Group
Response Assertion
-HTTP Request1
View Results Treel
-Loop Controller
-HTTP Request2
View Results Tree2
-HTTP Request3
View Results Tree3
解析:
“Response Assertion”断言的父节点为“Thread Group”线程组,“Response Assertion”会对线程组下的“HTTP Request1”取样器、“HTTP Request2”取样器与“HTTP Request3”取样器进行断言。
4.父节点为测试计划
-Test Plan
Response Assertion
-Thread Groupl
-HTTP Request1
View Results Treel
-Loop Controller
-HTTP Request2
View Results Tree2
-Thread Group2
-HTTP Request3
View Results Tree3
解析:
“Response Assertion”断言的父节点为“Test Plan”测试计划,“Response Assertion”会对测试计划下的“HTTP Request1”取样器、“HTTP Request2”取样器与“HTTP Request3”进行断言。
1.4 一个简单的JMeter测试计划
以访问百度为例(https://www.baidu.com)。
按照如下步骤完成测试计划:
1.在Test Plan节点上右键,选择Add->Treads(users)->Thread Group
在Tread Properties项下,设置“Number of Threads(users)”为1
2.在Thread Group节点上右键,选择Add->Sampler->HTTP Request
在Web Server项下,设置“Server Name or IP”为www.baidu.com
在HTTP Request项下,设置“Path”为/
3.在HTTP Request节点上右键,选择Add->Assertions->Response Assertion
在Field to Test项下,选择“Response Code”
在“Patterns to Test”项下,点击“Add”,输入200
4.继续在HTTP Request节点上右键,选择Add->Listener->View Results Tree
5.点击“Save”快捷按钮,然后输入测试计划文件名,保存
6.点击“Start”快捷按钮执行测试,可以在“View Results Tree”中查看测试结果。
JMeter测试查看结果树显示如下: