JMeter压力测试技术-基础篇

简介

Apache JMeter是一款强大的图形界面压力测试工具,是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试但后来扩展到其他测试领域。

Apache jmeter 可以用于对静态的和动态的资源(文件,Servlet,Perl脚本,java 对象,数据库和查询,FTP服务器等等)的性能进行测试。它可以用于对服务器,网络 或对象模拟繁重的负载来测试它们的强度或分析不同压力类型下的整体性能。你可以使用它做性能的图形分析或在大并发负载测试你的服务器/脚本/对象。

Jmeter 是一个非常流行的性能测试工具,虽然与LoadRunner相比有很多不足,比如:它结果分析能力没有LoadRunner详细;很它的优点也有很多:

  • 开源,他是一款开源的免费软件,使用它你不需要支付任何费用,

  • 小巧,相比LR的庞大(最新LR11将近4GB),它非常小巧,不需要安装,但需要JDK环境,因为它是使用java开发的工具。

  • 功能强大,jmeter设计之初只是一个简单的web性能测试工具,但经过不段的更新扩展,现在可以完成数据库、FTP、LDAP、WebService等方面的测试。因为它的开源性,当然你也可以根据自己的需求扩展它的功能。

配置

从官网下载JMeter压缩包,注意下载的是 apache-jmeter-2.13.zip (不是 apache-jmeter-2.13_src.zip ), 目前最新版本是2.13
下载解压后,在目录jakarta-jmeter-2.4\bin下可以见到一个jmeter.bat文件,双击此文件,打开初始界面如下图:

注意的是上面显示的是中文,如果你想使用其他语言,比如英文,那么通过菜单选项->选择语言->英文即可,当然转为中文也是同样操作。

HTTP Request

建立一个线程组,如下图


为什么要建立线程组?原因很简单,因为我们要模拟多个线程(用户)来访问网站。
线程组创建界面如下图:

名称可以随意填写,默认选中“继续”即可。
线程属性部分中,线程数是启动多少个线程,我这里填写的是60,Ramp-Up Period (in seconds)表示线程之间间隔多少时间允许,单位是秒,比如如果填写120,那么120/60=2表示60个线程间每隔2秒钟请求网站。

Ramp-Up Period官方解释:

Ramp-up Period 
How long JMeter should take to get all the threads started. 
If there are 10 threads and a ramp-up time of 100 seconds, 
then each thread will begin 10 seconds after the previous thread started, 
for a total time of 100 seconds to get the test fully up to speed.

循环次数:60个线程运行完毕算是一次,循环次数就是这样的一个请求过程运行多少次,我这里填写的是1000.
每次修改一个设置后,别忘记了保存一下。

设置请求服务器、压力链接等信息

接下来很自然的是,我们要测试的网站地址是什么?链接是什么?所以现在我们就来设置这些信息。
右键点击我们刚创建的线程组,在弹出的菜单中,选择添加->Sampler->Http请求,弹出如下图界面:

名称:随意填写

注释:可有可无

服务器名称或IP:我这里填写 zihou.me

端口号:我这里填写80

Timesout部分可以不填

HTTP请求部分的协议:http,方法我选择的是GET,Content encoding我填的是UTF-8.

路径:
这里值得一提的就是这个路径,假如你只是对一个链接进行压力测试,那么这里就非常简单了,你就直接填写一个链接就够了,比如http://www.zihou.me,但很多情况下都不是这样的,我们这里需要多个链接,就如同刚开始讲到的那样,我们要将多个链接保存到一个文本文件中,然后随机读取进行压力测试。我们可以这么干,如图:

在选择一个功能下拉列表中选择_StringFromFile,然后在本机新建一个测试文件text.txt,在第一行(你也可以不在第一行)的值中填写测试文件的路径,如下图:

然后点击“生成”按钮,在生成按钮的左边文本框中将生成一个字符串如:

${__StringFromFile(E:\test\test.txt,,,)}

在测试文件中,我们每行写一个URL链接,如下格式:

2011/03/26/3054

2011/03/26/3052

2011/03/26/3042

2011/03/25/3040

2011/03/25/3034

2011/03/24/3027

注意,每行前面并没有http://www.zihou.me这样的信息,因为我们在前面已经填写了服务器地址为zihou.me,这里就没必要再为每个url填写这个相同前缀了;另外,上面的url格式也只是个例子,表示域名后的部分,但很多时候url后面跟的都是各参数,比如http://www.zihou.me/p?a=1&b=3,如果是这种情况,则上面的链接可以写为:
a=1&b=3 这样的形式。

现在我们可以来填写前面所说的路径了,如下:

/ ${__StringFromFile(E:\test\test.txt,,,)}

这样一来,当我们并非请求的时候,就会从test.txt中随机选择url来进行压力测试。

另外值得注意的一个地方是,如果参数中有中文的情况,运行的时候可能会出现乱码,这个时候就需要注意你在Jmeter中的编码设置与你要请求的网页编码是一致的。

路径文本框下面的选项,可以按默认的就成,Use multipart/form-data for HTTP POST是当请求中有附件的情况,一般情况下都不用选中的。

同请求一起发送参数部分:如果你仅仅是对某一个固定的页面进行压力测试,那你就可以不用进行上面所说的在文本文件中设置URL的过程了,直接在这里设置就行了,这里的名称就是参数名,值就是参数值,在这里添加就OK了,但你如果是压力多个链接,那这里你可以不用填。

查看运行结果

上面设置好后,接下来很自然的想到如何查看运行结果呢?Jmeter在这方面提供了好些个查看方式,有表格形式,有曲线形式等等,我个人认为查看表格形式就足够了!

鼠标右键点击线程组,在弹出的菜单中选择添加->监听器->用表格查询结果,如下图:

当然,你也可以选择其他查看方式,你也可以看到在监听器菜单中,有好多种方式。

运行

好了,现在我们终于可以运行了!
选择菜单项运行->启动,如下图:

当然,在运行前,你得把所有修改都保存了。
运行后的结果表格如下:

各属性如下:

Sample:每个请求的序号

Start Time:每个请求开始时间

Thread Name:每个线程的名称

Label:Http请求名称

Sample Time:每个请求所花时间,单位毫秒

Status:请求状态,如果为勾则表示成功,如果为叉表示失败。

Bytes:请求的字节数

如果Status为叉,那很显然请求是失败了,但如果是勾,也并不能认为请求就一定完全成功了,因为还得看Bytes的字节数是否是所请求网页的正常大小值,如果不是则说明发生了丢包现象,也不是完全成功。

在下面还有几个参数

样本数目(No of Samples):也就是上面所说的请求个数,成功的情况下等于你设定的并发数目乘以循环次数。

平均(Average):每个线程请求的平均时间

最新样本(Latest Sample):表示服务器响应最后一个请求的时间

偏离(Deviation):服务器响应时间变化、离散程度测量值的大小,或者,换句话说,就是数据的分布。

好了,主要的就介绍这么多了,其实Jmeter做压力测试的范围远远不止于对Web,它还可以用于Java小服务程序、CGI 脚本、Java 对象、数据库, FTP 服务器等等,更多的使用可以根据自己的需要去研究掌握。

最后还提到的一点是:你一定注意到了,HTTP请求和结果查看都是在线程组这一节点下创建的,其实,你也可以不用一定要在线程组下创建,你在测试计划下建立也可以,但创建在线程组下面可以使得我们的测试意图一目了然,也就是我们的HTTP请求和结果查看都是基于我们设定的线程组的。

本站总访问量