jmeter之java请求实例--提供post请求源码

前言:我在学习时候没有看到一篇关于java协议post方式详细文章,所以我就编写这篇blog,希望帮助新入门jmeter同学。

一、核心流程

  1. 准备java开发环境,jdk运行环境、jmeter安装部署等(这部分大家都可以百度到,俺就不多说了啊)。
  2. 准备需要用到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包。
  3. 通过eclipse开发脚本
  4. 生成jar
  5. 在jmeter中配置参数运行jar包
  6. 查看期待结果
  • 好了跟随我一步一步来入门吧

二、环境准备

配置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 --- 填写如下页面信息,完成导出操作。

注意:点击完成后有两次警告,直接选择是就好了。

四、jmeter配置

先将上步骤中导入JmeterTest.jar包导入到jmeter的lib/ext 目录中,然后启动jmeter,选择之前保存的测试计划,如下图:

修改参数值后,我们就可以运行脚本了

五、运行查看结果

  经常总结,互相学习!!

猜你喜欢

转载自blog.csdn.net/qq_19594755/article/details/81181268