java脚本
package com.xxx.jemeter;
import java.util.HashMap;
import java.util.Map;
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.protocol.java.sampler.JavaSamplerClient;
import org.apache.jmeter.samplers.SampleResult;
import org.testng.Assert;
import com.zchz.testbase.HttpUtil;
import net.sf.json.JSONObject;
public class PerformanceTest implements JavaSamplerClient {
private SampleResult results;
private String a;
private String b;
private String filename;
public Arguments getDefaultParameters() {
Arguments params = new Arguments();
params.addArgument("filename", "0");// 设置参数,并赋予默认值0
params.addArgument("a", "0");// 设置参数,并赋予默认值0
params.addArgument("b", "0");// 设置参数,并赋予默认值0
return params;
}
public void setupTest(JavaSamplerContext arg0) {
// 开始时间
results = new SampleResult();
}
/**
* JMeter测试用例入口
*/
public SampleResult runTest(JavaSamplerContext arg0) {
b = arg0.getParameter("b"); // 获取在Jmeter中设置的参数值
a = arg0.getParameter("a"); // 获取在Jmeter中设置的参数值
filename = arg0.getParameter("filename"); // 获取在Jmeter中设置的参数值
System.out.println("开始计时");
results.sampleStart();// jmeter 开始统计响应时间标记 //添加的“聚合报告中会自动统计”
try {
/**
* 测试代码
*/
String api_url = "http://192.168.2.15:9999/bloc/";
results.setSamplerData("请求方式:" + "http get");
results.setSamplerData("请求接口:" + api_url +"common/blockNumber.json");//在Jmeter工具运行后,添加的“察看结果树”里,“请求”列表会输出这个结果
Map<String,String> header =new HashMap<String,String>();
header.put("Content-Type", "application/json");
JSONObject response =JSONObject.fromObject(HttpUtil.get(api_url+"common/blockNumber.json", new HashMap<String,String>(), header));
Assert.assertEquals(response.get("code"),"SUCCESS");
Long blockNumber = response.getLong("detail");
//设置在jemeter察看结果树中显示的相应数据
results.setResponseData("结果是: code = " +response.get("code") + "detail = " + blockNumber);//在Jmeter工具运行后,添加的“察看结果树”里,“响应数据”列表会输出这个结果
results.setDataType(SampleResult.TEXT);
results.setSuccessful(true);//输出测试结果是否正确,一般assert判断响应结果后设置
// 被测对象调用
} catch (Throwable e) {
results.setSuccessful(false);
e.printStackTrace();
} finally {
results.sampleEnd();// jmeter 结束统计响应时间标记
System.out.println("结束计时");
}
return results;
}
/**
* 每个线程销毁时 会调用一次runTest()方法后会调用此方法.
*/
public void teardownTest(JavaSamplerContext arg0) {
}
// public static void main(String[] args) {
// // TODO Auto-generated method stub
// Arguments params = new Arguments();
// params.addArgument("a", "0");// 设置参数,并赋予默认值0
// params.addArgument("b", "0");// 设置参数,并赋予默认值0
// JavaSamplerContext arg0 = new JavaSamplerContext(params);
// PerformanceTest test = new PerformanceTest();
// test.setupTest(arg0);
// test.runTest(arg0);
// test.teardownTest(arg0);
// }
}
HttpUtil
package com.xxx.testbase;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.Map;
import net.sf.json.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.StatusLine;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.util.EntityUtils;
public class HttpUtil {
private static PoolingHttpClientConnectionManager connMgr;
private static RequestConfig requestConfig;
private static final int MAX_TIMEOUT = 7000;
static {
// 设置连接池
connMgr = new PoolingHttpClientConnectionManager();
// 设置连接池大小
connMgr.setMaxTotal(100);
connMgr.setDefaultMaxPerRoute(connMgr.getMaxTotal());
RequestConfig.Builder configBuilder = RequestConfig.custom();
// 设置连接超时
configBuilder.setConnectTimeout(MAX_TIMEOUT);
// 设置读取超时
configBuilder.setSocketTimeout(MAX_TIMEOUT);
// 设置从连接池获取连接实例的超时
configBuilder.setConnectionRequestTimeout(MAX_TIMEOUT);
// 在提交请求之前 测试连接是否可用
configBuilder.setStaleConnectionCheckEnabled(true);
requestConfig = configBuilder.build();
}
public static String post(String url,JSONObject json,Map<String,String> header){
// TODO Auto-generated method stubf
// HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();;
CloseableHttpClient closeableHttpClient = HttpClients.createDefault(); ;
CloseableHttpResponse httpResponse = null;
HttpEntity entity = null;
HttpPost httpPost = new HttpPost(url);
String response="";
httpPost.setConfig(requestConfig);
StringEntity stringEntity = new StringEntity(json.toString(),"UTF-8");//解决中文乱码问题
stringEntity.setContentEncoding("UTF-8");
stringEntity.setContentType("application/json");
httpPost.setEntity(stringEntity);
for(String key:header.keySet()){
httpPost.addHeader(key, header.get(key));
}
try {
httpResponse = closeableHttpClient.execute(httpPost);
entity = httpResponse.getEntity();
response= EntityUtils.toString(entity,"UTF-8");
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}finally{
try {
httpPost.releaseConnection();
closeableHttpClient.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return response;
}
public static String post(String url,String json,Map<String,String> header){
// TODO Auto-generated method stubf
// HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();;
CloseableHttpClient closeableHttpClient = HttpClients.createDefault(); ;
CloseableHttpResponse httpResponse = null;
HttpEntity entity = null;
HttpPost httpPost = new HttpPost(url);
String response="";
httpPost.setConfig(requestConfig);
StringEntity stringEntity = new StringEntity(json,"UTF-8");//解决中文乱码问题
stringEntity.setContentEncoding("UTF-8");
stringEntity.setContentType("application/json");
httpPost.setEntity(stringEntity);
for(String key:header.keySet()){
httpPost.addHeader(key, header.get(key));
}
try {
httpResponse = closeableHttpClient.execute(httpPost);
entity = httpResponse.getEntity();
response= EntityUtils.toString(entity,"UTF-8");
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}finally{
try {
httpPost.releaseConnection();
closeableHttpClient.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return response;
}
public static String get(String url, Map<String, String> params,Map<String,String> header) {
String apiUrl = url;
StringBuffer param = new StringBuffer();
int i = 0;
HttpGet httpGet=null;
for (String key : params.keySet()) {
if (i == 0)
param.append("?");
else
param.append("&");
param.append(key).append("=").append(params.get(key));
i++;
}
apiUrl += param;
CloseableHttpClient httpclient = HttpClients.createDefault();
CloseableHttpResponse httpResponse = null;
String response="";
try {
httpGet = new HttpGet(apiUrl);
httpGet.setConfig(requestConfig);
for(String key:header.keySet()){
httpGet.addHeader(key, header.get(key));
}
httpResponse = httpclient.execute(httpGet);
HttpEntity entity = httpResponse.getEntity();
response= EntityUtils.toString(entity,"UTF-8");
} catch (IOException e) {
e.printStackTrace();
} finally{
try {
httpGet.releaseConnection();
httpclient.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return response;
}
}
注意:需在pom.xml文件中添加httpClient依赖, jmeter的依赖,testng的依赖, json依赖。
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.8.1</version>
<scope>test</scope>
</dependency><dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.7</version>
</dependency><dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.2.2</version>
<classifier>jdk15</classifier>
</dependency><dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_core</artifactId>
<version>5.0</version>
</dependency>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_java</artifactId>
<version>5.0</version>
</dependency>
然后打包成jar包,将jar包拷贝到Jmeter的lib/ext目录下。之后启动Jmeter,添加线程组和Java请求。
通过使用Jmeter自定义Java测试代码,再配合Jmeter自带的各种函数,就可以实现绝大多数的性能测试需求。