Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Latest commit

 

History

History
History
 
 

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 

README.md

Outline

jmeter性能测试之windows篇

一、jmeter在windows中的安装

jmeter就是传说中的绿色软件,无需安装,只需要在官网下载zip包后,解压即可。

二、jmeter的运行

jmeter需要依托jdk,首先你的系统中得有jdk。在windows下,进入jmeter解压后的主目录(如apache-jmeter-2.13),进入bin目录,双击运行jmeter.bat即可启动jmeter。如果打开时cmd窗口报错,一般是给jmeter分配的空间太小,需要调整一些参数,我们可以在编辑器中打开jmeter.bat,调整两个参数的值,一个是HEAP,一个是NEW。我的jmeter中这两个值配置如下:

set HEAP=-Xms512m -Xmx512m
set NEW=-XX:NewSize=128m -XX:MaxNewSize=128m

目前运行正常,如果您的设置和我的设置相同但无法启动,可以再调整一下,这两个参数的设置和你电脑本身的内存大小有关。

如果正常运行,会打开jmeter的主界面,如下图:

三、压测一个普通的get接口

下面我们来进行一个普通的get接口压测。接口是我自己写的,部署在自己本地机器,你们是访问不了的^_^。 接口地址:http://127.0.0.1:5000/api/search/user 请求参数:term=xiaoming&type=1

好,下面我们打开jmeter的主界面,先在左侧测试计划上右键添加一个线程组,如下:

下面对几个重要的地方进行说明:

1.线程数 jmeter中的线程数相当于loadrunner中的虚拟用户(vuser),即你想要并发多少用户,我们这里并发10个用户,就是说10个用户同时不断请求这个接口

2.Ramp-Up Period 这个参数指你想要多长时间启动这10个线程。我们这边在1秒内启动,如果设置为0,则是瞬间启动10个线程;如果设置为5,则是大约每秒启动两个线程。

3.循环次数 指的是每个线程请求多少次,我们这里设置为10,即每个线程发送10个请求,那么10个线程就会总共发出100个接口请求。如果勾选了永远,则表示一直发送请求。

4.Delay Thread creation until needed 该参数勾选表示延迟创建线程,我一般不勾选。

5.调度器 我这里没有勾选,若勾选,则会出现下面的设置文本框:

这个调度器常用于设置该次压测持续多长时间,比如,若持续时间填写为1800,则表示该次压测持续半小时后就会自动停止。

Tips:如果设置了持续时间,则启动时间和结束时间的设置都将无效。并且如果你一旦勾选调度器,那么上面的循环次数最好勾选为永远。

刚才我们添加了线程组,现在让我们右键点击左侧的线程组,添加一个HTTP请求:

这个时候就要我们去设置要压测的url以及参数等等,我们已经设置好了,如下:

关键位置已经用红框标注出来了,我们的服务器在本地,为127.0.0.1,我们的端口为5000,如果是http默认端口则不用填写。get请求的路径也已经填写进去了,还有我们的两个参数都添加进去了。接下来我们再添加一个查看结果数,以便我们先看下请求的结果是否正确。

Tips:当测试通过,正式进行性能测试时,一定记得把这个查看结果数去掉,好几次,就因为这个查看结果数的存在,把jmeter搞崩了。

目前我们左侧的目录树是这样的:

好了,我们初步设置完了,下面保存一下这个测试计划(jmeter的测试计划后缀是jmx),然后执行一下看看:

没错,执行按钮就是这个绿色小三角。还记得我们刚才添加线程组的时候,起了10个线程,每个线程循环10次,那么查看结果数下面就是100个请求,我们随便点击一个请求看下:

没错,是预期的请求url,响应的json数据也正常。

性能测试的目的是什么?

做一次性能测试,我们的目的肯定是要得到某个接口的性能数据,进而评估这个接口是否满足并发要求、时间要求、以及其他要求,如果不满足这些要求,那就要分析这个接口的性能瓶颈在哪,怎样优化等等。常见的性能数据是QPS以及响应时间。

QPS:指该接口在1s内能处理多少个请求 响应时间:该接口响应一次请求需要多少时间。

那么问题来了,我们怎么通过jmeter来查看这些数据呢?jmeter默认提供了一些图表,其中信息量最大的可能要数Aggregate Graph,下面我们添加一个看看:

添加了聚合报告后,我们再跑一轮,看看这聚合报告里面有些什么数据。

聚合报告的表格中有很多字段,我们一个一个解读一下:

Samples:表示总共请求了几次接口
Average:平均响应时间,单位ms
Median:50%的请求的响应时间小于该值
90% Line:90%的请求的响应时间小于该值
95% Line:95%的请求的响应时间小于该值
99% Line:99%的请求的响应时间小于该值
Min:最小的响应时间
Max:最大的响应时间
Error %:错误率
Throughput:吞吐率,即QPS(TPS)

