前言:我在学习时候没有看到一篇关于java协议post方式详细文章,所以我就编写这篇blog,希望帮助新入门jmeter同学。
一、核心流程
- 准备java开发环境,jdk运行环境、jmeter安装部署等(这部分大家都可以百度到,俺就不多说了啊)。
- 准备需要用到jar包 (ApacheJMeter_core.jar、ApacheJMeter_java.jar、avalon-framework-4.1.4.jar、commons-codec-1.10.jar、commons-httpclient-3.1.jar、commons-logging-1.2.jar、httpclient-4.5.3.jar、jorphan.jar、json.jar、logkit-2.0.jar 建议以上jar都添加到项目中) 来注意了,我偷偷告诉你个最全下载jar包地址(https://www.findjar.com/index.x)直接搜索就可以找到各个版本的jar包。
- 通过eclipse开发脚本
- 生成jar
- 在jmeter中配置参数运行jar包
- 查看期待结果
- 好了跟随我一步一步来入门吧
二、环境准备
配置jmeter环境:我的环境是jmeter 3.2 和 jdk 8.0
第一步:新建测试计划---新建线程组----新建java请求 (如图),jmeter配置完成
好了保存下脚本关闭jmeter窗口
配置eclipse开发环境:
1、打开eclipse,创建一个java工程;
第一步:File -- New -- Java Project 出来一个弹窗,如下;
按照上图说明进行配置,这样一个java项目就完成了。
新建后的目录结构:
第二步:新建项目包结构:
将JMeter的lib目录下的jar文件添加进此工程的Build Path;
选择项目右键 --- Build Path -- configure Build Path -- Java Build Path --- Libraries -- Add External JARs ,选择需要导入jar包,点击完成
到此,我们准备工作完成,接下来就开始编码了。
三、脚本开发及生成jar包
编写前需了解:
如果想要让你的代码在jmeter中运行起来,在创建类的时候需要去继承AbstractJavaSamplerClient抽象类或者是实现JavaSamplerClient接口,本文选择是继承AbstractJavaSamplerClient抽象类来实现的。
方法说明:
- public Arguments getDefaultParameters() {}
这个方法由Jmeter在进行添加javaRequest时第一个运行,它决定了你要在jmeterGUI中默认显示出哪些参数。
- public void setupTest(JavaSamplerContext context) {}
这个方法相当于loadrunner中的init,我们可以用它来进行一些初始化的动作。
- public SampleResult runTest(JavaSamplerContext context) {}
这个方法相当于loadrunner中的action,我们的核心测试代码就在这里了。
- public void teardownTest(JavaSamplerContext context) {}
这个方法相当于loadrunner中的end,收尾的工作可以由它来做。
以上是代码中必须实现的方法哦。了解完就开始编码吧。
首先,新建两个测试类TestLogin、SendTest类,如下图
其次,开始编写SendTest类
package com.cms.test;
import java.io.InputStream;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;
import org.json.JSONObject;
public class SendTest {
public static NameValuePair[] params(String url,String userName,String pwd) throws Exception{
//定义参数
NameValuePair[] params = new NameValuePair[2];
params[0] = new NameValuePair("user_name",userName);
params[1] = new NameValuePair("password",pwd);
return params;
}
public static Map<String, String> sendRequest(String url,NameValuePair[] params) throws Exception{
String responseMsg = "";
HttpClient httpClient = new HttpClient();
httpClient.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET,"UTF-8");
PostMethod requestMethod = new PostMethod(url);
//发送请求
//方法一:将参数设置在body信息中
requestMethod.setRequestBody(params);
//方法二 :将参数设置在body信息中
// requestMethod.addParameters(params);
httpClient.executeMethod(requestMethod);
System.out.println("发送请求完成:--------------------");
InputStream inputStream = null;
int size = 0;
byte[] bytes = new byte[1024 * 10];
inputStream = requestMethod.getResponseBodyAsStream();
size = inputStream.read(bytes);
responseMsg = new String(Arrays.copyOfRange(bytes, 0, size), "UTF-8");
if(size > 0){
System.out.println("服务器响应信息为:"+responseMsg);
}
Map<String,String> map=new HashMap<String,String>();
map.put("response", responseMsg);
try {
JSONObject responseMsgJson = new JSONObject(responseMsg);
String msg = responseMsgJson.getString("msg");
map.put("msg", msg);
} catch (Exception e1) {
// TODO: handle exception
e1.printStackTrace();
}
return map;
}
//注意打包时函数代码是需要注释掉的哦 否则会报错
//
// public static void main(String[] args) throws Throwable{
// String responseMsg;
// String userName="luodd";
// String pwd="luodd";
// String url = "http://beta-cms.wondershare.cn/login/login" ;
//
// NameValuePair[] params = SendTest.params(url, userName, pwd);
// Map<String,String> map=new HashMap<String,String>();
// map = SendTest.sendRequest(url, params);
//
// System.out.println("返回结果:" + map);
// responseMsg = map.get("msg");
// if(responseMsg.equals("Login success")) {
// System.out.println("cms登录成功*********");
// }else {
// System.out.println("cms登录失败----------" + map);
// }
//
// }
}
继续,编写TestLogin类,如下:
package com.cms.test;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
public class TestLogin extends AbstractJavaSamplerClient {
Map<String,String> map;
String url = "http://www.test.cn/login/login" ;
private String userName;
private String pwd;
NameValuePair[] params = null;
String responseMsg = null;
//自定义java方法入参
//params.addArgument("num1","");表示入参名为num1,默认值为空
//设置可用参数及默认值
public Arguments getDefaultParameters(){
Arguments params = new Arguments();
params.addArgument("url","输入http://IP:port");
params.addArgument("userName","test");
params.addArgument("pwd","test");
return params;
}
//线程执行前的初始化工作
public void setupTest(JavaSamplerContext arg0){
map=new HashMap<String,String>();
}
@Override
public SampleResult runTest(JavaSamplerContext arg0) {
url = arg0.getParameter("url");
userName = arg0.getParameter("userName");
pwd = arg0.getParameter("pwd");
try {
params= SendTest.params(url, userName, pwd);
} catch (Exception e1) {
// TODO: handle exception
e1.printStackTrace();
}
SampleResult sr = new SampleResult();
sr.setSampleLabel("cms登录");
//事物开始标记 ,jmeter开始统计响应时间
sr.sampleStart();
try {
//登陆
map = SendTest.sendRequest(url, params);
responseMsg = map.get("msg");
if(responseMsg.equals("Login success")){
//在查看结果树种展现结果
//sr.setResponseData("正确结果是:" +responseCode,null);
sr.setResponseData("正确结果是:" + map,null);
sr.setDataType(SampleResult.TEXT);
//设置事物是否通过
sr.setSuccessful(true);
}else{
sr.setResponseData("错误结果是:" + map,null);
//sr.setResponseData("错误结果是:" + responseCode,null);
sr.setDataType(SampleResult.TEXT);
sr.setSuccessful(false);
}
} catch (Exception e) {
// TODO Auto-generated catch block
//sr.setSuccessful(false);
}
sr.sampleEnd(); //事物结束
return sr;
}
//测试结束时调用
public void teardownTest(){
}
}
这样我们就完成了脚本编写,一个简单登录就通过httpclict方式就封装好了。
最后,我们看如何导出jar包
我新建的是java项目,所以导出是:选择项目右键 export -- java(新建什么项目就选择对应类型哦) -- Runnable JAR file---点击next --- 填写如下页面信息,完成导出操作。
注意:点击完成后有两次警告,直接选择是就好了。如果在导出jar包时找不到类的话,写个main方法运行下就有了
四、jmeter配置
先将上步骤中导入JmeterTest.jar包导入到jmeter的lib/ext 目录中,然后启动jmeter,选择之前保存的测试计划,如下图:
修改参数值后,我们就可以运行脚本了
五、运行查看结果
经常总结,互相学习!!