学习前的准备
学习本教程前,你的电脑上至少应该有Apache JMeter这款软件。如果你没有,点击此处下载。
当你点进去后,你会发现它是一个依赖Java的软件
因此如果你电脑上没有Java环境,你应该首先安装它,然后才能在你的电脑上使用JMeter。(本文不提供安装Java环境的步骤,如果你不会安装,请自行百度“jdk8安装与配置”)
关于JMeter的下载,如果你不想了解它是怎么实现的,下载Binaries版本即可。
- 如果你的操作系统是Windows,选择
.zip
格式的文件最好; - 如果是Linux,Mac等,你可以选择
.tgz
格式的文件下载。
运行JMeter
- 如果你是Windows平台。解压你下载的
.zip
压缩文件,在bin
目录下双击jmeter.bat
- 如果你是Linux、Mac等平台。同样得先解压
.tgz
格式文件,在终端中进入到bin
目录下,运行jmeter.sh
即可
当然还有其他的运行方式,以上运行方式一般在创建脚本、修改脚本时使用,文章后面会讲到在执行脚本时的另一种打开JMeter的方式。
JMeter GUI基本操作
测试计划描述了JMeter运行时将会执行的一系列步骤。一个完整的测试计划会包含一个或多个线程组、逻辑控制器、采样器、监听器、定时器、断言和配置元件。
1. 添加/移除测试元件
添加一个测试元件,先选中测试树上的某个元件,右击,在弹出的菜单中选择“添加”,再在其级联菜单中选择一个新的元件
删除一个测试元件,只需要右击测试元件,点击“删除”即可。
2. 加载和保存测试元件
加载元件,在需要加载的地方右击,在菜单中选择“合并”,再在弹出的对话框中选择外部文件
保存元件,在需要保存的元件上右击,在菜单中选择“另存为”。JMeter会保存选中的测试元件,及其下面的子测试元件。通过这种方式可以独立的保存某个或某些测试元件,以供后续使用。
3. 配置测试树中的测试元件
在JMeter图形用户界面右侧,有相关元件的控制面板,可以帮助用户设定某个元件的行为。
4. 保存测试计划
尽管这不是必须的,但作者强烈建议在运行测试计划前,先保存测试计划。选择“文件”菜单下的“保存测试计划”或者“保存测试计划为”命令。
5. 运行测试计划
选择“运行”→“启动”命令,或者在图形用户界面的右上角绿色三角形图标
6. 终止测试
左一为“停止”,右一为“关闭”
- 停止(Ctrl+.):如果可能的话,立即停止所有线程。
- 关闭(Ctrl+,):要求线程在当前工作完成后停止。
7. 错误报告
JMeter会警告或者错误记录到jmeter.log文件中,甚至还包括一些测试自己的信息。用户可以通过检查日志文件中是否有错误信息判断是否。
JMeter常用测试元件
1. 线程组
线程组是任何测试计划的起点,所有逻辑控制器和采样器都必须放在线程组之下。其他的测试元件(如监听器)可以被直接放在测试计划之下。线程组就像它的名字所描述的那样,被用来管理执行性能测试所需的JMeter线程。每一个线程都会完整的执行测试计划,而且他们之间是完全独立的运行,用这种多线程机制来模拟服务器应用的多用户并发连接。
参数Ramp-Up Period告诉JMeter达到最大线程数需要多长时间。假定有10个线程,Ramp-Up period为100秒,那么JMeter就会在100秒内启动所有10个线程,并让它们运转起来。每个线程在上一个线程启动10秒之后才会开始运行。
Ramp-Up参数不能设定得太短,否则在测试的初始阶段会给予服务器过大的压力。也不能设定太长,否则就会发生第一个线程已经执行完毕,而最后一个线程还没有启动的情况(除非测试人员期望这种特殊情况的发生)
如何找到一个合适的Ramp-Up呢?作者建议初始值可以设定为Ramp-Up=总线程数,后续再根据实际情况适当增减。
默认情况下,JMeter线程组被设定成只执行一遍,用户可以根据实际需要设定参数“循环次数”
调度器是一个控制运行持续状态的元件。可以设定测试运行的“启动时间”和“结束时间”。测试启动后会一直等待,直到用户设定得启动时间。测试运行期间,JMeter会在每一次循环结束后,检查是否已达到结束时间。如果已经达到结束时间,JMeter会终止测试元件运行,否则JMeter会继续下一个测试循环。
另外,用户还可以设置“持续时间”和“启动延迟”两个参数。需要注意的是,“启动延迟”会使“启动时间”无效,而“持续时间”会使“结束时间”无效。
2. 控制器
JMeter有两种类型的控制器:采样器和逻辑控制器,二者结合起来驱动测试进程。采样器被JMeter用来向服务器发送请求。例如当测试人员想往服务器发送一个HTTP请求时,就加入一个HTTP请求采样器。
用户可以使用逻辑控制器来控制JMeter的测试逻辑,比如何时发送请求。举个栗子,测试人员可以插入交替控制器来轮流发送多个请求。
-
采样器
采样器发送一个请求到指定服务器,并等待服务器的请求。采样器会按照其在测试树中的顺序去执行,还可以用逻辑控制器来控制采样器运行的重复次数。
Web测试中,一般用到的采样器是HTTP Request
-
逻辑控制器
逻辑控制器可以帮助用户控制JMeter的测试逻辑。特别是何时发送请求。逻辑控制器可以改变其子测试元件的请求执行顺序。
例如:如果有一个登录请求,在整个测试过程中只需要执行一次,在剩下的测试循环中它没有必要执行,就可以使用仅一次控制器(Once Only Controller)。
关于逻辑控制器本文之后只介绍循环控制器,如果想了解更多,请自行百度学习。
3. 监听器
监听器的作用主要是记录在测试期间,服务器返回的信息、以及请求响应时间等一些参数,方便得为用户展示它们。
- “图形结果”监听器会将系统响应时长绘制在一张图片中。
- “查看结果树”监听器会展示采样器请求和响应的细节,还能以HTML和XML格式展示系统响应的基础部分。
- “Aggregate Graph”监听器会展示每个步骤的平均响应时间
- “Response Time Graph”监听器会以时间段的形式展现出平均响应时间。
- “聚合报告”监听器以表格的形式展示了测试过程中获得的数据。
4. 定时器
默认情况下,JMeter线程在发送请求之间是没有间歇。当添加了某种定时器后,请求之间就有了间隔时长。
5. 断言
用户可以使用断言来检查从服务器获得的响应内容是否与期望相符。
例如:测试人员可以断言某个查询的响应结果是否包含特定的文字。测试人员可以使用Perl格式的正则表达式来匹配响应结果。
6. 配置元件
配置元件与采样器紧密关联。它可以记录或者设置采样器中的一些信息。
例如:“用户定义的变量”可以定义一个服务器地址的变量,在采样器中可以通过“${变量名}”的方式获取到变量的值。
7. 前置处理器
前置处理器会在采样器发出请求之前做出一些特殊操作。如果前置处理器附着在某个采样器之下,那么它只会对该采样器起作用。
8. 后置处理器
后置处理器会在采样器发出请求之后做出一些特殊操作。
JMeter脚本开发基础
1. JMeter执行顺序规则
JMeter执行顺序规则如下:
- 配置元件
- 前置处理器
- 定时器
-采样器 - 后置处理器
- 断言
- 监听器
只有当作用域内存在采样器是,定时器、断言、前置/后置处理器才会被执行。
例如,在如下测试计划中:
Controller
Post-Processor 1
Sampler 1
Sampler 2
Timer 1
Assertion 1
Pre-Processor 1
Timer 2
Post-Processor 2
执行顺序为:
Pre-Processor 1
Timer 1
Timer 2
Sampler 1
Post-Processor 1
Post-processor 2
Assertion 1
Pre-Processor 1
Timer 1
Timer 2
Sampler 2
Post-Processor 1
Post-processor 2
Assertion 1
2. 作用域规则
监听器、配置元件、前置处理器、后置处理器、断言、定时器作用于其父级或父级的相关子级测试元件。
逻辑控制器会对其子级起作用,比如采样器。
上图中:
- 1标识的“用户定义的变量”配置元件,在其父级“Thread Group”的所有子级测试元件中都可以成功访问。
- 2标识的“Aggregate Graph”监听器也只对其父级“登录”逻辑控制器的子级“登录页”和“跳转首页”采样器实行监听。
- 3标识的“图形结果”只对其父级“个人中心”采样器实行监听。
- 4标识的“意见反馈”逻辑控制器控制了其子级采样器的执行。
3. 属性和变量
JMeter属性统一定义在jmeter.properties文件中。属性可以在测试脚本的任何位置访问(全局)。变量对于测试线程而言是局部变量。
大多是变量都是通过函数调用和测试元件(如用户定义变量)来设置的。
4. 参数化
参数化是指为某个请求设置参数和值得过程。在测试中,比如你的系统设置了用户不能同时在线,则测试时多个线程必须使用不同的用户名和密码组合去登录你的系统,这时候就需要参数化你的请求。
如图所示,这样为username和password两个参数赋值,这种赋值方式为JMeter中的函数(作为入门教程,本文也只介绍这一个函数,想了解更多请自行百度学习),这样在每个线程中,JMeter都会使用不同的username和password去请求。
关于从文本文件中批量获取数据的函数介绍:
-
准备一个txt文件,每行表示一组数据,之间用逗号隔开,如下
17666666660,123456 17666666661,123456 17666666662,123456 17666666663,123456 17666666664,123456 17666666665,123456 17666666666,123456 17666666667,123456 17666666668,123456
-
点击“选项”→“函数助手对话框”,在对话框的“选择一个功能”下拉框中选择“_CSVRead”函数
-
在CSV file后面值的位置填写文件路径,在第二行CSV文件列号填写列号(用 , 分割)。点击生成后复制函数字符串到登录对应采样器的username值的位置,并将函数中第二个参数0改为1复制到采样器password值得位置。
创建Web测试计划
这一部分,将会介绍如何创建一个简单的测试计划来测试Web站点。我们会模拟5个并发用户,对Web站点的两个页面进行访问。另外,每个并发用户都会运行测试两次。因此总请求书为5(并发用户)x2(请求)x2(重复2次)=20HTTP请求。
-
添加并发用户
在新打开的JMeter中,右击“测试计划”→“添加”→“Threads(Users)”→“线程组”,添加一个“线程组”
为它起一个有意义的名称“Apache Users”,线程数设置为5(5个用户并发),Ramp-Up Period(in seconds)设置为5(5秒内启动所有线程),循环次数设置为2(循环测试2次)
-
添加默认HTTP请求属性
右击“线程组”→“添加”→“配置元件”→“HTTP请求默认值”。在这里,你可以设置你的服务器名称或者IP,如此做,在以后的采样器等元件中,你将不必输入它们。
为“协议”设置
http
,为服务器名称或IP设置www.apache.org
-
添加对Cookie的支持
通常所有的Web测试都要支持Cookie,除非测试人员的应用系统很特别,不适用Cookie。
要添加HTTP Cookie管理器(HTTP Cookie Manager),只需简单的选中线程组,右击“添加”→“配置元件”→“HTTP Cookie管理器”即可。
-
添加HTTP请求
在测试计划中,我们打算发送两个HTTP请求,第一个是Apache主页(https://www.apache.org),第二个是download页面(https://www.apache.org/dyn/closer.cgi)。
首先为线程组添加第一个HTTP请求(“添加”→“Sampler”→“HTTP 请求”),接着选中该HTTP请求,并编辑其属性。
(1) 将“名称”改为“Home Page”(2) 将“路径”设置为 “/”
注意此处不需要设置协议、服务器名称或IP、端口号,因为在之前我们添加了“HTTP请求默认值”。
接下来,添加第二个HTTP请求,并编辑其属性
(1) 将“名称”改为“Download Page”(2) 将“路径”设置为“/dyn/closer.cgi”
-
添加监听器用于查看/存储测试结果
测试人员为测试计划添加的最后一个测试元件就是监听器,它可以把所有的HTTP请求结果存储在一个文件中,并提供可视化的模型加以展示。
选中线程组,“添加”→“监听器”,可以在其级联菜单中选择监听器类型,这里我们添加“图形结果”、“查看结果树”、“Aggregate Graph”、“Response Time Graph”这四个监听器。
到这里,你亲手创建的测试计划就完成了,你可以运行它并通过点击监听器查看测试结果。
录制Web测试脚本
你可以像上部分那样手动创建一个测试计划,但这样工作量大、出错率高等缺点,录制测试脚本可以避免这些缺点。
JMeter常见的录制脚本方式有两种:使用代理录制、使用Badboy工具录制。其中代理录制目前不支持录制HTTPS协议,原因在于HTTPS是安全协议,代理无法破译其通信内容,并录制请求参数或者Cookie。为了学习成本考虑,本文将不讲述代理录制。
使用Badboy录制脚本
-
安装并运行Badboy
你可以通过访问http://www.badboy.com.au/download/add下载最新版本的Badboy,安装并运行它。
-
使用Badboy录制
首次启动Badbody时,录制按钮默认处于选中状态,如下图所示中的红色小圆点。
在Bodboy地址栏中输入测试网址,然后按回车键。Badboy工具会使用内置的浏览器访问对应的网址,如下图所示:
在Badboy工具打开的页面中完成各项操作后。你可以在左侧看到录制的脚本,并对它们进行操作
录制完成后,点击红色小圆点停止录制
-
导出Badboy测试脚本
在Badboy中完成脚本录制后,可以将测试脚本导出成JMX格式(File→Export to JMeter ...),这样你就可以在JMeter中打开并做诸如添加监听器、修改脚本等修改,并运行它们。
测试
前面我们讲到在JMeter中创建和编辑脚本,当然你也用点击“开始”按钮(绿色箭头)的方法运行了脚本,这些都是在图形化界面中进行,图形化界面有直观、易用等优点,但它却能给你的性能带来不好的效果,因此这部分讲让你会使用命令行的方式去调用JMeter进行测试。
你可以自己创建测试计划,也可以通过录制得到一个测试计划,它们通常被保存成.jmx
格式,这里假设你的.jmx
文件全称为“demo.jmx”
- 在Linux/Mac下,在终端中切换到JMeter的bin目录下,输入
jmeter -n -t demo.jmx -l demo.jtl
后回车,等待片刻便可完成测试。 - 在Windows下,按“Win”+R键,输入cmd后回车,同样切换到JMeter的bin目录下,输入
jmeter -n -t demo.jmx -l demo.jtl
后回车,等待片刻便可完成测试。
查看测试结果
结果分析一般需要使用图形化界面,在图形化界面中执行“文件”→“打开”命令,打开.jmx
文件。
然后点击你想查看结果的监听器,在下图所示位置点击“浏览”,添加.jtl
文件即可查看到测试结果。(如果有图像展示,需要切换到“Graph”标签)