java模拟并发多线程测试http服务

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接口。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值