From ce1aae2e4fb66816c3b0f0369d294a2e7118284b Mon Sep 17 00:00:00 2001 From: fit2-zhao Date: Fri, 6 Jan 2023 15:04:26 +0800 Subject: [PATCH] =?UTF-8?q?refactor(=E6=8E=A5=E5=8F=A3=E6=B5=8B=E8=AF=95):?= =?UTF-8?q?=20=E7=A6=81=E7=94=A8=E6=9C=AC=E5=9C=B0=E6=89=A7=E8=A1=8C?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=BC=80=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --task=1010912 --user=赵勇 【开源计划】接口测试... https://www.tapd.cn/55049933/s/1323587 --- .../metersphere/api/jmeter/JMeterService.java | 24 +++--- .../automation/scenario/common/ApiRunMode.vue | 5 +- .../automation/schedule/ScheduleMaintain.vue | 5 +- .../service/ApiPoolDebugService.java | 81 +++++++++++++++++++ .../api/service/ApiPoolDebugService.java | 13 --- .../src/business/menu/appmanage/AppManage.vue | 2 +- .../business/system/setting/BaseSetting.vue | 4 +- .../plan/service/TestPlanService.java | 43 +++++----- .../plan/common/PlanRunModeWithEnv.vue | 4 +- .../plan/common/TestPlanRunModeWithEnv.vue | 4 +- .../plan/components/ScheduleMaintain.vue | 4 +- .../view/comonents/api/PlanRunModeWithEnv.vue | 4 +- 12 files changed, 119 insertions(+), 74 deletions(-) create mode 100644 framework/sdk-parent/sdk/src/main/java/io/metersphere/service/ApiPoolDebugService.java delete mode 100644 framework/sdk-parent/xpack-interface/src/main/java/io/metersphere/xpack/api/service/ApiPoolDebugService.java diff --git a/api-test/backend/src/main/java/io/metersphere/api/jmeter/JMeterService.java b/api-test/backend/src/main/java/io/metersphere/api/jmeter/JMeterService.java index b6db672028..985dac54cd 100644 --- a/api-test/backend/src/main/java/io/metersphere/api/jmeter/JMeterService.java +++ b/api-test/backend/src/main/java/io/metersphere/api/jmeter/JMeterService.java @@ -23,7 +23,7 @@ import io.metersphere.jmeter.JMeterBase; import io.metersphere.jmeter.LocalRunner; import io.metersphere.service.RemakeReportService; import io.metersphere.utils.LoggerUtil; -import io.metersphere.xpack.api.service.ApiPoolDebugService; +import io.metersphere.service.ApiPoolDebugService; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.ArrayUtils; @@ -59,6 +59,8 @@ public class JMeterService { private RemakeReportService remakeReportService; @Resource private ExecThreadPoolExecutor execThreadPoolExecutor; + @Resource + private ApiPoolDebugService apiPoolDebugService; @PostConstruct private void init() { @@ -172,16 +174,13 @@ public class JMeterService { private synchronized void nodeDebug(JmeterRunRequestDTO request) { try { - ApiPoolDebugService apiPoolDebugService = CommonBeanFactory.getBean(ApiPoolDebugService.class); - if (apiPoolDebugService != null) { - List resources = GenerateHashTreeUtil.setPoolResource(request.getPoolId()); - if (request.getHashTree() != null) { - String key = StringUtils.join(request.getReportId(), "-", request.getTestId()); - redisTemplate.opsForValue().set(key, new MsTestPlan().getJmx(request.getHashTree())); - request.setHashTree(null); - } - apiPoolDebugService.run(request, resources); + List resources = GenerateHashTreeUtil.setPoolResource(request.getPoolId()); + if (request.getHashTree() != null) { + String key = StringUtils.join(request.getReportId(), "-", request.getTestId()); + redisTemplate.opsForValue().set(key, new MsTestPlan().getJmx(request.getHashTree())); + request.setHashTree(null); } + apiPoolDebugService.run(request, resources); } catch (Exception e) { LoggerUtil.error(e); remakeReportService.remake(request); @@ -263,9 +262,6 @@ public class JMeterService { } public void verifyPool(String projectId, RunModeConfigDTO runModeConfigDTO) { - ApiPoolDebugService debugService = CommonBeanFactory.getBean(ApiPoolDebugService.class); - if (debugService != null) { - debugService.verifyPool(projectId, runModeConfigDTO); - } + apiPoolDebugService.verifyPool(projectId, runModeConfigDTO); } } diff --git a/api-test/frontend/src/business/automation/scenario/common/ApiRunMode.vue b/api-test/frontend/src/business/automation/scenario/common/ApiRunMode.vue index 64692005ee..8051b42df1 100644 --- a/api-test/frontend/src/business/automation/scenario/common/ApiRunMode.vue +++ b/api-test/frontend/src/business/automation/scenario/common/ApiRunMode.vue @@ -100,7 +100,6 @@ import { getCurrentProjectID } from 'metersphere-frontend/src/utils/token'; import { getSystemBaseSetting } from 'metersphere-frontend/src/api/system'; import EnvSelectPopover from '@/business/automation/scenario/EnvSelectPopover'; import { getApiCaseEnvironments } from '@/api/api-test-case'; -import { hasLicense } from 'metersphere-frontend/src/utils/permission'; export default { name: 'ApiRunMode', @@ -155,9 +154,7 @@ export default { this.runModeVisible = true; this.getResourcePools(); this.getWsProjects(); - if (hasLicense()) { - this.query(); - } + this.query(); this.showPopover(); this.runConfig.environmentType = ENV_TYPE.JSON; }, diff --git a/api-test/frontend/src/business/automation/schedule/ScheduleMaintain.vue b/api-test/frontend/src/business/automation/schedule/ScheduleMaintain.vue index 320a1b560b..904dc619ce 100644 --- a/api-test/frontend/src/business/automation/schedule/ScheduleMaintain.vue +++ b/api-test/frontend/src/business/automation/schedule/ScheduleMaintain.vue @@ -115,7 +115,6 @@ import EnvPopover from '@/business/automation/scenario/EnvPopover'; import { getMaintainer, getOwnerProjects, getProjectConfig } from '@/api/project'; import { getTestResourcePools } from '@/api/test-resource-pool'; import { getSystemBaseSetting } from 'metersphere-frontend/src/api/system'; -import { hasLicense } from 'metersphere-frontend/src/utils/permission'; function defaultCustomValidate() { return { pass: true }; @@ -322,9 +321,7 @@ export default { this.activeName = 'first'; this.getResourcePools(); this.getWsProjects(); - if (hasLicense()) { - this.query(); - } + this.query(); this.runConfig.environmentType = ENV_TYPE.JSON; }, findSchedule() { diff --git a/framework/sdk-parent/sdk/src/main/java/io/metersphere/service/ApiPoolDebugService.java b/framework/sdk-parent/sdk/src/main/java/io/metersphere/service/ApiPoolDebugService.java new file mode 100644 index 0000000000..93124c125b --- /dev/null +++ b/framework/sdk-parent/sdk/src/main/java/io/metersphere/service/ApiPoolDebugService.java @@ -0,0 +1,81 @@ +package io.metersphere.service; + +import io.metersphere.base.domain.TestResource; +import io.metersphere.commons.constants.ApiRunMode; +import io.metersphere.commons.exception.MSException; +import io.metersphere.commons.utils.JSON; +import io.metersphere.dto.*; +import io.metersphere.utils.LoggerUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import javax.annotation.Resource; +import java.util.List; + +@Service +public class ApiPoolDebugService { + public static final String BASE_URL = "http://%s:%d"; + public static final String POOL = "POOL"; + + @Resource + private RestTemplate restTemplate; + public static final String SAVE_RESULT = "SAVE_RESULT"; + @Resource + private SystemParameterService systemParameterService; + @Resource + private BaseProjectApplicationService baseProjectApplicationService; + + public void run(JmeterRunRequestDTO request, List resources) throws MSException { + try { + if (request.isDebug() && !StringUtils.equalsAny(request.getRunMode(), ApiRunMode.DEFINITION.name())) { + request.getExtendedParameters().put(SAVE_RESULT, true); + } else if (!request.isDebug()) { + request.getExtendedParameters().put(SAVE_RESULT, true); + } + String uri = null; + int index = (int) (Math.random() * resources.size()); + String configuration = resources.get(index).getConfiguration(); + if (StringUtils.isNotEmpty(configuration)) { + NodeDTO node = JSON.parseObject(configuration, NodeDTO.class); + uri = String.format(BASE_URL + "/jmeter/debug", node.getIp(), node.getPort()); + } + if (StringUtils.isEmpty(uri)) { + LoggerUtil.info("url为空", request.getReportId()); + MSException.throwException("请在【项目设置-应用管理-接口测试】中选择资源池"); + } + LoggerUtil.info("开始发送请求【 " + request.getTestId() + " 】到 " + uri + " 节点执行", request.getReportId()); + ResponseEntity result = restTemplate.postForEntity(uri, request, String.class); + if (result == null || !StringUtils.equals("SUCCESS", result.getBody())) { + LoggerUtil.error("发送请求[ " + request.getTestId() + " ] 到" + uri + " 节点执行失败", request.getReportId()); + LoggerUtil.info(result); + MSException.throwException("请在【项目设置-应用管理-接口测试】中选择资源池"); + } + } catch (Exception e) { + LoggerUtil.error("发送请求[ " + request.getTestId() + " ] 执行失败,进行数据回滚:", request.getReportId(), e); + MSException.throwException("请在【项目设置-应用管理-接口测试】中选择资源池"); + } + } + + /** + * 检查是否禁用了本地执行 + * + * @param projectId + * @param runConfig + */ + public void verifyPool(String projectId, RunModeConfigDTO runConfig) { + if (runConfig != null && StringUtils.isEmpty(runConfig.getResourcePoolId())) { + BaseSystemConfigDTO configDTO = systemParameterService.getBaseInfo(); + LoggerUtil.info("校验项目为:【" + projectId + "】", runConfig.getReportId()); + if (StringUtils.equals(configDTO.getRunMode(), POOL)) { + ProjectConfig config = baseProjectApplicationService.getProjectConfig(projectId); + if (config == null || !config.getPoolEnable() || StringUtils.isEmpty(config.getResourcePoolId())) { + MSException.throwException("请在【项目设置-应用管理-接口测试】中选择资源池"); + } + runConfig = runConfig == null ? new RunModeConfigDTO() : runConfig; + runConfig.setResourcePoolId(config.getResourcePoolId()); + } + } + } +} diff --git a/framework/sdk-parent/xpack-interface/src/main/java/io/metersphere/xpack/api/service/ApiPoolDebugService.java b/framework/sdk-parent/xpack-interface/src/main/java/io/metersphere/xpack/api/service/ApiPoolDebugService.java deleted file mode 100644 index 04ddeb96bf..0000000000 --- a/framework/sdk-parent/xpack-interface/src/main/java/io/metersphere/xpack/api/service/ApiPoolDebugService.java +++ /dev/null @@ -1,13 +0,0 @@ -package io.metersphere.xpack.api.service; - -import io.metersphere.base.domain.TestResource; -import io.metersphere.dto.JmeterRunRequestDTO; -import io.metersphere.dto.RunModeConfigDTO; - -import java.util.List; - -public interface ApiPoolDebugService { - public void run(JmeterRunRequestDTO request, List resources); - - public void verifyPool(String projectId, RunModeConfigDTO runConfig); -} diff --git a/project-management/frontend/src/business/menu/appmanage/AppManage.vue b/project-management/frontend/src/business/menu/appmanage/AppManage.vue index 467fd3e0d7..8b41205c2b 100644 --- a/project-management/frontend/src/business/menu/appmanage/AppManage.vue +++ b/project-management/frontend/src/business/menu/appmanage/AppManage.vue @@ -97,7 +97,7 @@ + :append-span="4" v-if="isPool">