1.最近需要测试多线程访问服务,试了下postman,发现postman是串行的,并不能实现并发访问接口,由于对JMeter不是很熟悉,就自己写了一个工具类进行并发测试,在这里分享一下。
2.post请求访问http服务,使用HttpUtil.java,工具类,见java post访问工具类(使用post方式请求http接口)_weixin_38869597的博客-CSDN博客
package com.util;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
public class HttpUtil {
private static String charset = "utf-8";
private static CloseableHttpClient httpClient = HttpClients.createDefault();
@SuppressWarnings({"unchecked", "rawtypes"})
public static String doPost(String url, String jsonStr) {
HttpPost httpPost;
String result = null;
try {
httpPost = new HttpPost(url);
// 设置参数
httpPost.setHeader("content-Type","application/json;charset=UTF-8");
StringEntity entity = new StringEntity(jsonStr);
httpPost.setEntity(entity);
HttpResponse response = httpClient.execute(httpPost);
if (response != null) {
HttpEntity resEntity = response.getEntity();
if (resEntity != null) {
result = EntityUtils.toString(resEntity, charset);
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
return result;
}
}
3.测试入口(main方法),如下:
package com.json.test;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
/**
* 读取json文件,然后修改唯一主键
*/
public class BuildJsonString {
public static void main(String[] args) {
String url = "http://ip:port/controller/method";
// System.out.println(params1 + "-----" + params2);
new Thread(new CurrencyPostAccess(url, getParamsByUniqueId())).start();
new Thread(new CurrencyPostAccess(url, getParamsByUniqueId())).start();
new Thread(new CurrencyPostAccess(url, getParamsByUniqueId())).start();
new Thread(new CurrencyPostAccess(url, getParamsByUniqueId())).start();
new Thread(new CurrencyPostAccess(url, getParamsByUniqueId())).start();
new Thread(new CurrencyPostAccess(url, getParamsByUniqueId())).start();
new Thread(new CurrencyPostAccess(url, getParamsByUniqueId())).start();
new Thread(new CurrencyPostAccess(url, getParamsByUniqueId())).start();
new Thread(new CurrencyPostAccess(url, getParamsByUniqueId())).start();
new Thread(new CurrencyPostAccess(url, getParamsByUniqueId())).start();
new Thread(new CurrencyPostAccess(url, getParamsByUniqueId())).start();
new Thread(new CurrencyPostAccess(url, getParamsByUniqueId())).start();
new Thread(new CurrencyPostAccess(url, getParamsByUniqueId())).start();
new Thread(new CurrencyPostAccess(url, getParamsByUniqueId())).start();
new Thread(new CurrencyPostAccess(url, getParamsByUniqueId())).start();
new Thread(new CurrencyPostAccess(url, getParamsByUniqueId())).start();
new Thread(new CurrencyPostAccess(url, getParamsByUniqueId())).start();
new Thread(new CurrencyPostAccess(url, getParamsByUniqueId())).start();
new Thread(new CurrencyPostAccess(url, getParamsByUniqueId())).start();
new Thread(new CurrencyPostAccess(url, getParamsByUniqueId())).start();
new Thread(new CurrencyPostAccess(url, getParamsByUniqueId())).start();
}
public static String getParamsByUniqueId() {
// String uuid = UUID.randomUUID().toString().replaceAll("-","");
int uuid = (int) (Math.random() * 100000000);
JSONArray jsonArray = new JSONArray();
JSONObject jsonObject = null;
// long uniqueId = 3222099992260001L;
for (int i = 0; i < 2000; i++) {
long uniqueId = uuid + i;
jsonObject = new JSONObject();
jsonArray.add(jsonObject);
jsonObject.put("name", "xiaoming");
jsonObject.put("age", "18");
}
String params = JSON.toJSONString(jsonArray);
return params;
}
}
4.多线程工具类CurrencyPostAccess.java
package com.json.test;
import com.util.HttpUtil;
class CurrencyPostAccess implements Runnable{
private String url;
private String params;
public CurrencyPostAccess(String url,String params){
this.url = url;
this.params = params;
}
@Override
public void run() {
// sendPost(url,params);
String res = HttpUtil.doPost(url, params);
System.out.println("res = " + res);
}
}
5.线程个数和数据都可以自己设置,经自己测试,可以实现多线程并发访问http接口。