小白之jemter入門(二):自定義Java任務壓測

針對某些特殊場景,jemter提供的功能不能滿足於需求,這個時候就需要自己編寫自定義的java任務進行壓測

一. 自定義java任務

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

 

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任務

 

三 查看請求結果

socket上傳都成功了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章