Tips:关于Median、90% Line等的含义,很多同学都有误解,以为是各个百分比请求数下的平均响应时间,其实不然,拿90%Line来说,他指的是90%请求的最大响应时间,即按照响应时间从小到大排序,有90%的请求的响应时间是在该值之下的。

从聚合报告我们可以看出我们想要的QPS和各个响应时间。

有同学可能会说,如果我想知道QPS和响应时间在我压测的过程中随着时间的变化曲线,这个需求怎么满足呢? jmeter默认自带的图表包含的东西并不多,不过我们可以在jmeter的官网上找到这些图表的插件。我们可以下载JMeterPlugins-Extras-1.3.1.zip,解压后在解压包的lib/ext目录得到JMeterPlugins-Extras.jar,把这个jar包复制到你的jmeter的安装目录的相同位置,如:apache-jmeter-2.13\lib\ext\ 目录下,并重启jmeter。 重启后,我们添加一个QPS图表和一个响应时间图表,如下:

上图的Transactions Per Second就是QPS(TPS),下图就是接口响应时间随时间变化图。 现在我们左侧的目录树是这样的:

我们再来进行一轮压测,观察下这两个图表: 先看QPS:

从上图我们可以看到目前我们的接口qps大约在430左右。

从响应时间图我们可以看到响应时间大概是11ms左右。大家可以对照聚合报告中的数据合并这连个图进行对比,看下是否一致。

四、设置请求header

看到这里,您对基本的get接口压测就有一定了解了。有时候,我们的请求是需要带header的,对于这种情况该怎么办呢?jmeter照样提供了相应的方法,我们可以添加一个HTTP信息头管理器,如下:

在信息头中,我们也可以设置Cookie,比如如下:

这样的设置就可以满足需要cookie验证的接口。

更多的设置就等您来慢慢发掘吧!jmeter已经足够强大。

五、压测一个post接口

对于post接口的压测,其实是完全一样的,只有在设置HTTP请求的时候,设置为POST方法,并且请求body放入“Body Data”就可以,如下:

六、参数化

以上我们讲到的接口测试,参数都是固定的,那如果我们有一个测试集,要在这次性能测试中对同一个接口发送不同的参数该怎么办呢?这种需求很多,比如要进行一个线上真实流量的的测试,我们需要把nginx日志拿到,并且把这些真实的参数作为压测的输入,就会涉及到参数化。常用的参数化方法大概分为两种,下面分别介绍。

我们先看下需求,还是刚才的接口:http://127.0.0.1:5000/api/search/user

现在我们不传固定的参数,我要从文件读取参数,文件格式如下:

xiaoming,1
xiaohong,1
xiaolong,2

也就是说,我们想要每次请求的时候,把当前读取到的行的第一列赋值给term,第二列赋值给type,即每次请求的url如下:

http://127.0.0.1:5000/api/search/user?term=xiaoming&type=1
http://127.0.0.1:5000/api/search/user?term=xiaohong&type=1
http://127.0.0.1:5000/api/search/user?term=xiaolong&type=2

当文件的三行取完后,再次从头开始依次取值。 我们先看第一种参数化方法。

1.函数助手

在jmeter菜单点击选项->函数助手对话框,弹出如下:

在标1处,我们选择__CSVRead,然后在标2处写入我们的参数文件的路径:E:\data.txt

此处与格式无关,且每列以半角逗号分隔

然后在文件列号中写0(此处为固定值,表示我们的参数文件第一列序号从0开始)。然后在3处点击生成,把4处的函数字符串复制,然后开始在HTTP请求中设置参数,,如下:

上图中的名称从上到下,依次就是参数文件中从左到右的每列,注意到在值的那列,我们的函数从上到下只有序号不同,依次从0往下排。

运行一下,并在查看结果树中查看每次请求的是否是不同的参数。

2.CSV Data Set Config

这种方法下,我们需要添加一个配置原件,就叫CSV Data Set Config:

每个字段含义如下:

  • Filename:指定文件路径
  • File encoding:UTF-8

Tips:保存参数文件的时候,注意要以utf-8格式保存

  • Variable Names:设置参数文件中每列的参数名
  • Delimiter:分隔符,这里是半角逗号
  • Recycle on EOF:为True,参数文件取值到结尾时再次从头取

设置了CSV Data Set Config后,我们还需要返回HTTP请求,去设置参数:

注意这里使用“$”符号,来取参数文件的每列。

Tips:这里的参数名一定要和CSV Data Set Config中设置的Variable Names相同。

设置完这些,就可以检验成果了。

经过实测,第一种参数化方法取值有时会发生行错乱。如果要精确取值的话,最好还是采用第二种参数化方法。

Morty Proxy This is a proxified and sanitized view of the page, visit original site.