使用JMeter

JMeter是一款基于java开发的压力测试应用。最初是为测试 Apache JServ(tomcat的前身)的性能而开发的。不久以后,JMeter也成为了jakarta的一个子项目。

安装

截至目前(20150408),JMeter最新的版本是2.13。用户可以在JMeter官网下载最新的稳定版本。官网提供了.zip和.gz两种格式的下载文件。JMeter2.13需要JDK1.6或更高版本的环境。

下载解压完成后,可以尝试启动jmeter。在linux环境下,运行bin目录下的jmeter脚本,在windows环境下,需要调用jmeter.bat文件。建议将bin目录添加到系统环境变量下,以便调用。下图是JMeter的主窗口:

jmeter console

可以看到,整个界面分为两部分。左侧是测试中需要使用的元素,包括测试计划和工作台。在这篇文章里,我们主要说说测试计划的使用。右键点击测试计划(或工作台),可以添加新的测试计划(或工作台)元素。右键点击新增的测试计划(或工作台)内容,可以选择将之删除。右侧面板则展示了测试计划或工作台的详细信息。

现在可以准备使用JMeter了,但是有两点需要注意:

  • 不可以将JMeter和被测试的应用在同一台机器上运行。因为JMeter会占用大量的系统资源,如果被测试的应用在同一台机器上的话,应用的性能会受到影响;
  • 尽量避免测试受到网络因素的影响。最好可以让网络管理员建立一个隔离的子网络来运行JMeter和被测试的应用。

一个简单的测试

首先,我们进行一个非常简单的测试。在这个测试里,我们将建立一个测试计划,并对一个web应用进行测试。通过这个测试,你可以了解到JMeter的一些常用概念,并基本掌握使用JMeter进行测试的能力。

在实施测试前,我们需要先创建一个测试计划。测试计划描述了使用JMeter进行测试的步骤。一个测试计划包括一个或多个线程组、逻辑控制器、配置元件、定时器、前置处理器、后置处理器、Sampler、断言、监听器等等。如果不懂这些东西是做什么的,先不要担心,我们会在后面的部分说清这些元素的用法。

一个测试计划需要有至少一个线程组。线程组是测试计划实施的起点,它可以包含JMeter实施测试的其它元素。在测试中,线程组负责控制JMeter模拟的用户线程。

现在我们从创建线程组开始。右键点击测试计划,添加->Threads(Users)->线程组,这样就可以在测试计划下新增一个线程组元素了。点击新建的线程组,可以看到下图:

image

简单介绍下面板中的几个属性:

  • 名称——线程组的名字。可以用一个简短的名称来描述线程组,也可以在注释中给它添加说明;
  • 线程数——JMeter创建的线程数。每个线程代表一个用户。如果想测试10个用户同步操作,那么输入10;
  • Ramp-Up Period——这里标识JMeter创建所有的线程所需要的时间,时间单位是秒。如果线程数是10,Ramp-Up Period是20秒,那么就表示JMeter将在20秒内创建10个线程,即每2秒创建一个线程。如果要20个线程立刻创建完成的话,那么输入0;
  • 永远——如果勾选的话,这个选项会使JMeter无限次地发送请求给被测试应用。如果不勾选的话,那么JMeter只会重复发送指定循环次数的请求;
  • 循环次数——这个属性只会在“永远”复选框没有勾选的情况下发挥作用。这个属性是用来告诉JMeter循环发送多少次请求。

在我们这个小测试中,按照下图来填充测试时的属性。我们模拟了两个用户,每个用户会发送三次请求。这次我们使用了几个非常小的数,这是为了方便我们接下来解释测试结果。在真正的测试环境中,我们更喜欢使用一些很大的数字。

create test plan

接下来,我们将添加一些测试HTTP 请求的元素。右键点击线程组,添加->Sampler->HTTP请求,这样就添加了一个HTTP请求元素。点击“HTTP请求”,可以看到如下图所示的界面:

add http post

在“HTTP请求”面板上,可以设置HTTP请求的参数。这里,有如下几个属性:

  • 名称——HTTP请求的名称。名称需要有足够的代表性,要知道一个线程组中一般会有多个HTTP 请求;
  • 服务器名称或IP——测试应用所在的主机名称或IP地址;
  • 端口号——测试应用所占用的端口号;
  • 协议——所使用的协议,如HTTP或HTTPS;
  • 方法——请求方法,如GET或POST;
  • 路径——资源请求的路径;
  • 跟随重定向——如果有重定向的话是否跟随;
  • Use KeepAlive——如果勾选的话,在请求头中将会包含“Connection = Keep-Alive”;一般的浏览器,在使用HTTP1.1协议发送请求的时候会默认使用“Connection = Keep-Alive”作为连接头。因此,这个复选框一般都会被勾选上;
  • Parameters——请求中所发送的参数列表,可以使用添加、删除按钮添加或删除参数;
  • 同请求一起发送文件——模拟文件上传。

