小白之jemter入门(三):自定义Java任务压测

针对某些特殊场景,jemter提供的功能不能满足于需求,这个时候就需要自己编写自定义的java任务进行压测

一. 自定义java任务

1.1 重apache-jmeter\lib\ext   目下copy   ApacheJMeter_core.jar和ApacheJMeter_java.jar到工程目录下

小白之jemter入门(三):自定义Java任务压测_第1张图片

 

1.2 继承 AbstractJavaSamplerClient类并重写runTest,getDefaultParameters,setupTest方法

package test;

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;
import org.json.JSONObject;
import socket.StreamTool;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;

/**
 * @Date 2019/3/19 10:48
 * @Created by LeeJunMing
 */
public class TestSocket extends AbstractJavaSamplerClient {
    private static final String HOST_NAME = "HOST";//设置GUI页面显示的变量名称
    private static final String PORT_NAME = "PORT";//设置GUI页面显示的变量名称
    private static final String FILEPATH_NAME = "FILEPATH";//设置GUI页面显示的变量名称
    String host;
    int port;
    String filePath;

    @Override
    public SampleResult runTest(JavaSamplerContext sc) {

        SampleResult sr = new SampleResult();
        sr.setSampleLabel("Socket Test");
        try {
            Socket socket = new Socket(host, port);
            uploadFile(socket, filePath);
            sr.setSuccessful(true);
            sr.setResponseData("上传成功!", null);//将数据打印到查看结果树当中
        } catch (Exception e) {
            e.printStackTrace();
            sr.setSuccessful(false);
            sr.setResponseData("上传失败!" + e.getMessage(), null);//将数据打印到查看结果树当中
        } finally {
            sr.sampleEnd();
        }
        sr.setDataType(SampleResult.TEXT);
        return sr;
    }


    @Override
    public Arguments getDefaultParameters() {
        Arguments params = new Arguments();
        params.addArgument(HOST_NAME, "127.0.0.1");
        params.addArgument(PORT_NAME, "15997");
        params.addArgument(FILEPATH_NAME, "D:\\test.mp4");
        return params;
    }

    @Override
    public void setupTest(JavaSamplerContext context) {
        host = context.getParameter(HOST_NAME);
        port = Integer.parseInt(context.getParameter(PORT_NAME));
        filePath = context.getParameter(FILEPATH_NAME);
        super.setupTest(context);
    }

    /**
     * 自定义的java任务
     * socket 上传文件到服务器
     */
    public static Map uploadFile(Socket socket, String filepath) {
        Map map = new HashMap();
        File file = new File(filepath);
        if (!file.exists()) {
            return null;
        }

        //开始发送信息
        OutputStream outputStream = null;
        PushbackInputStream inStream = null;
        RandomAccessFile fileOutStream = null;
        try {
            outputStream = socket.getOutputStream();
            inStream = new PushbackInputStream(socket.getInputStream());
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("type", "test");
            jsonObject.put("filesize", file.length());
            String message = jsonObject.toString() + "\r\n";
            //发送消息
            outputStream.write(message.getBytes());
            //获取返回消息
            String response = StreamTool.readLine(inStream);
            outputStream = socket.getOutputStream();
            //根据返回消息发送文件
            fileOutStream = new RandomAccessFile(file, "r");
            byte[] buffer = new byte[1024 * 1024];
            int len = -1;
            outputStream = socket.getOutputStream();
            while ((len = fileOutStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, len);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            close(outputStream, inStream, socket);
            try {
                if (fileOutStream != null) {
                    fileOutStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
        return map;
    }

    /**
     * 释放资源
     */
    public static void close(OutputStream outStream, PushbackInputStream inStream, Socket socket) {
        try {
            if (outStream != null) {
                outStream.close();
            }
            if (inStream != null) {
                inStream.close();
            }
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

1.3 把应用打包成jar包,并放到apache-jmeter\lib\ext下面

二 使用工具执行自定义任务测试

2.1 添加一个java任务

小白之jemter入门(三):自定义Java任务压测_第2张图片

小白之jemter入门(三):自定义Java任务压测_第3张图片

 

三 查看请求结果

小白之jemter入门(三):自定义Java任务压测_第4张图片

socket上传都成功了

小白之jemter入门(三):自定义Java任务压测_第5张图片

你可能感兴趣的:(jemter)