**1\. JMeter概述**
在平常的项目中,会有很多做系统集成的Webservice接口,这些接口都需要进行各种场景下的测试,观察是否能够正确返回所需的响应值及接口的运行状况。
因此我们为了尽可能还原多种场景,常常需要造大量的数据进行测试。如果每次都手动去拼接报文,再调用接口的话,除了工作量比较大,测试的场景也有限。
有没有一种工具可减轻造报文的工作量,模拟系统多并发高频率调用接口。
刚好我在的项目上有压测接口的需求,对JMeter做了简单学习并使用,现简单分享下。
**1.1. JMeter安装**
** 1.1.1. JDK安装 **
官网下载地址: http://www.oracle.com/technetwork/java/javase/downloads/index.html
** 1.1.2. JMeter安装 **
官网下载地址: http://jmeter.apache.org/download_jmeter.cgi
**2\. 使用JMeter完成单个接口测试**
**2.1. JMeter脚本编写**
** 2.1.1. 添加线程组 **
测试计划右键选择添加——线程用户——线程组
图中可以看到有三个可选项:
SetUP线程组:在普通线程组运行前先被运行。通常用在运行测试任务前,做初始化工作。例如建立数据库连接初始分化工作。
tearDown线程组:在普通线程组运行结束后被运行。通常用来做清理测试脏数据、登出、关闭资源等工作。例如关闭数据库连接。
线程组:通过设置线程数来模拟并发用户数,是虚拟用户的发起点。同时支持运行次数、以及定义调度运行时间和延迟启动。
本次,我们只需选择线程组即可。
** 2.1.2. 添加HTTP信息头管理器 **
线程组右键选择添加——配置元件——HTTP信息头管理器
将定义了值的接口头信息天添加到HTTP信息头管理器中,例如User-Agent、Authorization、Content-Type、Host等:
** 2.1.3. 添加HTTP请求 **
线程组右键添加——取样器——HTTP请求
**协议:** 默认HTTP协议,可不填写,若为HTTPS协议需要填写HTTPS
**服务器名称或IP:** 填写接口域名
**端口号:** 默认HTTPS请求的80,若为HTTPS请求需要填写443
**方法:** 直接选择接口的请求方法:GET,POST,PUT,DELETE即可
**路径:** 填写接口的具体路径
**参数:** 点击下方导航栏添加按钮,在已经添加的数据栏填写参数名,参数值
**内容编码:** 接口的内容编码,如utf-8、GBK等
**消息体数据:** 也就是请求报文,消息体数据和参数只能设置一种,不能两种同时设置
本次我们以fusion提供的创建客户头及地址信息标准API为例,各项信息填写如下:
**2.2. 运行测试**
** 2.2.1. 添加查看结果树 **
线程组右键添加——监听器——察看结果树
然后点击上方绿色的启动按钮:
** 左边: ** 展示请求名,绿色请求结果表示请求成功,红色请求结果表示请求失败。
** 右边: ** 展示请求值,包括取样器结果,请求头,请求体,响应头,响应体。
以上步骤能够确保接口正确的进行访问并返回对应的返回值,是后续做批量接口测试的必要条件。
**3\. JMeter使用CSV文件完成批量接口测试**
**3.1.**JMeter** 脚本编写 **
** 3.1.1. 加循环控制器 **
线程组右键添加——逻辑控制器——循环控制器
** 3.1.2. 参数化HTTP请求的消息体数据 **
将请求报文中需要变换的字段参数化,本次我们先将PartyNumber和AddressNumber字段参数化
**参数化规则:** ${parameter},如下图所示:
**
**
** 3.1.3. 创建CSV文件 **
打开excel,本次设置第一列数据为PartyNumber,第二列数据为AddressNumber,如果测试1000条数据,则需输入1000行,保存为CSV格式:
**
**
** 3.1.4. 在循环控制器下添加CSV配置文件 **
循环控制器右键添加——配置元件——CSV数据文件设置
然后会看到有些信息需要设置,本次设置如下:
CSV文件设置参数说明:
** 3.1.5. 设置循环控制器循环次数 **
循环次数:运行脚本后循环控制器下的HTTP请求将执行的次数。例如:循环控制器的计数为1,则发送HTTP请求1次;计数为10,则发送HTTP请求10次。设置为永远则需要手动停止请求,否则不会停止请求。本次设置为10次,即与CSV文件中的数据条数保持一致:
**
**
** 3.1.6. 设置线程组属性 **
直接单击选择线程组,右侧出现下图界面:
** 线程数: ** 虚拟用户的数量,简单来说就是配置几个就代表有几个虚拟用户,本次我们假设有100个用户,所以设置线程数为100。
** Ramp—Up 时间(秒): ** 表示从第一个虚拟用户开始生成直到最后一个虚拟用户开始生成的时间,比如加入配置了5个虚拟用户,Ramp-Up
设置成10s,那么JMeter会每隔2s生成1个虚拟用户,Ramp-
Up设置成0,那么所有用户将会同时立即产生,这个选项主要的作用是控制并发的强度,本次测试设置为1s。
** 循环次数: ** 每个线程发送请求的次数。因为我们刚刚已经配置了循环控制器,所以这里也可以不用再设置循环,默认为1次即可。
综上,我们设置了100个线程数,以及循环次数为10的循环控制器,100*10刚好就是我们本次需要测试的1000条数据。
**3.2. 运行测试**
** 3.2.1. 添加监听器 **
线程组右键添加——监听器——察看结果树/聚合报告/用表格察看结果/图形结果,其中察看结果树用来察看每次调用请求的请求报文和响应数据,后面三者主要用于接口的性能分析:
** 3.2.2. 查看结果树 **
点击顶上的绿色启动按钮,然后点击察看结果树,运行成功截图如下,可以看到请求报文中的参数可以被我们CSV文件中设置的数据正常替换:
同样点击取样器结果,或者响应数据中的Response Headers也可以查看HTTP响应状态:
点击响应数据中的Response Body,即可查看响应报文:
**3.3. 性能分析**
** 3.3.1. 查看聚合报告 **
点击聚合报告,即可看到JMeter生成的聚合报告:
各项参数理解:
** Label: ** 每个请求的自定义名称(无修改时默认显示请求类型,如Http,FTP等请求)
** #样本: ** 表示一共发出了多少个请求,可以看到本次一共发送了1000次请求
** 平均值: ** 平均响应时间——默认情况下是单个请求的平均响应时间
** 中位数: ** 也就是 50% 请求的响应时间
** 90%百分位: ** 90%请求的响应时间小于这个值
** 95%百分位: ** 95%请求的响应时间小于这个值
** 99%百分位: ** 99%请求的响应时间 小于这个值
** 最小值: ** 最小的响应时间
** 最大值: ** 最大的响应时间
** 异常%: ** 本次测试中出现的错误率,即错误的请求的数量/请求的总数
** 吞吐量: ** 默认情况下表示每秒完成的请求数,注意单位的变化
** 接收 KB/sec: ** 每秒从服务器端接收到的数据量
** 发送 KB/sec: ** 每秒从客户端发送的请求的数据量
** 3.3.2. 用表格查看结果 **
点击用表格察看结果,即可看到JMeter生成的结果表格,该表格可以按自定义顺序显示每个请求的开始时间、耗时、响应状态等,方便进行结果分析:
各项参数理解:
** Sample#: ** 每个请求的序号,本次是从1到1000
** Start Time: ** 请求开始时间
** Thread Name: ** 线程名称,本次是线程组1-1到线程组1-100,循环10次
** Label: ** 每个请求的自定义名称(无修改时默认显示请求类型,如Http,FTP等请求)
** Sample Time: ** 取样时间
** Status: ** 请求的状态,红色表示失败,绿色表示成功
** Bytes: ** 每个请求接收的字节数
** Sent Bytes: ** 每个请求发送的字节数
** Latency: ** 延迟的时间,等待时长
** Connect Time: ** 连接服务器的时间
** 样本数目: ** 所有请求个数,样本数目 = 线程数(请求用户数)* 请求次数
** 最新样本: ** 最新样本响应时间,表示服务器响应最后一个请求的时间
** 偏离: ** 服务器响应时间变化、离散程度测量值的大小,换句话说,就是数据的分布
** 3.3.3. 查看图形结果 **
点击图形结果,即可看到JMeter生成的图形结果,根据曲线的走向趋势,结合各项指标进行结果分析。
**· · · END · · ·**
作者:汪心越
审核:邓金边
编辑:王锐