现在,弄清“HTTP请求”中的配置参数了吧。我们还有最后一个要添加到ThreadGroup中的元素,就是监听器。监听器在JMeter中的作用类似于报表。JMeter提供了多种报表,包括图形报表和表格报表。在这次测试中,我们使用最简单的表格报表。右键点击线程组元素,添加->监听器->用表格查看结果,添加表格报表。

好了,一切就绪,可以运行我们的测试计划了。在这之前还有最后一个忠告:在执行测试计划前一定要先保存测试计划,因为JMeter有可能会导致系统崩溃(在线程和循环次数较多的情况下可能会发生这样的情况)。现在,点击绿色的启动按钮运行我们的测试计划吧。

在测试计划运行期间,工具栏右侧有个小方块会变成绿色(有时需要将窗口最大化)。

green icon

因为一个测试不会无限期的执行下去,当测试计划执行完毕时,JMeter会自动将之关闭。若JMeter无法自动关闭测试,就需要我们做出干预。点击红色的停止或关闭按钮,关闭所有的连接,结束当前的测试计划。

运行我们的测试计划,得到的结果如下图:

test plan result

表格中的信息还是比较容易理解的。一共产生了6个测试样本(2个线程,3个循环次数,2*3=6)。表格的第6列标识所有的样本都已测试成功。表格的第5列是样本响应时间,分别是33,32,11,11,10,10。平均响应时间是(33+32+11+11+10+10)/6 = 17(这里是向下取整)。

另外一个重要的指数是偏离度。偏离度是每个样本的响应时间与平均值之间偏差的平方之和的平方根(有点绕,实际上就是标准差,可以据此分析离散性,概率论相关概念)。这个数值标识了被测试应用的稳定性。如果偏离度比较高的话,说明一部分用户会得到非常快速的响应,而另一部分用户却会等上很长的时间。总之,偏离度这个值是越小越好。

练习了这样一个简单的测试后,也就可以从容应对一些复杂的测试了。在进行Web应用的压力测试时,可以逐步提高线程数和循环数,以便观察被测试应用是怎样应对高负载压力的。

接下来的几节将说明一些使用JMeter进行压力测试的一些比较重要的内容。

监听器

JMeter提供了多种监听器(或者说是报表)。在刚才的测试中,我们使用了表格来展示测试结果。如果表格报表不能满足需求的话,还可以为线程组选择一个或者多个监听器。其中比较常用的一个监听器是“图形结果”,如下图所示:

listener

复合HTTP请求

一个web应用可能同时包含静态的和动态的资源。如果想查看这些资源的性能,JMeter可以很轻松地实现发送复合式的HTTP请求。实现这个测试,只需要添加一定数目的“HTTP请求”元素,并分别进行配置即可。当建立了多个HTTP请求元素时,你可能会希望为所有的HTTP请求创建默认值,下一节会说明如何建立HTTP请求默认值元素。

HTTP请求默认值

右键点击线程组元素,添加->配置元件->HTTP请求默认值,添加HTTP请求默认值元素。正如其名,HTTP请求默认值元素指定了同一个线程组下所有的HTTP请求元素的配置参数默认值。HTTP请求默认值是一个非常有用的元素。在绝大多数情况下,HTTP请求总会有些相同的配置参数属性,比如服务器和端口。

http request default

HTTP Cookie 管理器

许多web应用都使用了cookie。JMeter通过HTTP Cookie管理器提供了cookie管理功能。在线程组中添加了cookie管理器后,就可以像浏览器一样发送cookie信息了。右键点击线程组元素,添加->配置元件->HTTP Cookie 管理器,可以添加HTTP Cookie管理器,下图是cookie管理器的配置页:

http cookie

总结

这次我们只是做了一个十分简单的测试,而使用JMeter能做的事情远远不止这些。通过我们提到的这些元素,可以使用JMeter进行各种测试并取得详尽的测试结果报告。这样得到有价值的结果也很容易了。

OK!

本文是翻译的一篇英文文章。难免有词不达意的地方,还请见谅。

原文在这里:http://www.onjava.com/pub/a/onjava/2003/01/15/jmeter.html

还有,这是JMeter的用户手册,虽然说得比较简略,可还是聊胜于无:http://jmeter.apache.org/usermanual/index.html


发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据