針對某些特殊場景,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上傳都成功了