diff --git a/api-test/backend/src/main/java/io/metersphere/api/exec/api/ApiExecuteService.java b/api-test/backend/src/main/java/io/metersphere/api/exec/api/ApiExecuteService.java index 0a07cd7c53..49283889cd 100644 --- a/api-test/backend/src/main/java/io/metersphere/api/exec/api/ApiExecuteService.java +++ b/api-test/backend/src/main/java/io/metersphere/api/exec/api/ApiExecuteService.java @@ -176,12 +176,12 @@ public class ApiExecuteService { return new MsExecResponseDTO(runRequest.getTestId(), runRequest.getReportId(), runRequest.getRunMode()); } - public String getHashTree(MsJSR223Processor request) { + public HashTree getHashTree(MsJSR223Processor request) { MsTestPlan testPlan = new MsTestPlan(); - testPlan.setName(MsTestPlan.class.getCanonicalName()); + testPlan.setName(request.getId()); testPlan.setHashTree(new LinkedList<>()); MsThreadGroup threadGroup = new MsThreadGroup(); - threadGroup.setName(MsThreadGroup.class.getCanonicalName()); + threadGroup.setName(request.getId()); threadGroup.setHashTree(new LinkedList<>()); testPlan.getHashTree().add(threadGroup); testPlan.setProjectJarIds(NewDriverManager.getJars(new ArrayList<>() {{ @@ -190,7 +190,7 @@ public class ApiExecuteService { threadGroup.getHashTree().add(request); ParameterConfig config = new ParameterConfig(); config.setProjectId(request.getProjectId()); - return new MsTestPlan().getJmx(testPlan.generateHashTree(config)); + return testPlan.generateHashTree(config); } private JmeterRunRequestDTO initRunRequest(RunDefinitionRequest request, List bodyFiles) { diff --git a/api-test/backend/src/main/java/io/metersphere/controller/definition/ApiDefinitionController.java b/api-test/backend/src/main/java/io/metersphere/controller/definition/ApiDefinitionController.java index 2fe5b96718..ee82daf373 100644 --- a/api-test/backend/src/main/java/io/metersphere/controller/definition/ApiDefinitionController.java +++ b/api-test/backend/src/main/java/io/metersphere/controller/definition/ApiDefinitionController.java @@ -8,7 +8,6 @@ import io.metersphere.api.dto.automation.ApiScenarioRequest; import io.metersphere.api.dto.automation.TcpTreeTableDataStruct; import io.metersphere.api.dto.definition.*; 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.swaggerurl.SwaggerTaskResult; 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.request.ResetOrderRequest; import io.metersphere.service.definition.ApiDefinitionService; +import io.metersphere.service.definition.FunctionRunService; import jakarta.annotation.Resource; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.authz.annotation.RequiresPermissions; @@ -54,7 +54,8 @@ public class ApiDefinitionController { private ExecThreadPoolExecutor execThreadPoolExecutor; @Resource private ApiExecuteService apiExecuteService; - + @Resource + private FunctionRunService functionRunService; @PostMapping("/list/{goPage}/{pageSize}") @RequiresPermissions("PROJECT_API_DEFINITION:READ") @@ -392,11 +393,6 @@ public class ApiDefinitionController { return apiDefinitionService.rawToXml(parseTreeDataDTO.getStringData()); } - @PostMapping("/get-hash-tree") - public String getHashTree(@RequestBody MsJSR223Processor request) { - return apiExecuteService.getHashTree(request); - } - @PostMapping("/update/file") public void updateFileMetadataId(@RequestBody List requestList) { apiDefinitionService.updateFileMetadataId(requestList); @@ -407,4 +403,9 @@ public class ApiDefinitionController { public List getBaseCaseByProjectId(@PathVariable String projectId) { return apiDefinitionService.getBaseCaseByProjectId(projectId); } + + @PostMapping("/func/run") + public void run(@RequestBody Object request) { + functionRunService.run(request); + } } diff --git a/api-test/backend/src/main/java/io/metersphere/service/definition/FunctionRunService.java b/api-test/backend/src/main/java/io/metersphere/service/definition/FunctionRunService.java new file mode 100644 index 0000000000..a330339655 --- /dev/null +++ b/api-test/backend/src/main/java/io/metersphere/service/definition/FunctionRunService.java @@ -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()); + } + } +} diff --git a/project-management/backend/src/main/java/io/metersphere/code/snippet/controller/CustomFunctionController.java b/project-management/backend/src/main/java/io/metersphere/code/snippet/controller/CustomFunctionController.java index a8e3d88cb5..2bf449e22d 100644 --- a/project-management/backend/src/main/java/io/metersphere/code/snippet/controller/CustomFunctionController.java +++ b/project-management/backend/src/main/java/io/metersphere/code/snippet/controller/CustomFunctionController.java @@ -7,11 +7,10 @@ import io.metersphere.base.domain.CustomFunctionWithBLOBs; import io.metersphere.code.snippet.service.CustomFunctionService; import io.metersphere.commons.utils.PageUtils; import io.metersphere.commons.utils.Pager; -import io.metersphere.dto.MsExecResponseDTO; import io.metersphere.request.CustomFunctionRequest; +import jakarta.annotation.Resource; import org.springframework.web.bind.annotation.*; -import jakarta.annotation.Resource; import java.util.List; /** @@ -56,8 +55,8 @@ public class CustomFunctionController { return customFunctionService.get(id); } - @PostMapping("/run/{reportId}") - public MsExecResponseDTO run(@PathVariable String reportId, @RequestBody Object request) { - return customFunctionService.run(reportId, request); + @PostMapping("/run") + public void run(@RequestBody Object request) { + customFunctionService.run(request); } } diff --git a/project-management/backend/src/main/java/io/metersphere/code/snippet/service/CustomFunctionService.java b/project-management/backend/src/main/java/io/metersphere/code/snippet/service/CustomFunctionService.java index 465b05d748..5726cd9bee 100644 --- a/project-management/backend/src/main/java/io/metersphere/code/snippet/service/CustomFunctionService.java +++ b/project-management/backend/src/main/java/io/metersphere/code/snippet/service/CustomFunctionService.java @@ -6,17 +6,17 @@ import io.metersphere.base.mapper.CustomFunctionMapper; import io.metersphere.base.mapper.FileMetadataMapper; import io.metersphere.base.mapper.ext.ExtCustomFunctionMapper; import io.metersphere.code.snippet.listener.MsDebugListener; -import io.metersphere.code.snippet.util.FixedCapacityUtils; import io.metersphere.code.snippet.util.ProjectFileUtils; import io.metersphere.commons.constants.MicroServiceName; import io.metersphere.commons.constants.StorageConstants; 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.dto.FileInfoDTO; -import io.metersphere.dto.MsExecResponseDTO; import io.metersphere.dto.ProjectJarConfig; -import io.metersphere.jmeter.LocalRunner; import io.metersphere.jmeter.ProjectClassLoader; import io.metersphere.metadata.service.FileMetadataService; import io.metersphere.request.CustomFunctionRequest; @@ -35,10 +35,8 @@ import org.apache.jorphan.collections.HashTree; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.io.ByteArrayInputStream; import java.io.File; import java.lang.reflect.Field; -import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -204,25 +202,8 @@ public class CustomFunctionService { return jarConfigMap; } - public MsExecResponseDTO run(String reportId, Object request) { - HashTree hashTree = null; - //下载项目执行代码片段的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; + public void run(Object request) { + microService.postForData(MicroServiceName.API_TEST, "/api/definition/func/run", request); } private HashTree getHashTree(Object scriptWrapper) throws Exception { diff --git a/project-management/frontend/src/api/custom-func.js b/project-management/frontend/src/api/custom-func.js index 1729d83550..d9736010c3 100644 --- a/project-management/frontend/src/api/custom-func.js +++ b/project-management/frontend/src/api/custom-func.js @@ -24,10 +24,20 @@ export function modifyCodeSnippet(obj) { return post('/custom/func/update', obj); } -export function runCodeSnippet(reportId, param) { - return post(`/custom/func/run/${reportId}`, param); +export function runCodeSnippet( 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) { - return socket(`/websocket/${reportId}`) + return apiSocket(`/api/websocket/${reportId}`) } diff --git a/project-management/frontend/src/business/menu/function/FunctionRun.vue b/project-management/frontend/src/business/menu/function/FunctionRun.vue index aa275235e4..b3d14563df 100644 --- a/project-management/frontend/src/business/menu/function/FunctionRun.vue +++ b/project-management/frontend/src/business/menu/function/FunctionRun.vue @@ -3,6 +3,7 @@