|
| 1 | +###jmeter性能测试之windows篇 |
| 2 | + |
| 3 | +####一、jmeter在windows中的安装 |
| 4 | + |
| 5 | +jmeter就是传说中的绿色软件,无需安装,只需要在官网下载zip包后,解压即可。 |
| 6 | + |
| 7 | +####二、jmeter的运行 |
| 8 | + |
| 9 | +jmeter需要依托jdk,首先你的系统中得有jdk。在windows下,进入jmeter解压后的主目录(如apache-jmeter-2.13),进入bin目录,双击运行jmeter.bat即可启动jmeter。如果打开时cmd窗口报错,一般是给jmeter分配的空间太小,需要调整一些参数,我们可以在编辑器中打开jmeter.bat,调整两个参数的值,一个是HEAP,一个是NEW。我的jmeter中这两个值配置如下: |
| 10 | + |
| 11 | + set HEAP=-Xms512m -Xmx512m |
| 12 | + set NEW=-XX:NewSize=128m -XX:MaxNewSize=128m |
| 13 | + |
| 14 | +目前运行正常,如果您的设置和我的设置相同但无法启动,可以再调整一下,这两个参数的设置和你电脑本身的内存大小有关。 |
| 15 | + |
| 16 | +如果正常运行,会打开jmeter的主界面,如下图: |
| 17 | + |
| 18 | + |
| 19 | + |
| 20 | +####三、压测一个普通的get接口 |
| 21 | + |
| 22 | +下面我们来进行一个普通的get接口压测。接口是我自己写的,部署在自己本地机器,你们是访问不了的^_^。 |
| 23 | +接口地址:http://127.0.0.1:5000/api/search/user |
| 24 | +请求参数:term=xiaoming&type=1 |
| 25 | + |
| 26 | +好,下面我们打开jmeter的主界面,先在左侧测试计划上右键添加一个线程组,如下: |
| 27 | + |
| 28 | + |
| 29 | + |
| 30 | + |
| 31 | + |
| 32 | +下面对几个重要的地方进行说明: |
| 33 | + |
| 34 | +1.线程数 |
| 35 | +jmeter中的线程数相当于loadrunner中的虚拟用户(vuser),即你想要并发多少用户,我们这里并发10个用户,就是说10个用户同时不断请求这个接口 |
| 36 | + |
| 37 | +2.Ramp-Up Period |
| 38 | +这个参数指你想要多长时间启动这10个线程。我们这边在1秒内启动,如果设置为0,则是瞬间启动10个线程;如果设置为5,则是大约每秒启动两个线程。 |
| 39 | + |
| 40 | +3.循环次数 |
| 41 | +指的是每个线程请求多少次,我们这里设置为10,即每个线程发送10个请求,那么10个线程就会总共发出100个接口请求。如果勾选了永远,则表示一直发送请求。 |
| 42 | + |
| 43 | +4.Delay Thread creation until needed |
| 44 | +该参数勾选表示延迟创建线程,我一般不勾选。 |
| 45 | + |
| 46 | +5.调度器 |
| 47 | +我这里没有勾选,若勾选,则会出现下面的设置文本框: |
| 48 | + |
| 49 | + |
| 50 | + |
| 51 | +这个调度器常用于设置该次压测持续多长时间,比如,若持续时间填写为1800,则表示该次压测持续半小时后就会自动停止。 |
| 52 | + |
| 53 | +> Tips:如果设置了持续时间,则启动时间和结束时间的设置都将无效。并且如果你一旦勾选调度器,那么上面的循环次数最好勾选为永远。 |
| 54 | +
|
| 55 | +刚才我们添加了线程组,现在让我们右键点击左侧的线程组,添加一个HTTP请求: |
| 56 | + |
| 57 | + |
| 58 | + |
| 59 | +这个时候就要我们去设置要压测的url以及参数等等,我们已经设置好了,如下: |
| 60 | + |
| 61 | + |
| 62 | + |
| 63 | +关键位置已经用红框标注出来了,我们的服务器在本地,为127.0.0.1,我们的端口为5000,如果是http默认端口则不用填写。get请求的路径也已经填写进去了,还有我们的两个参数都添加进去了。接下来我们再添加一个查看结果数,以便我们先看下请求的结果是否正确。 |
| 64 | + |
| 65 | + |
| 66 | + |
| 67 | +Tips:当测试通过,正式进行性能测试时,一定记得把这个查看结果数去掉,好几次,就因为这个查看结果数的存在,把jmeter搞崩了。 |
| 68 | + |
| 69 | +目前我们左侧的目录树是这样的: |
| 70 | + |
| 71 | + |
| 72 | + |
| 73 | +好了,我们初步设置完了,下面保存一下这个测试计划(jmeter的测试计划后缀是jmx),然后执行一下看看: |
| 74 | + |
| 75 | + |
| 76 | + |
| 77 | +没错,执行按钮就是这个绿色小三角。还记得我们刚才添加线程组的时候,起了10个线程,每个线程循环10次,那么查看结果数下面就是100个请求,我们随便点击一个请求看下: |
| 78 | + |
| 79 | + |
| 80 | + |
| 81 | +没错,是预期的请求url,响应的json数据也正常。 |
| 82 | + |
| 83 | +#####性能测试的目的是什么? |
| 84 | +做一次性能测试,我们的目的肯定是要得到某个接口的性能数据,进而评估这个接口是否满足并发要求、时间要求、以及其他要求,如果不满足这些要求,那就要分析这个接口的性能瓶颈在哪,怎样优化等等。常见的性能数据是QPS以及响应时间。 |
| 85 | + |
| 86 | +QPS:指该接口在1s内能处理多少个请求 |
| 87 | +响应时间:该接口响应一次请求需要多少时间。 |
| 88 | + |
| 89 | +那么问题来了,我们怎么通过jmeter来查看这些数据呢?jmeter默认提供了一些图表,其中信息量最大的可能要数Aggregate Graph,下面我们添加一个看看: |
| 90 | + |
| 91 | + |
| 92 | + |
| 93 | +添加了聚合报告后,我们再跑一轮,看看这聚合报告里面有些什么数据。 |
| 94 | + |
| 95 | + |
| 96 | + |
| 97 | + |
| 98 | +聚合报告的表格中有很多字段,我们一个一个解读一下: |
| 99 | + |
| 100 | + Samples:表示总共请求了几次接口 |
| 101 | + Average:平均响应时间,单位ms |
| 102 | + Median:50%的请求的响应时间小于该值 |
| 103 | + 90% Line:90%的请求的响应时间小于该值 |
| 104 | + 95% Line:95%的请求的响应时间小于该值 |
| 105 | + 99% Line:99%的请求的响应时间小于该值 |
| 106 | + Min:最小的响应时间 |
| 107 | + Max:最大的响应时间 |
| 108 | + Error %:错误率 |
| 109 | + Throughput:吞吐率,即QPS(TPS) |
| 110 | + |
| 111 | +> Tips:关于Median、90% Line等的含义,很多同学都有误解,以为是各个百分比请求数下的平均响应时间,其实不然,拿90%Line来说,他指的是90%请求的最大响应时间,即按照响应时间从小到大排序,有90%的请求的响应时间是在该值之下的。 |
| 112 | +
|
| 113 | + |
| 114 | +从聚合报告我们可以看出我们想要的QPS和各个响应时间。 |
| 115 | + |
| 116 | +有同学可能会说,如果我想知道QPS和响应时间在我压测的过程中随着时间的变化曲线,这个需求怎么满足呢? |
| 117 | +jmeter默认自带的图表包含的东西并不多,不过我们可以在jmeter的官网上找到这些图表的插件。我们可以下载JMeterPlugins-Extras-1.3.1.zip,解压后在解压包的lib/ext目录得到JMeterPlugins-Extras.jar,把这个jar包复制到你的jmeter的安装目录的相同位置,如:apache-jmeter-2.13\lib\ext\ 目录下,并重启jmeter。 |
| 118 | +重启后,我们添加一个QPS图表和一个响应时间图表,如下: |
| 119 | + |
| 120 | + |
| 121 | + |
| 122 | + |
| 123 | + |
| 124 | + |
| 125 | +上图的Transactions Per Second就是QPS(TPS),下图就是接口响应时间随时间变化图。 |
| 126 | +现在我们左侧的目录树是这样的: |
| 127 | + |
| 128 | + |
| 129 | + |
| 130 | +我们再来进行一轮压测,观察下这两个图表: |
| 131 | +先看QPS: |
| 132 | + |
| 133 | + |
| 134 | + |
| 135 | +从上图我们可以看到目前我们的接口qps大约在430左右。 |
| 136 | + |
| 137 | + |
| 138 | + |
| 139 | +从响应时间图我们可以看到响应时间大概是11ms左右。大家可以对照聚合报告中的数据合并这连个图进行对比,看下是否一致。 |
| 140 | + |
| 141 | +####四、设置请求header |
| 142 | + |
| 143 | +看到这里,您对基本的get接口压测就有一定了解了。有时候,我们的请求是需要带header的,对于这种情况该怎么办呢?jmeter照样提供了相应的方法,我们可以添加一个HTTP信息头管理器,如下: |
| 144 | + |
| 145 | + |
| 146 | + |
| 147 | +在信息头中,我们也可以设置Cookie,比如如下: |
| 148 | + |
| 149 | + |
| 150 | + |
| 151 | +这样的设置就可以满足需要cookie验证的接口。 |
| 152 | + |
| 153 | +更多的设置就等您来慢慢发掘吧!jmeter已经足够强大。 |
| 154 | + |
| 155 | +####五、压测一个post接口 |
| 156 | + |
| 157 | +对于post接口的压测,其实是完全一样的,只有在设置HTTP请求的时候,设置为POST方法,并且请求body放入“Body Data”就可以,如下: |
| 158 | + |
| 159 | + |
| 160 | + |
| 161 | +####六、参数化 |
| 162 | + |
| 163 | +以上我们讲到的接口测试,参数都是固定的,那如果我们有一个测试集,要在这次性能测试中对同一个接口发送不同的参数该怎么办呢?这种需求很多,比如要进行一个线上真实流量的的测试,我们需要把nginx日志拿到,并且把这些真实的参数作为压测的输入,就会涉及到参数化。常用的参数化方法大概分为两种,下面分别介绍。 |
| 164 | + |
| 165 | +我们先看下需求,还是刚才的接口:http://127.0.0.1:5000/api/search/user |
| 166 | + |
| 167 | +现在我们不传固定的参数,我要从文件读取参数,文件格式如下: |
| 168 | + |
| 169 | + xiaoming,1 |
| 170 | + xiaohong,1 |
| 171 | + xiaolong,2 |
| 172 | + |
| 173 | +也就是说,我们想要每次请求的时候,把当前读取到的行的第一列赋值给term,第二列赋值给type,即每次请求的url如下: |
| 174 | + |
| 175 | + http://127.0.0.1:5000/api/search/user?term=xiaoming&type=1 |
| 176 | + http://127.0.0.1:5000/api/search/user?term=xiaohong&type=1 |
| 177 | + http://127.0.0.1:5000/api/search/user?term=xiaolong&type=2 |
| 178 | + |
| 179 | +当文件的三行取完后,再次从头开始依次取值。 |
| 180 | +我们先看第一种参数化方法。 |
| 181 | + |
| 182 | +#####1.函数助手 |
| 183 | + |
| 184 | +在jmeter菜单点击选项->函数助手对话框,弹出如下: |
| 185 | + |
| 186 | + |
| 187 | + |
| 188 | +在标1处,我们选择__CSVRead,然后在标2处写入我们的参数文件的路径:E:\data.txt |
| 189 | + |
| 190 | +> 此处与格式无关,且每列以半角逗号分隔 |
| 191 | +
|
| 192 | +然后在文件列号中写0(此处为固定值,表示我们的参数文件第一列序号从0开始)。然后在3处点击生成,把4处的函数字符串复制,然后开始在HTTP请求中设置参数,,如下: |
| 193 | + |
| 194 | + |
| 195 | + |
| 196 | +上图中的名称从上到下,依次就是参数文件中从左到右的每列,注意到在值的那列,我们的函数从上到下只有序号不同,依次从0往下排。 |
| 197 | + |
| 198 | +运行一下,并在查看结果树中查看每次请求的是否是不同的参数。 |
| 199 | + |
| 200 | +#####2.CSV Data Set Config |
| 201 | +这种方法下,我们需要添加一个配置原件,就叫CSV Data Set Config: |
| 202 | + |
| 203 | + |
| 204 | + |
| 205 | + |
| 206 | + |
| 207 | +每个字段含义如下: |
| 208 | + |
| 209 | +* Filename:指定文件路径 |
| 210 | +* File encoding:UTF-8 |
| 211 | + |
| 212 | +> Tips:保存参数文件的时候,注意要以utf-8格式保存 |
| 213 | +
|
| 214 | +* Variable Names:设置参数文件中每列的参数名 |
| 215 | +* Delimiter:分隔符,这里是半角逗号 |
| 216 | +* Recycle on EOF:为True,参数文件取值到结尾时再次从头取 |
| 217 | + |
| 218 | +设置了CSV Data Set Config后,我们还需要返回HTTP请求,去设置参数: |
| 219 | + |
| 220 | + |
| 221 | + |
| 222 | +注意这里使用“$”符号,来取参数文件的每列。 |
| 223 | + |
| 224 | +> Tips:这里的参数名一定要和CSV Data Set Config中设置的Variable Names相同。 |
| 225 | +
|
| 226 | +设置完这些,就可以检验成果了。 |
| 227 | + |
| 228 | +经过实测,第一种参数化方法取值有时会发生行错乱。如果要精确取值的话,最好还是采用第二种参数化方法。 |
| 229 | + |
0 commit comments