JMeter简介
JMeter是Apache组织开发的基于java的压力测试工具。最初用于web应用测试,后来被扩展至其它领域。JMeter是使用多线程模拟用户群的方式,完成对应用的压力测试。
在移动应用领域,压力测试分为两部分,APP端的压力测试和后台的压力测试。
APP端的压力测试,通常使用Monkey/MonkeyRunner来进行,而对于后台的压力测试,JMeter是一个不错的选择。
相比强大的LoadRunner(11.0,版,3.1G),JMeter相对小巧(15M)。两者最大的区别在于,前者可以模拟不同IP。
JMeter环境设置
JMeter当前版本为4.0。
下载地址为:JMeter Apache
下载后,直接解压即可。
JMeter的使用需要JDK环境。因此JDK环境变量的设置是必须的,本文不再过多描述。
JMeter也需要进行环境变量设置。
JMETER_HOME:解压路径。
并在PATH中,添加%JMETER_HOME%\lib; %JMETER_HOME%\lib\ext
点击%JMETER_HOME\bin%目录下的JMeter.bat即可启动。
启动界面如下:
示例
之前做了一个Springboot项目,处理APP端发送的一个数据签名请求,就用JMeter来进行一下压力测试,记录一下JMeter的使用过程。
先来看一下,最终建立的示例PLAN结构。这里只是给出一个结构,个人搭建时不必强求一样。
创建TestPlan
点击File->New,创建Test Plan。
Test Plan:等同于一个测试工程。该工程仅有一个文件,后缀为jmx,XML文件格式。在JMETER中进行的所有设置,都存在于该文件中。
创建Thread Group
选择TestPlan->右键->Threads(Users)->ThreadGroup。
Thread Group可以看做是用户组,每条Thread可以看做是一个用户。
Number of Threads:用户数量。
Ramp-Up Period(in seconds):多长时间内,将所有的用户请求发完。仅仅是发送,不包括接收。
Loop:循环次数。所有请求发送完毕,为1次。
创建User DefinedVariables
选择TestPlan或ThreadGroup->右键->add->ConfigElement->User Defined Variables。
User Defined Variables用于定义变量。例如,定义KW_DATA,使用时调用${KW_DATA}。注意,KW_DATA的值将直接替换${KW_DATA}。对于String类型来说,若KW_DATA的值无“”,则替换位置无“”。
如果有注意的话,在TEST PLAN中也可以定义User Defined Variables。
创建Http Request
选择ThreadGroup->右键->add>Sampler->UserDefined Variables。
HttpRequest是最主要的部分。这里将填写URL,PATH,PORT,PROTOCOL,METHOD,以及传输数据。
可以看到,我们在UI中使用到了之前定义的变量。
需要注意的是Body Data中的${send}未曾定义,后面再解释。
创建Http Header Manager
选择TestPlan或ThreadGroup->右键->add->ConfigElement->Http Header Manager。
HTTP Header Manager用于管理Header中添加的参数。比如:Content-Type,或其他自定义参数。
BeanShell PreProcessor
选择TestPlan或ThreadGroup->右键->add->PreProcessors。
Bean Shell PreProcessor在发送数据前,对数据进行处理。例如,加密。
需要指出的是,处理后的数据,会被填充至HTTP Request中,而后发送。而非将HTTPRequest中的数据进行处理后,直接发送。
示例代码如下:
log.info("import finished");
JSONObject jsonObject1 = new JSONObject();
jsonObject1.put(${KW_1},"00112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566");
jsonObject1.put(${KW_2},"00112233445566778899001122334455");
jsonObject1.put(${KW_3},"00112233445566778899");
jsonObject1.put(${KW_4},"00112233");
jsonObject1.put(${KW_5},"00112233");
jsonObject1.put(${KW_6},"00");
jsonObject1.put(${KW_7},"001122");
jsonObject1.put(${KW_8},"001122334455667788990011223344556677889900112233445566778899001122");
jsonObject1.put(${KW_9},"0011223344");
jsonObject1.put(${KW_10},"0011");
JSONArray jsonArray=new JSONArray();
jsonArray.add(jsonObject1);
JSONObject jsonObject=new JSONObject();
jsonObject.put(${KW_TIME},"20180319180000");
jsonObject.put(${KW_DATA},jsonArray);
log.info("json data is OK");
byte[] encrypted;
try {
encrypted = Crypto.AES......ing(jsonObject.toString().getBytes("utf-8"),new ByteArray(${TransKey}).getBytes());
} catch (Exception e) {
e.printStackTrace();
}
String base64 = Base64.encode(encrypted);
System.out.println("base64 msg is "+base64);
String sign = RSA.sign(base64,${UserRSAPriKey});
System.out.println("sign msg is "+sign);
String send = base64+sign;
vars.put("send",send);
Beanshell,Lightweight Scriptfor java,因此,这里直接拷贝测试用的JAVA代码即可。在需要的地方,使用${XXXXX}调用JMeter变量即可。
此外,还要注意,若有第三方jar包引用,需要将jar放到PATH的相关目录中。建议%JMETER_HOME%\lib\ext目录下,方便管理。
这里还需要强调一下:
代码中的vars实为map,是JMETER中的常量。通过指定KEYWORD,与JMETER进行通讯。例如我们此前在HTTP Request Body Data中使用到的${send},就是在此处定义,并赋值的。
创建Bean Shell PostProcessor
选择TestPlan或ThreadGroup->右键->add->PostProcessors。
与Bean Shell PreProcessor相反,Bean ShellPostProcessor对接收后的数据进行处理。
示例代码如下:
String resp=prev.getResponseDataAsString();
if(resp!=null){
log.info("response = "+resp);
XXXXAuth Auth = new XXXXAuth(new ByteArray(${TransKey}).getBytes(),resp,${PFRSAPubKey},null);
int result=Auth.verify();
if(result==0){
log.info("verify success"+Auth.getClear());
}
else{
log.info("verify failed, result = "+result);
}
}
这里需要指出的是,
(1)prev,用于获取HTTP Response数据。
(2)log用于输出日志。
两者皆为JMETER内部变量,可在脚本中直接使用。
创建View Results Tree
选择TestPlan或ThreadGroup->右键->add->Listener->ViewResults Tress
View Results Tree用于查看,每次请求的发送报文和响应报文。
例如,我们发送了两次请求,可依次点击查看各自的Request和Response。
创建Summary Report
选择TestPlan或ThreadGroup->右键->add->Listener->SummaryReport。
Summary Report用于查看,所有请求的成功率,响应时间,平均时间等。时间单位皆为ms
启动要测试的Springboot服务,运行JMeter Test Plan
在所有Response接收完毕后,测试将自动停止。
在运行过程中,JMeter会在右上角显示运行时间,剩余未接收到的Response数量。
若有失败请求,将会显示黄色三角形叹号。点击后,会跳转至LOG窗口。
测试完毕后,可点击Summary Report或View Results Tree查看相应结果。