生成/解析jmx文件
package com
.haoke
.ratel
.service
.impl
;
import com
.alibaba
.fastjson
.JSON
;
import com
.alibaba
.fastjson
.JSONArray
;
import com
.alibaba
.fastjson
.JSONObject
;
import com
.haoke
.ratel
.constant
.JmxMemberType
;
import com
.haoke
.ratel
.dto
.script
.*
;
import com
.haoke
.ratel
.entity
.StScript
;
import com
.haoke
.ratel
.utils
.ResponseModel
;
import lombok
.extern
.slf4j
.Slf4j
;
import org
.apache
.commons
.lang3
.StringUtils
;
import org
.apache
.jmeter
.config
.Argument
;
import org
.apache
.jmeter
.config
.Arguments
;
import org
.apache
.jmeter
.config
.CSVDataSet
;
import org
.apache
.jmeter
.config
.gui
.ArgumentsPanel
;
import org
.apache
.jmeter
.control
.Controller
;
import org
.apache
.jmeter
.control
.LoopController
;
import org
.apache
.jmeter
.control
.gui
.LoopControlPanel
;
import org
.apache
.jmeter
.control
.gui
.TestPlanGui
;
import org
.apache
.jmeter
.protocol
.http
.control
.Cookie
;
import org
.apache
.jmeter
.protocol
.http
.control
.CookieManager
;
import org
.apache
.jmeter
.protocol
.http
.control
.Header
;
import org
.apache
.jmeter
.protocol
.http
.control
.HeaderManager
;
import org
.apache
.jmeter
.protocol
.http
.control
.gui
.HttpTestSampleGui
;
import org
.apache
.jmeter
.protocol
.http
.gui
.CookiePanel
;
import org
.apache
.jmeter
.protocol
.http
.gui
.HTTPArgumentsPanel
;
import org
.apache
.jmeter
.protocol
.http
.gui
.HeaderPanel
;
import org
.apache
.jmeter
.protocol
.http
.sampler
.HTTPSamplerProxy
;
import org
.apache
.jmeter
.protocol
.http
.util
.HTTPArgument
;
import org
.apache
.jmeter
.save
.SaveService
;
import org
.apache
.jmeter
.testbeans
.gui
.TestBeanGUI
;
import org
.apache
.jmeter
.testelement
.AbstractTestElement
;
import org
.apache
.jmeter
.testelement
.TestElement
;
import org
.apache
.jmeter
.testelement
.TestPlan
;
import org
.apache
.jmeter
.testelement
.property
.CollectionProperty
;
import org
.apache
.jmeter
.testelement
.property
.StringProperty
;
import org
.apache
.jmeter
.testelement
.property
.TestElementProperty
;
import org
.apache
.jmeter
.threads
.PostThreadGroup
;
import org
.apache
.jmeter
.threads
.SetupThreadGroup
;
import org
.apache
.jmeter
.threads
.ThreadGroup
;
import org
.apache
.jmeter
.threads
.gui
.PostThreadGroupGui
;
import org
.apache
.jmeter
.threads
.gui
.SetupThreadGroupGui
;
import org
.apache
.jmeter
.threads
.gui
.ThreadGroupGui
;
import org
.apache
.jmeter
.util
.JMeterUtils
;
import org
.apache
.jorphan
.collections
.ListedHashTree
;
import org
.springframework
.beans
.BeanUtils
;
import org
.springframework
.beans
.factory
.annotation
.Value
;
import org
.springframework
.stereotype
.Service
;
import org
.springframework
.util
.CollectionUtils
;
import javax
.annotation
.PostConstruct
;
import java
.io
.File
;
import java
.io
.FileOutputStream
;
import java
.util
.*
;
@Service
@Slf4j
public class ConfigScriptService {
@Value("${data.jmeter-home}")
private String jmeterHome
;
@Value("${data.jmx-path}")
private String jmxPath
;
@PostConstruct
private void init(){
JMeterUtils
.setJMeterHome(jmeterHome
);
JMeterUtils
.loadJMeterProperties(jmeterHome
+ File
.separator
+ "bin"
+ File
.separator
+ "jmeter.properties");
JMeterUtils
.setLocale(Locale
.CHINESE
);
}
public ResponseModel
<String> createJmx(List
<JmxMember> jmxMemberList
){
try {
if (CollectionUtils
.isEmpty(jmxMemberList
)){
return ResponseModel
.error("请录入构建压测的数据");
}
JmxMember jmxMember
= jmxMemberList
.get(0);
ResponseModel resp
= iterateSonNode(jmxMember
);
if(!resp
.isOk()){
return resp
;
}
ListedHashTree hashTreeTestPlan
= (ListedHashTree
) resp
.getData();
String uuid
= UUID
.randomUUID().toString().replaceAll("-","");
String filePath
= jmxPath
+ File
.separator
+ uuid
+ ".jmx";
SaveService
.saveTree(hashTreeTestPlan
, new FileOutputStream(filePath
));
return ResponseModel
.ok(filePath
);
}catch (Exception e
){
log
.error("生成脚本异常",e
);
return ResponseModel
.error("生成脚本异常:"+e
.getMessage());
}
}
public ResponseModel
analysisJmx(StScript stScript
){
try{
String uuid
= UUID
.randomUUID().toString().replaceAll("-","");
File jmxFile
= new File(jmxPath
+ File
.separator
+ uuid
+ ".jmx");
FileOutputStream outStream
= new FileOutputStream(jmxFile
);
outStream
.write(stScript
.getJmxFile().getBytes());
outStream
.close();
ListedHashTree hashTree
= (ListedHashTree
) SaveService
.loadTree(new File(jmxPath
+ File
.separator
+ uuid
+ ".jmx"));
int i
=0;
ResponseModel
<List
<JmxMember>> responseModel
= iterateHashTree(hashTree
, i
);
if(!responseModel
.isOk()){
return responseModel
;
}
ConfigJmxDto configJmxDto
= new ConfigJmxDto();
configJmxDto
.setJmxMember(responseModel
.getData());
StScript script
= new StScript();
script
.setId(stScript
.getId());
script
.setName(stScript
.getName());
script
.setDescription(stScript
.getDescription());
script
.setScriptFileName(stScript
.getScriptFileName());
script
.setIsLocked(stScript
.getIsLocked());
script
.setOwner(stScript
.getOwner());
configJmxDto
.setScript(script
);
return ResponseModel
.ok(configJmxDto
);
}catch (Exception e
){
log
.error("解析jmx文件异常", e
);
return ResponseModel
.error("解析jmx文件异常:" + e
.getMessage());
}
}
private ResponseModel
<List
<JmxMember>> iterateHashTree(ListedHashTree hashTree
, Integer i
){
try{
List
<JmxMember> jmxMember
= new ArrayList();
for(Object key
: hashTree
.keySet()){
i
++;
JmxMember member
= new JmxMember();
AbstractTestElement abstractTestElement
= (AbstractTestElement
) key
;
member
.setName(abstractTestElement
.getName());
String guiClass
= abstractTestElement
.getPropertyAsString("TestElement.gui_class");
JmxMemberType jmxMemberType
;
if("org.apache.jmeter.control.gui.HTTPArgumentsPanel".equalsIgnoreCase(guiClass
)
|| "org.apache.jmeter.protocol.http.gui.HTTPArgumentsPanel".equalsIgnoreCase(guiClass
) ){
jmxMemberType
= JmxMemberType
.HTTPArguments
;
}else {
jmxMemberType
= getType(key
);
}
member
.setType(jmxMemberType
);
ResponseModel rm
= getMemberValue(jmxMemberType
, key
);
if(!rm
.isOk()){
return rm
;
}
member
.setValue(rm
.getData());
member
.setId(i
);
if(!hashTree
.get(key
).isEmpty()) {
ResponseModel
<List
<JmxMember>> responseModel
= iterateHashTree((ListedHashTree
) hashTree
.get(key
), i
);
if (!responseModel
.isOk()) {
return responseModel
;
}
member
.setId(i
++);
member
.setSons(responseModel
.getData());
}
jmxMember
.add(member
);
}
return ResponseModel
.ok(jmxMember
);
}catch (Exception e
){
log
.error("遍历hashTree方法异常", e
);
return ResponseModel
.error("遍历hashTree方法异常:" + e
.getMessage());
}
}
private JmxMemberType
getType(Object key
){
if(key
instanceof TestPlan){
return JmxMemberType
.TestPlan
;
}else if(key
instanceof ThreadGroup){
return JmxMemberType
.ThreadGroup
;
}else if(key
instanceof HTTPSamplerProxy){
return JmxMemberType
.HTTPSampler
;
}else if(key
instanceof HeaderManager){
return JmxMemberType
.HeaderManager
;
}else if(key
instanceof CookieManager){
return JmxMemberType
.CookieManager
;
}else if(key
instanceof CSVDataSet){
return JmxMemberType
.CSVDataSet
;
}else if(key
instanceof Arguments){
return JmxMemberType
.Arguments
;
}else {
return null
;
}
}
private ResponseModel
getMemberValue(JmxMemberType jmxMemberType
, Object key
){
switch(jmxMemberType
){
case TestPlan
:
return analysisTestPlan((TestPlan
) key
);
case ThreadGroup
:
case SetUpThreadGroup
:
case PostThreadGroup
:
return analysisThreadGroup(jmxMemberType
, key
);
case HTTPSampler
:
return analysisHttpSamplerProxy((HTTPSamplerProxy
) key
);
case CSVDataSet
:
return analysisCSVDataSet((CSVDataSet
) key
);
case Arguments
:
return analysisArgumentsPanel((Arguments
) key
);
case HTTPArguments
:
return analysisHTTPArgumentsPanel((Arguments
) key
);
case HeaderManager
:
return analysisHeaderManager((HeaderManager
) key
);
case CookieManager
:
return analysisCookieManager((CookieManager
) key
);
default:
return ResponseModel
.error("解析类型不存在");
}
}
private ResponseModel
iterateSonNode(JmxMember jmxMember
){
ResponseModel responseModel
= createNode(jmxMember
);
if (!responseModel
.isOk()){
return responseModel
;
}
ListedHashTree tree
= new ListedHashTree();
Object node
= responseModel
.getData();
if (!CollectionUtils
.isEmpty(jmxMember
.getSons())){
ListedHashTree sonTree
= new ListedHashTree();
for (JmxMember son
: jmxMember
.getSons()) {
ResponseModel sonResponse
= iterateSonNode(son
);
if (!sonResponse
.isOk() && sonResponse
.getCode() != 1) {
return sonResponse
;
}
Object sonObj
= sonResponse
.getData();
if (sonResponse
.getCode() != 1){
ListedHashTree retTree
= (ListedHashTree
) sonObj
;
for (Object key
: retTree
.keySet()){
sonTree
.add(key
, retTree
.get(key
));
}
}else {
sonTree
.add(sonObj
);
}
}
tree
.add(node
, sonTree
);
return ResponseModel
.ok(tree
);
}else {
return ResponseModel
.ok(1 ,node
);
}
}
private ResponseModel
createNode(JmxMember jmxMember
){
String args
= JSON
.toJSONString(jmxMember
.getValue());
switch (jmxMember
.getType()){
case TestPlan
:
return createTestPlan(args
);
case ThreadGroup
:
case SetUpThreadGroup
:
case PostThreadGroup
:
return createThreadGroup(args
);
case HTTPSampler
:
return createHttpSamplerProxy(args
);
case HeaderManager
:
return createHeaderManager(args
);
case CookieManager
:
return createCookieManager(args
);
case CSVDataSet
:
return createCsvDataSet(args
);
case Arguments
:
return createArgumentsPanel(args
);
case HTTPArguments
:
return createHTTPArgumentsPanel(args
);
default:
return ResponseModel
.error("节点类型不存在");
}
}
private ResponseModel
createTestPlan(String args
){
try {
TestPlan testPlan
= JSON
.parseObject(args
, TestPlan
.class);
testPlan
.setProperty("TestPlan.serialize_threadgroups", false);
Arguments arguments
= testPlan
.getArguments();
arguments
.setName("User Defined Variables");
arguments
.setEnabled(true);
arguments
.setProperty(TestElement
.TEST_CLASS
, Arguments
.class.getName());
arguments
.setProperty(TestElement
.GUI_CLASS
, ArgumentsPanel
.class.getName());
testPlan
.setUserDefinedVariables(arguments
);
testPlan
.setProperty(TestElement
.GUI_CLASS
, TestPlanGui
.class.getName());
testPlan
.setProperty(TestElement
.TEST_CLASS
, TestPlan
.class.getName());
return ResponseModel
.ok(testPlan
);
}catch (Exception e
){
log
.error("生成测试计划的方法异常", e
);
return ResponseModel
.error("生成测试计划的方法异常"+e
.getMessage());
}
}
private ResponseModel
createThreadGroup(String args
){
try {
JSONObject jsonObject
= JSONObject
.parseObject(args
);
String type
= jsonObject
.getString("type");
if("ThreadGroup".equalsIgnoreCase(type
.trim())){
ThreadGroup threadGroup
= JSON
.parseObject(args
, ThreadGroup
.class);
Controller controller
= threadGroup
.getSamplerController();
controller
.setName("Loop Controller");
controller
.setEnabled(true);
controller
.setProperty(TestElement
.TEST_CLASS
, LoopController
.class.getName());
controller
.setProperty(TestElement
.GUI_CLASS
, LoopControlPanel
.class.getName());
threadGroup
.setProperty("ThreadGroup.on_sample_error", jsonObject
.getString("onSampleError"));
threadGroup
.setProperty("ThreadGroup.delayedStart", jsonObject
.getString("delayedStartup"));
threadGroup
.setProperty(TestElement
.TEST_CLASS
, ThreadGroup
.class.getName());
threadGroup
.setProperty(TestElement
.GUI_CLASS
, ThreadGroupGui
.class.getName());
return ResponseModel
.ok(threadGroup
);
}else if ("SetupThreadGroup".equalsIgnoreCase(type
.trim())){
SetupThreadGroup setupThreadGroup
= JSON
.parseObject(args
, SetupThreadGroup
.class);
Controller controller
= setupThreadGroup
.getSamplerController();
controller
.setName("Loop Controller");
controller
.setEnabled(true);
controller
.setProperty(TestElement
.TEST_CLASS
, LoopController
.class.getName());
controller
.setProperty(TestElement
.GUI_CLASS
, LoopControlPanel
.class.getName());
setupThreadGroup
.setProperty("ThreadGroup.on_sample_error", jsonObject
.getString("onSampleError"));
setupThreadGroup
.setProperty(TestElement
.TEST_CLASS
, SetupThreadGroup
.class.getName());
setupThreadGroup
.setProperty(TestElement
.GUI_CLASS
, SetupThreadGroupGui
.class.getName());
return ResponseModel
.ok(setupThreadGroup
);
}else if("PostThreadGroup".equalsIgnoreCase(type
.trim())){
PostThreadGroup postThreadGroup
= JSON
.parseObject(args
, PostThreadGroup
.class);
Controller controller
= postThreadGroup
.getSamplerController();
controller
.setName("Loop Controller");
controller
.setEnabled(true);
controller
.setProperty(TestElement
.TEST_CLASS
, LoopController
.class.getName());
controller
.setProperty(TestElement
.GUI_CLASS
, LoopControlPanel
.class.getName());
postThreadGroup
.setProperty("ThreadGroup.on_sample_error", jsonObject
.getString("onSampleError"));
postThreadGroup
.setProperty(TestElement
.TEST_CLASS
, PostThreadGroup
.class.getName());
postThreadGroup
.setProperty(TestElement
.GUI_CLASS
, PostThreadGroupGui
.class.getName());
return ResponseModel
.ok(postThreadGroup
);
}else {
return ResponseModel
.error("线程组类型不存在");
}
}catch (Exception e
){
log
.error("线程组格式错误", e
);
return ResponseModel
.error("线程组格式错误"+e
.getMessage());
}
}
private ResponseModel
createHttpSamplerProxy(String args
){
try {
HTTPSamplerProxy httpSamplerProxy
= JSON
.parseObject(args
, HTTPSamplerProxy
.class);
if (StringUtils
.isBlank(httpSamplerProxy
.getPath())) {
return ResponseModel
.error("路径不能为空");
}
ResponseModel responseModel
= createHTTPArgumentsPanel(JSONObject
.parseObject(args
)
.getString("arguments"));
if (!responseModel
.isOk()) {
return responseModel
;
}
httpSamplerProxy
.setArguments((Arguments
) responseModel
.getData());
httpSamplerProxy
.setProperty("HTTPSampler.embedded_url_re", "");
httpSamplerProxy
.setProperty("HTTPSampler.connect_timeout", "");
httpSamplerProxy
.setProperty("HTTPSampler.response_timeout", "");
httpSamplerProxy
.setProperty(TestElement
.TEST_CLASS
, HTTPSamplerProxy
.class.getName());
httpSamplerProxy
.setProperty(TestElement
.GUI_CLASS
, HttpTestSampleGui
.class.getName());
return ResponseModel
.ok(httpSamplerProxy
);
}catch (Exception e
){
log
.error("生成http的方法异常", e
);
return ResponseModel
.error("生成http的方法异常:"+e
.getMessage());
}
}
private ResponseModel
createCsvDataSet(String args
){
try {
CSVDataSet csvDataSet
= JSON
.parseObject(args
, CSVDataSet
.class);
if(StringUtils
.isBlank(csvDataSet
.getFilename())){
return ResponseModel
.error("必须上传文件路径");
}
if(StringUtils
.isBlank(csvDataSet
.getVariableNames())){
return ResponseModel
.error("必须上传变量名");
}
JSONObject jsonObject
= JSONObject
.parseObject(args
);
csvDataSet
.setProperty("filename", jsonObject
.getString("filename"));
csvDataSet
.setProperty("fileEncoding", jsonObject
.getString("fileEncoding"));
csvDataSet
.setProperty("variableNames", jsonObject
.getString("variableNames"));
csvDataSet
.setProperty("ignoreFirstLine", jsonObject
.getBooleanValue("ignoreFirstLine"));
csvDataSet
.setProperty("delimiter",jsonObject
.getString("delimiter"));
csvDataSet
.setProperty("quotedData", jsonObject
.getBooleanValue("quoted"));
csvDataSet
.setProperty("recycle", jsonObject
.getBooleanValue("recycle"));
csvDataSet
.setProperty("stopThread", jsonObject
.getBooleanValue("stopThread"));
csvDataSet
.setProperty("shareMode", jsonObject
.getString("shareMode"));
csvDataSet
.setProperty(TestElement
.TEST_CLASS
, CSVDataSet
.class.getName());
csvDataSet
.setProperty(TestElement
.GUI_CLASS
, TestBeanGUI
.class.getName());
return ResponseModel
.ok(csvDataSet
);
}catch (Exception e
){
log
.error("生成csv的方法异常", e
);
return ResponseModel
.error("生成csv的方法异常:"+e
.getMessage());
}
}
private ResponseModel
createHeaderManager(String args
){
try{
HeaderManager headerManager
= JSON
.parseObject(args
, HeaderManager
.class);
JSONArray jsonArray
= JSONObject
.parseObject(args
).getJSONArray("headers");
ArrayList
<TestElementProperty> testElementProperties
= new ArrayList();
for(int i
=0;i
<jsonArray
.size();i
++) {
JSONObject job
= jsonArray
.getJSONObject(i
);
Header header
= new Header();
header
.setProperty(new StringProperty("Header.name", job
.getString("name")));
header
.setProperty(new StringProperty("Header.value", job
.getString("value")));
testElementProperties
.add(new TestElementProperty(job
.getString("name"), header
));
}
headerManager
.setProperty(new CollectionProperty("HeaderManager.headers", testElementProperties
));
headerManager
.setProperty(TestElement
.TEST_CLASS
, HeaderManager
.class.getName());
headerManager
.setProperty(TestElement
.GUI_CLASS
, HeaderPanel
.class.getName());
return ResponseModel
.ok(headerManager
);
}catch (Exception e
){
log
.error("生成header的方法异常", e
);
return ResponseModel
.error("生成header的方法异常:"+e
.getMessage());
}
}
private ResponseModel
createCookieManager(String args
){
try {
JSONObject jsonObject
= JSONObject
.parseObject(args
);
JSONArray cookies
= jsonObject
.getJSONArray("cookies");
ArrayList
<TestElementProperty> testElementProperties
= new ArrayList();
for (int i
= 0; i
< cookies
.size(); i
++) {
JSONObject job
= cookies
.getJSONObject(i
);
Cookie cookie
= new Cookie();
cookie
.setName(job
.getString("name"));
cookie
.setValue(job
.getString("value"));
cookie
.setDomain(job
.getString("domain"));
cookie
.setPath(job
.getString("path"));
cookie
.setSecure(job
.getBooleanValue("secure"));
testElementProperties
.add(new TestElementProperty(job
.getString("name"), cookie
));
}
CookieManager cookieManager
= JSON
.parseObject(args
, CookieManager
.class);
cookieManager
.setProperty(new CollectionProperty("CookieManager.cookies", testElementProperties
));
cookieManager
.setProperty("CookieManager.controlledByThreadGroup", jsonObject
.getBooleanValue("controlledByThreadGroup"));
cookieManager
.setProperty(TestElement
.TEST_CLASS
, CookieManager
.class.getName());
cookieManager
.setProperty(TestElement
.GUI_CLASS
, CookiePanel
.class.getName());
return ResponseModel
.ok(cookieManager
);
}catch (Exception e
){
log
.error("生成cookies的方法异常", e
);
return ResponseModel
.error("生成cookies的方法异常:"+e
.getMessage());
}
}
private ResponseModel
createHTTPArgumentsPanel(String args
){
try {
Arguments arguments
= new Arguments();
JSONArray httpArguments
= JSONObject
.parseObject(args
).getJSONArray("arguments");
ArrayList
<TestElementProperty> testElementProperties
= new ArrayList();
for (int i
= 0; i
< httpArguments
.size(); i
++) {
JSONObject job
= httpArguments
.getJSONObject(i
);
HTTPArgument httpArgument
= new HTTPArgument();
httpArgument
.setAlwaysEncoded(job
.getBooleanValue("alwaysEncoded"));
httpArgument
.setUseEquals(job
.getBooleanValue("useEquals"));
httpArgument
.setProperty("HTTPArgument.content_type",job
.getBooleanValue("contentType"));
if(StringUtils
.isNotBlank(job
.getString("name"))) {
httpArgument
.setName(job
.getString("name"));
}
if(StringUtils
.isNotBlank(job
.getString("value"))) {
httpArgument
.setValue(job
.getString("value"));
}
testElementProperties
.add(new TestElementProperty(job
.getString("name"), httpArgument
));
}
arguments
.setProperty(new CollectionProperty("Arguments.arguments", testElementProperties
));
arguments
.setName("User Defined Variables");
arguments
.setEnabled(true);
arguments
.setProperty(TestElement
.TEST_CLASS
, Arguments
.class.getName());
arguments
.setProperty(TestElement
.GUI_CLASS
, HTTPArgumentsPanel
.class.getName());
return ResponseModel
.ok(arguments
);
}catch (Exception e
){
log
.error("生成HTTPArgumentsPanel的方法异常", e
);
return ResponseModel
.error("生成HTTPArgumentsPanel的方法异常:"+e
.getMessage());
}
}
private ResponseModel
createArgumentsPanel(String args
){
try {
Arguments arguments
= JSON
.parseObject(args
, Arguments
.class);
arguments
.setProperty(TestElement
.TEST_CLASS
, Arguments
.class.getName());
arguments
.setProperty(TestElement
.GUI_CLASS
, ArgumentsPanel
.class.getName());
return ResponseModel
.ok(arguments
);
}catch (Exception e
){
log
.error("生成ArgumentsPanel的方法异常", e
);
return ResponseModel
.error("生成ArgumentsPanel的方法异常:"+e
.getMessage());
}
}
private ResponseModel
analysisTestPlan(TestPlan testPlan
){
try {
Map
<String, Object> map
= new HashMap();
map
.put("name", testPlan
.getPropertyAsString("TestElement.name"));
map
.put("enabled", testPlan
.getPropertyAsBoolean("TestElement.enabled"));
map
.put("comment", testPlan
.getPropertyAsString("TestPlan.comments"));
map
.put("functionalMode", testPlan
.getPropertyAsBoolean("TestPlan.functional_mode"));
map
.put("tearDownOnShutdown", testPlan
.getPropertyAsBoolean("TestPlan.tearDown_on_shutdown"));
map
.put("testPlanClasspath", testPlan
.getPropertyAsString("TestPlan.user_define_classpath"));
TestElementProperty testElementProperty
= (TestElementProperty
)testPlan
.getUserDefinedVariablesAsProperty();
Arguments args
= (Arguments
)testElementProperty
.getElement();
ArrayList arrayList
= (ArrayList
)args
.getArguments().getObjectValue();
List s
= new ArrayList();
if(!CollectionUtils
.isEmpty(arrayList
)){
for (Object object
: arrayList
){
TestElementProperty te
= (TestElementProperty
)object
;
Argument arg
= (Argument
)te
.getElement();
Map
<String, String> argument
= new HashMap();
argument
.put("name", arg
.getName());
argument
.put("value", arg
.getValue());
argument
.put("metadata", arg
.getMetaData());
s
.add(argument
);
}
}
Map
<String, Object> arguments
= new HashMap();
arguments
.put("arguments", s
);
map
.put("userDefinedVariables",arguments
);
return ResponseModel
.ok(map
);
}catch (Exception e
){
log
.error("解析testPlan异常", e
);
return ResponseModel
.error("解析testPlan异常:"+e
.getMessage());
}
}
private ResponseModel
analysisThreadGroup(JmxMemberType jmxMemberType
, Object key
){
try{
ThreadGroupDto threadGroupDto
= new ThreadGroupDto();
BeanUtils
.copyProperties(key
, threadGroupDto
);
ThreadGroup threadGroup
= (ThreadGroup
)key
;
if(jmxMemberType
.equals(JmxMemberType
.SetUpThreadGroup
)){
threadGroup
= (SetupThreadGroup
) key
;
}else if(jmxMemberType
.equals(JmxMemberType
.PostThreadGroup
)){
threadGroup
= (PostThreadGroup
) key
;
}
threadGroupDto
.setType(jmxMemberType
.getValue());
threadGroupDto
.setOnSampleError(threadGroup
.getPropertyAsString("ThreadGroup.on_sample_error"));
threadGroupDto
.setNumThreads(threadGroup
.getPropertyAsInt("ThreadGroup.num_threads"));
if(jmxMemberType
.equals(JmxMemberType
.ThreadGroup
)) {
threadGroupDto
.setDelayedStartup(threadGroup
.getPropertyAsBoolean("ThreadGroup.delayedStart"));
}
threadGroupDto
.setIsSameUserOnNextIteration(threadGroup
.getPropertyAsBoolean("ThreadGroup.same_user_on_next_iteration"));
threadGroupDto
.setDuration(threadGroup
.getPropertyAsInt("ThreadGroup.duration"));
threadGroupDto
.setDelay(threadGroup
.getPropertyAsInt("ThreadGroup.delay"));
HashMap
<String, Object> hashMap
= new HashMap();
LoopController controller
= (LoopController
)threadGroup
.getSamplerController();
hashMap
.put("loops", controller
.getLoops());
hashMap
.put("continueForever", controller
.getPropertyAsBoolean("LoopController.continue_forever"));
threadGroupDto
.setSamplerController(hashMap
);
return ResponseModel
.ok(threadGroupDto
);
}catch (Exception e
){
log
.error("解析线程组方法异常", e
);
return ResponseModel
.error("解析线程组方法异常" + e
.getMessage());
}
}
private ResponseModel
analysisHttpSamplerProxy(HTTPSamplerProxy httpSamplerProxy
){
try {
HttpSamplerDto httpSamplerDto
= new HttpSamplerDto();
BeanUtils
.copyProperties(httpSamplerProxy
, httpSamplerDto
);
httpSamplerDto
.setUseKeepalive(httpSamplerProxy
.getUseKeepAlive());
List list
= new ArrayList();
Arguments arguments
= httpSamplerProxy
.getArguments();
for(Object object
: arguments
){
TestElementProperty te
= (TestElementProperty
)object
;
HTTPArgument arg
= (HTTPArgument
) te
.getElement();
HashMap
<String, Object> hashMap
= new HashMap();
hashMap
.put("name",arg
.getName());
hashMap
.put("value",arg
.getValue());
hashMap
.put("alwaysEncode", arg
.getPropertyAsBoolean("alwaysEncoded"));
hashMap
.put("contentType", arg
.getPropertyAsString("HTTPArgument.content_type"));
hashMap
.put("useEquals", arg
.getPropertyAsBoolean("useEquals"));
list
.add(hashMap
);
}
HashMap
<String, Object> argument
= new HashMap();
argument
.put("arguments", list
);
httpSamplerDto
.setArguments(argument
);
return ResponseModel
.ok(httpSamplerDto
);
}catch (Exception e
){
log
.error("解析http异常", e
);
return ResponseModel
.error("解析http异常:" + e
.getMessage());
}
}
private ResponseModel
analysisCSVDataSet(CSVDataSet csvDataSet
){
try {
CsvDataDto csvDataDto
= new CsvDataDto();
BeanUtils
.copyProperties(csvDataSet
, csvDataDto
);
csvDataDto
.setDelimiter(csvDataSet
.getPropertyAsString("delimiter"));
csvDataDto
.setFilename(csvDataSet
.getPropertyAsString("filename"));
csvDataDto
.setFileEncoding(csvDataSet
.getPropertyAsString("fileEncoding"));
csvDataDto
.setQuoted(csvDataSet
.getPropertyAsBoolean("quotedData"));
csvDataDto
.setVariableNames(csvDataSet
.getPropertyAsString("variableNames"));
csvDataDto
.setShareMode(csvDataSet
.getPropertyAsString("shareMode"));
return ResponseModel
.ok(csvDataDto
);
}catch (Exception e
){
log
.error("解析csv异常", e
);
return ResponseModel
.error("解析csv异常:" + e
.getMessage());
}
}
private ResponseModel
analysisHeaderManager(HeaderManager headerManager
){
try {
Map
<String, Object> hashMap
= new HashMap<>();
hashMap
.put("name", headerManager
.getName());
hashMap
.put("comment", headerManager
.getComment());
hashMap
.put("enabled", headerManager
.getPropertyAsBoolean("TestElement.enabled"));
List list
= new ArrayList();
CollectionProperty collectionProperty
= headerManager
.getHeaders();
ArrayList arrayList
= (ArrayList
) collectionProperty
.getObjectValue();
for(Object object
: arrayList
){
TestElementProperty te
= (TestElementProperty
)object
;
Header arg
= (Header
) te
.getElement();
Map
<String, Object> argument
= new HashMap();
argument
.put("name", arg
.getName());
argument
.put("value", arg
.getValue());
list
.add(argument
);
}
hashMap
.put("headers", list
);
return ResponseModel
.ok(hashMap
);
}catch (Exception e
){
log
.error("解析http请求头异常", e
);
return ResponseModel
.error("解析http请求头异常:" + e
.getMessage());
}
}
private ResponseModel
analysisCookieManager(CookieManager cookieManager
){
try {
HashMap
<String, Object> cookies
= new HashMap();
cookies
.put("name", cookieManager
.getName());
cookies
.put("comment", cookieManager
.getComment());
cookies
.put("enabled", cookieManager
.getPropertyAsBoolean("TestElement.enabled"));
cookies
.put("cookiePolicy", cookieManager
.getPolicy());
cookies
.put("clearEachIteration", cookieManager
.getClearEachIteration());
cookies
.put("controlledByThreadGroup",
cookieManager
.getPropertyAsBoolean("CookieManager.controlledByThreadGroup"));
List list
= new ArrayList();
CollectionProperty collectionProperty
= cookieManager
.getCookies();
ArrayList arrayList
= (ArrayList
) collectionProperty
.getObjectValue();
for(Object object
: arrayList
){
TestElementProperty te
= (TestElementProperty
)object
;
Cookie arg
= (Cookie
) te
.getElement();
Map
<String, Object> argument
= new HashMap();
argument
.put("name", arg
.getName());
argument
.put("value", arg
.getValue());
argument
.put("domain", arg
.getDomain());
argument
.put("path", arg
.getPath());
argument
.put("secure", arg
.getSecure());
list
.add(argument
);
}
cookies
.put("cookies", list
);
return ResponseModel
.ok(cookies
);
}catch (Exception e
){
log
.error("解析Cookie请求头异常", e
);
return ResponseModel
.error("解析Cookie请求头异常:" + e
.getMessage());
}
}
private ResponseModel
analysisHTTPArgumentsPanel(Arguments arguments
){
try {
List list
= new ArrayList();
CollectionProperty collectionProperty
= arguments
.getArguments();
ArrayList arrayList
= (ArrayList
) collectionProperty
.getObjectValue();
for(Object object
: arrayList
){
TestElementProperty te
= (TestElementProperty
)object
;
HTTPArgument arg
= (HTTPArgument
) te
.getElement();
Map
<String, Object> argument
= new HashMap();
argument
.put("name", arg
.getName());
argument
.put("value", arg
.getValue());
argument
.put("comment", arg
.getComment());
argument
.put("alwaysEncode", arg
.getPropertyAsBoolean("alwaysEncoded"));
argument
.put("contentType", arg
.getPropertyAsString("HTTPArgument.content_type"));
argument
.put("useEquals", arg
.getPropertyAsBoolean("useEquals"));
list
.add(argument
);
}
HashMap
<String, Object> hashMap
= new HashMap<>();
hashMap
.put("arguments", list
);
return ResponseModel
.ok(hashMap
);
}catch (Exception e
){
log
.error("解析http请求参数异常", e
);
return ResponseModel
.error("解析http请求参数异常:" + e
.getMessage());
}
}
private ResponseModel
analysisArgumentsPanel(Arguments arguments
){
try {
List list
= new ArrayList();
CollectionProperty collectionProperty
= arguments
.getArguments();
ArrayList arrayList
= (ArrayList
) collectionProperty
.getObjectValue();
for(Object object
: arrayList
){
TestElementProperty te
= (TestElementProperty
)object
;
Argument arg
= (Argument
) te
.getElement();
Map
<String, Object> argument
= new HashMap();
argument
.put("name", arg
.getName());
argument
.put("value", arg
.getValue());
argument
.put("description", arg
.getComment());
argument
.put("metadata", arg
.getMetaData());
list
.add(argument
);
}
HashMap
<String, Object> hashMap
= new HashMap<>();
hashMap
.put("arguments", list
);
hashMap
.put("name", arguments
.getName());
hashMap
.put("comment", arguments
.getComment());
hashMap
.put("enabled", arguments
.getPropertyAsBoolean("TestElement.enabled"));
return ResponseModel
.ok(hashMap
);
}catch (Exception e
){
log
.error("解析用户自定义变量异常", e
);
return ResponseModel
.error("解析用户自定义变量异常:" + e
.getMessage());
}
}
}
参数格式:
{
"script": {
"name": "压测脚本名称",
"description": "压测脚本描述",
"id": 2,
"scriptFileName": "JMX文件名",
"isLocked": true,
"owner": "操作人,以逗号分隔"
},
"jmxMember": [{
"type": "TestPlan",
"name": "测试计划",
"id": 1,
"value": {
"comment": "计划描述",
"name": "计划名称",
"enabled": true,
"functionalMode": true,
"tearDownOnShutdown": true,
"testPlanClasspath": "test.jar",
"userDefinedVariables": {
"arguments": [{
"name": "asd",
"value": "sd",
"metadata": "="
}, {
"name": "sda",
"value": "sdas",
"metadata": "="
}]
}
},
"sons": [{
"type": "ThreadGroup",
"name": "线程组名称",
"id": 2,
"value": {
"type": "threadGroup",
"comment": "线程组描述",
"name": "线程组名称",
"enabled": true,
"onSampleError": "continue",
"numThreads": 2000,
"delayedStartup": true,
"rampUp": 5,
"samplerController": {
"continueForever": false,
"loops": 2
},
"isSameUserOnNextIteration": true,
"scheduler": true,
"duration": 12,
"delay": 20
},
"sons": [{
"type": "HttpSamplerProxy",
"name": "http请求",
"id": 3,
"value": {
"comment": "请求描述",
"name": "请求名称",
"enabled": true,
"arguments": {
"arguments": [{
"name": "key",
"value": "value",
"alwaysEncode": true,
"contentType": "text/plain",
"useEquals": true
}]
},
"domain": "www.baidu.com",
"port": 8080,
"protocol": "http",
"contentEncoding": "utf-8",
"path": "/index",
"method": "GET",
"followRedirects": true,
"autoRedirects": false,
"useKeepalive": true,
"doMultipartPost": false,
"doBrowserCompatibleMultipart": false
},
"sons": [{
"type": "CsvDataSet",
"name": "CsvDataSet",
"id": 3,
"value": {
"comment": "csv描述",
"name": "csv名称",
"enabled": true,
"delimiter": ",",
"filename": "filePath",
"fileEncoding": "utf-8",
"ignoreFirstLine": true,
"quoted": false,
"recycle": true,
"variableNames": "以逗号分隔",
"stopThread": false,
"shareMode": "shareMode.all"
}
}]
},
{
"type": "CsvDataSet",
"name": "CsvDataSet",
"id": 3,
"value": {
"comment": "csv描述",
"name": "csv名称",
"enabled": true,
"delimiter": ",",
"filename": "filePath",
"fileEncoding": "utf-8",
"ignoreFirstLine": true,
"quoted": false,
"recycle": true,
"variableNames": "以逗号分隔",
"stopThread": false,
"shareMode": "shareMode.all"
}
},
{
"type": "ArgumentsPanel",
"name": "argumentsPanel",
"id": 3,
"value": {
"comment": "csv描述",
"name": "csv名称",
"enabled": true,
"arguments": [{
"name": "as",
"value": "sa",
"description": "sadads",
"metadata": "="
}, {
"name": "sd",
"value": "d",
"description": "sadads",
"metadata": "="
}]
}
},
{
"type": "HTTPArgumentsPanel",
"name": "argumentsPanel",
"id": 3,
"value": {
"arguments": [{
"name": "key",
"value": "value",
"comment": "sds",
"alwaysEncode": true,
"contentType": "text/plain",
"useEquals": true
}]
}
},
{
"type": "HeaderManager",
"name": "argumentsPanel",
"id": 3,
"value": {
"comment": "描述",
"name": "名称",
"enabled": true,
"headers": [{
"name": "de",
"value": "as"
}, {
"name": "zx",
"value": "vf"
}]
}
},
{
"type": "CookieManager",
"name": "CookieManager",
"id": 3,
"value": {
"comment": "描述",
"name": "名称",
"enabled": true,
"cookiePolicy": "standard",
"clearEachIteration": false,
"controlledByThreadGroup": false,
"cookies": [{
"name": "xc",
"value": "xxs",
"domain": "sw",
"path": "ew",
"secure": false
}]
}
}
]
}]
}]
}
JMeterUtiles解析
JMeterUtils
.loadJMeterProperties(JMETER_HOME_LOCAL
+ File
.separator
+ "bin"+ File
.separator
+ "jmeter.properties");
JMeterUtils
.setJMeterHome(JMETER_HOME_LOCAL
);
JMeterUtils
.initLocale();
JMeterUtils
.setLocale(Locale
.CHINESE
);
JMeterUtils
.findFile();
JMeterUtils
.loadProperties("");
JMeterUtils
.getProperties();
JMeterUtils
.getLocale()
JMeterUtils
.getJMeterHome()
JMeterUtils
.getJMeterBinDir()
JMeterUtils
.getJMeterVersion()
SaveService 解析
SaveService
.loadProperties();
String uuid
= UUID
.randomUUID().toString().replaceAll("-","");
String filePath
= jmxPath
+ File
.separator
+ uuid
+ ".jmx";
SaveService
.saveTree(hashTreeTestPlan
, new FileOutputStream(filePath
));
File file
= new File("/Users/wzr/Documents/work/ratel/9b0e2b0022fd4b868f3f20b92ed2bb6d.jmx");
HashTree hashTree
= SaveService
.loadTree(file
);