fix(项目管理): 代码片段禁用本地执行
【【接口测试】禁用本地执行后,项目设置里的自定义代码片段未使用资源池执行】https://www.tapd.cn/55049933/bugtrace/bugs/view?bug_id=1155049933001026037 Signed-off-by: fit2-zhao <yong.zhao@fit2cloud.com>
This commit is contained in:
parent
e3b5107a53
commit
2ca7638815
|
@ -170,12 +170,12 @@ public class ApiExecuteService {
|
||||||
return new MsExecResponseDTO(runRequest.getTestId(), runRequest.getReportId(), runRequest.getRunMode());
|
return new MsExecResponseDTO(runRequest.getTestId(), runRequest.getReportId(), runRequest.getRunMode());
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getHashTree(MsJSR223Processor request) {
|
public HashTree getHashTree(MsJSR223Processor request) {
|
||||||
MsTestPlan testPlan = new MsTestPlan();
|
MsTestPlan testPlan = new MsTestPlan();
|
||||||
testPlan.setName(MsTestPlan.class.getCanonicalName());
|
testPlan.setName(request.getId());
|
||||||
testPlan.setHashTree(new LinkedList<>());
|
testPlan.setHashTree(new LinkedList<>());
|
||||||
MsThreadGroup threadGroup = new MsThreadGroup();
|
MsThreadGroup threadGroup = new MsThreadGroup();
|
||||||
threadGroup.setName(MsThreadGroup.class.getCanonicalName());
|
threadGroup.setName(request.getId());
|
||||||
threadGroup.setHashTree(new LinkedList<>());
|
threadGroup.setHashTree(new LinkedList<>());
|
||||||
testPlan.getHashTree().add(threadGroup);
|
testPlan.getHashTree().add(threadGroup);
|
||||||
testPlan.setProjectJarIds(NewDriverManager.getJars(new ArrayList<>() {{
|
testPlan.setProjectJarIds(NewDriverManager.getJars(new ArrayList<>() {{
|
||||||
|
@ -184,7 +184,7 @@ public class ApiExecuteService {
|
||||||
threadGroup.getHashTree().add(request);
|
threadGroup.getHashTree().add(request);
|
||||||
ParameterConfig config = new ParameterConfig();
|
ParameterConfig config = new ParameterConfig();
|
||||||
config.setProjectId(request.getProjectId());
|
config.setProjectId(request.getProjectId());
|
||||||
return new MsTestPlan().getJmx(testPlan.generateHashTree(config));
|
return testPlan.generateHashTree(config);
|
||||||
}
|
}
|
||||||
|
|
||||||
private JmeterRunRequestDTO initRunRequest(RunDefinitionRequest request, List<MultipartFile> bodyFiles) {
|
private JmeterRunRequestDTO initRunRequest(RunDefinitionRequest request, List<MultipartFile> bodyFiles) {
|
||||||
|
|
|
@ -8,7 +8,6 @@ import io.metersphere.api.dto.automation.ApiScenarioRequest;
|
||||||
import io.metersphere.api.dto.automation.TcpTreeTableDataStruct;
|
import io.metersphere.api.dto.automation.TcpTreeTableDataStruct;
|
||||||
import io.metersphere.api.dto.definition.*;
|
import io.metersphere.api.dto.definition.*;
|
||||||
import io.metersphere.api.dto.definition.request.assertions.document.DocumentElement;
|
import io.metersphere.api.dto.definition.request.assertions.document.DocumentElement;
|
||||||
import io.metersphere.api.dto.definition.request.processors.MsJSR223Processor;
|
|
||||||
import io.metersphere.api.dto.scenario.Body;
|
import io.metersphere.api.dto.scenario.Body;
|
||||||
import io.metersphere.api.dto.swaggerurl.SwaggerTaskResult;
|
import io.metersphere.api.dto.swaggerurl.SwaggerTaskResult;
|
||||||
import io.metersphere.api.dto.swaggerurl.SwaggerUrlRequest;
|
import io.metersphere.api.dto.swaggerurl.SwaggerUrlRequest;
|
||||||
|
@ -34,6 +33,7 @@ import io.metersphere.log.annotation.MsAuditLog;
|
||||||
import io.metersphere.notice.annotation.SendNotice;
|
import io.metersphere.notice.annotation.SendNotice;
|
||||||
import io.metersphere.request.ResetOrderRequest;
|
import io.metersphere.request.ResetOrderRequest;
|
||||||
import io.metersphere.service.definition.ApiDefinitionService;
|
import io.metersphere.service.definition.ApiDefinitionService;
|
||||||
|
import io.metersphere.service.definition.FunctionRunService;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.apache.shiro.authz.annotation.RequiresPermissions;
|
import org.apache.shiro.authz.annotation.RequiresPermissions;
|
||||||
|
@ -54,7 +54,8 @@ public class ApiDefinitionController {
|
||||||
private ExecThreadPoolExecutor execThreadPoolExecutor;
|
private ExecThreadPoolExecutor execThreadPoolExecutor;
|
||||||
@Resource
|
@Resource
|
||||||
private ApiExecuteService apiExecuteService;
|
private ApiExecuteService apiExecuteService;
|
||||||
|
@Resource
|
||||||
|
private FunctionRunService functionRunService;
|
||||||
|
|
||||||
@PostMapping("/list/{goPage}/{pageSize}")
|
@PostMapping("/list/{goPage}/{pageSize}")
|
||||||
@RequiresPermissions("PROJECT_API_DEFINITION:READ")
|
@RequiresPermissions("PROJECT_API_DEFINITION:READ")
|
||||||
|
@ -392,11 +393,6 @@ public class ApiDefinitionController {
|
||||||
return apiDefinitionService.rawToXml(parseTreeDataDTO.getStringData());
|
return apiDefinitionService.rawToXml(parseTreeDataDTO.getStringData());
|
||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping("/get-hash-tree")
|
|
||||||
public String getHashTree(@RequestBody MsJSR223Processor request) {
|
|
||||||
return apiExecuteService.getHashTree(request);
|
|
||||||
}
|
|
||||||
|
|
||||||
@PostMapping("/update/file")
|
@PostMapping("/update/file")
|
||||||
public void updateFileMetadataId(@RequestBody List<ReplaceFileIdRequest> requestList) {
|
public void updateFileMetadataId(@RequestBody List<ReplaceFileIdRequest> requestList) {
|
||||||
apiDefinitionService.updateFileMetadataId(requestList);
|
apiDefinitionService.updateFileMetadataId(requestList);
|
||||||
|
@ -407,4 +403,9 @@ public class ApiDefinitionController {
|
||||||
public List<BaseCase> getBaseCaseByProjectId(@PathVariable String projectId) {
|
public List<BaseCase> getBaseCaseByProjectId(@PathVariable String projectId) {
|
||||||
return apiDefinitionService.getBaseCaseByProjectId(projectId);
|
return apiDefinitionService.getBaseCaseByProjectId(projectId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@PostMapping("/func/run")
|
||||||
|
public void run(@RequestBody Object request) {
|
||||||
|
functionRunService.run(request);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,67 @@
|
||||||
|
package io.metersphere.service.definition;
|
||||||
|
|
||||||
|
|
||||||
|
import io.metersphere.api.dto.definition.request.processors.MsJSR223Processor;
|
||||||
|
import io.metersphere.api.exec.api.ApiExecuteService;
|
||||||
|
import io.metersphere.api.jmeter.JMeterService;
|
||||||
|
import io.metersphere.commons.constants.ApiRunMode;
|
||||||
|
import io.metersphere.commons.constants.TriggerMode;
|
||||||
|
import io.metersphere.commons.exception.MSException;
|
||||||
|
import io.metersphere.commons.utils.GenerateHashTreeUtil;
|
||||||
|
import io.metersphere.commons.utils.JSON;
|
||||||
|
import io.metersphere.dto.BaseSystemConfigDTO;
|
||||||
|
import io.metersphere.dto.JmeterRunRequestDTO;
|
||||||
|
import io.metersphere.dto.RunModeConfigDTO;
|
||||||
|
import io.metersphere.jmeter.ProjectClassLoader;
|
||||||
|
import io.metersphere.service.SystemParameterService;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.apache.jorphan.collections.HashTree;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author lyh
|
||||||
|
*/
|
||||||
|
|
||||||
|
@Service
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public class FunctionRunService {
|
||||||
|
@Resource
|
||||||
|
private ApiExecuteService apiExecuteService;
|
||||||
|
@Resource
|
||||||
|
private JMeterService jMeterService;
|
||||||
|
@Resource
|
||||||
|
private SystemParameterService systemParameterService;
|
||||||
|
|
||||||
|
public void run(Object req) {
|
||||||
|
MsJSR223Processor request = JSON.parseObject(JSON.toJSONString(req), MsJSR223Processor.class);
|
||||||
|
// 验证是否本地执行
|
||||||
|
RunModeConfigDTO runModeConfigDTO = new RunModeConfigDTO();
|
||||||
|
jMeterService.verifyPool(request.getProjectId(), runModeConfigDTO);
|
||||||
|
try {
|
||||||
|
HashTree hashTree = apiExecuteService.getHashTree(request);
|
||||||
|
JmeterRunRequestDTO runRequest = new JmeterRunRequestDTO(request.getId(),
|
||||||
|
request.getId(), ApiRunMode.DEBUG.name(), TriggerMode.MANUAL.name(), hashTree);
|
||||||
|
runRequest.setDebug(true);
|
||||||
|
if (StringUtils.isNotEmpty(runModeConfigDTO.getResourcePoolId())) {
|
||||||
|
runRequest.setPool(GenerateHashTreeUtil.isResourcePool(runModeConfigDTO.getResourcePoolId()));
|
||||||
|
runRequest.setPoolId(runModeConfigDTO.getResourcePoolId());
|
||||||
|
BaseSystemConfigDTO baseInfo = systemParameterService.getBaseInfo();
|
||||||
|
runRequest.setPlatformUrl(GenerateHashTreeUtil.getPlatformUrl(baseInfo, runRequest, null));
|
||||||
|
} else {
|
||||||
|
// 加载自定义JAR
|
||||||
|
ClassLoader loader = ProjectClassLoader.getClassLoader(new ArrayList<>() {{
|
||||||
|
this.add(request.getProjectId());
|
||||||
|
}});
|
||||||
|
Thread.currentThread().setContextClassLoader(loader);
|
||||||
|
}
|
||||||
|
// 开始执行
|
||||||
|
jMeterService.run(runRequest);
|
||||||
|
} catch (Exception e) {
|
||||||
|
MSException.throwException(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -7,11 +7,10 @@ import io.metersphere.base.domain.CustomFunctionWithBLOBs;
|
||||||
import io.metersphere.code.snippet.service.CustomFunctionService;
|
import io.metersphere.code.snippet.service.CustomFunctionService;
|
||||||
import io.metersphere.commons.utils.PageUtils;
|
import io.metersphere.commons.utils.PageUtils;
|
||||||
import io.metersphere.commons.utils.Pager;
|
import io.metersphere.commons.utils.Pager;
|
||||||
import io.metersphere.dto.MsExecResponseDTO;
|
|
||||||
import io.metersphere.request.CustomFunctionRequest;
|
import io.metersphere.request.CustomFunctionRequest;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
import jakarta.annotation.Resource;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -56,8 +55,8 @@ public class CustomFunctionController {
|
||||||
return customFunctionService.get(id);
|
return customFunctionService.get(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping("/run/{reportId}")
|
@PostMapping("/run")
|
||||||
public MsExecResponseDTO run(@PathVariable String reportId, @RequestBody Object request) {
|
public void run(@RequestBody Object request) {
|
||||||
return customFunctionService.run(reportId, request);
|
customFunctionService.run(request);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,17 +6,17 @@ import io.metersphere.base.mapper.CustomFunctionMapper;
|
||||||
import io.metersphere.base.mapper.FileMetadataMapper;
|
import io.metersphere.base.mapper.FileMetadataMapper;
|
||||||
import io.metersphere.base.mapper.ext.ExtCustomFunctionMapper;
|
import io.metersphere.base.mapper.ext.ExtCustomFunctionMapper;
|
||||||
import io.metersphere.code.snippet.listener.MsDebugListener;
|
import io.metersphere.code.snippet.listener.MsDebugListener;
|
||||||
import io.metersphere.code.snippet.util.FixedCapacityUtils;
|
|
||||||
import io.metersphere.code.snippet.util.ProjectFileUtils;
|
import io.metersphere.code.snippet.util.ProjectFileUtils;
|
||||||
import io.metersphere.commons.constants.MicroServiceName;
|
import io.metersphere.commons.constants.MicroServiceName;
|
||||||
import io.metersphere.commons.constants.StorageConstants;
|
import io.metersphere.commons.constants.StorageConstants;
|
||||||
import io.metersphere.commons.exception.MSException;
|
import io.metersphere.commons.exception.MSException;
|
||||||
import io.metersphere.commons.utils.*;
|
import io.metersphere.commons.utils.BeanUtils;
|
||||||
|
import io.metersphere.commons.utils.CommonBeanFactory;
|
||||||
|
import io.metersphere.commons.utils.FileUtils;
|
||||||
|
import io.metersphere.commons.utils.SessionUtils;
|
||||||
import io.metersphere.constants.BackendListenerConstants;
|
import io.metersphere.constants.BackendListenerConstants;
|
||||||
import io.metersphere.dto.FileInfoDTO;
|
import io.metersphere.dto.FileInfoDTO;
|
||||||
import io.metersphere.dto.MsExecResponseDTO;
|
|
||||||
import io.metersphere.dto.ProjectJarConfig;
|
import io.metersphere.dto.ProjectJarConfig;
|
||||||
import io.metersphere.jmeter.LocalRunner;
|
|
||||||
import io.metersphere.jmeter.ProjectClassLoader;
|
import io.metersphere.jmeter.ProjectClassLoader;
|
||||||
import io.metersphere.metadata.service.FileMetadataService;
|
import io.metersphere.metadata.service.FileMetadataService;
|
||||||
import io.metersphere.request.CustomFunctionRequest;
|
import io.metersphere.request.CustomFunctionRequest;
|
||||||
|
@ -35,10 +35,8 @@ import org.apache.jorphan.collections.HashTree;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.nio.charset.StandardCharsets;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -204,25 +202,8 @@ public class CustomFunctionService {
|
||||||
return jarConfigMap;
|
return jarConfigMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
public MsExecResponseDTO run(String reportId, Object request) {
|
public void run(Object request) {
|
||||||
HashTree hashTree = null;
|
microService.postForData(MicroServiceName.API_TEST, "/api/definition/func/run", request);
|
||||||
//下载项目执行代码片段的jar包
|
|
||||||
getJars();
|
|
||||||
String jmx = microService.postForData(MicroServiceName.API_TEST, "/api/definition/get-hash-tree", request, String.class);
|
|
||||||
try {
|
|
||||||
Object scriptWrapper = SaveService.loadElement(new ByteArrayInputStream(jmx.getBytes(StandardCharsets.UTF_8)));
|
|
||||||
hashTree = this.getHashTree(scriptWrapper);
|
|
||||||
} catch (Exception e) {
|
|
||||||
LogUtil.error(e.getMessage());
|
|
||||||
MSException.throwException(e.getMessage());
|
|
||||||
}
|
|
||||||
if (!FixedCapacityUtils.containsKey(reportId)) {
|
|
||||||
FixedCapacityUtils.put(reportId,new StringBuffer());
|
|
||||||
}
|
|
||||||
addDebugListener(reportId, hashTree);
|
|
||||||
LocalRunner runner = new LocalRunner(hashTree);
|
|
||||||
runner.run(reportId);
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private HashTree getHashTree(Object scriptWrapper) throws Exception {
|
private HashTree getHashTree(Object scriptWrapper) throws Exception {
|
||||||
|
|
|
@ -24,10 +24,20 @@ export function modifyCodeSnippet(obj) {
|
||||||
return post('/custom/func/update', obj);
|
return post('/custom/func/update', obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function runCodeSnippet(reportId, param) {
|
export function runCodeSnippet( param) {
|
||||||
return post(`/custom/func/run/${reportId}`, param);
|
return post(`/custom/func/run`, param);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export const apiSocket = (url) => {
|
||||||
|
let protocol = "ws://";
|
||||||
|
if (window.location.protocol === 'https:') {
|
||||||
|
protocol = "wss://";
|
||||||
|
}
|
||||||
|
let uri = protocol + window.location.host + url;
|
||||||
|
return new WebSocket(uri);
|
||||||
|
};
|
||||||
|
|
||||||
export function getSocket(reportId) {
|
export function getSocket(reportId) {
|
||||||
return socket(`/websocket/${reportId}`)
|
return apiSocket(`/api/websocket/${reportId}`)
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
import {getSocket, runCodeSnippet} from "../../../api/custom-func";
|
import {getSocket, runCodeSnippet} from "../../../api/custom-func";
|
||||||
|
import {getCurrentProjectID} from "metersphere-frontend/src/utils/token";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'FunctionRun',
|
name: 'FunctionRun',
|
||||||
|
@ -59,7 +60,9 @@ export default {
|
||||||
this.websocket.onopen = this.onOpen;
|
this.websocket.onopen = this.onOpen;
|
||||||
},
|
},
|
||||||
run() {
|
run() {
|
||||||
runCodeSnippet(this.reportId, this.runData).then(res => {
|
this.runData.id = this.reportId;
|
||||||
|
this.runData.projectId = getCurrentProjectID();
|
||||||
|
runCodeSnippet(this.runData).then(res => {
|
||||||
this.requestResult = res.data;
|
this.requestResult = res.data;
|
||||||
}).catch(() => {
|
}).catch(() => {
|
||||||
this.$emit('errorRefresh', {});
|
this.$emit('errorRefresh', {});
|
||||||
|
|
Loading…
Reference in New Issue