diff --git a/api-test/backend/src/main/java/io/metersphere/service/plan/TestPlanScenarioCaseService.java b/api-test/backend/src/main/java/io/metersphere/service/plan/TestPlanScenarioCaseService.java index 80bf059ce3..8c15bd5af5 100644 --- a/api-test/backend/src/main/java/io/metersphere/service/plan/TestPlanScenarioCaseService.java +++ b/api-test/backend/src/main/java/io/metersphere/service/plan/TestPlanScenarioCaseService.java @@ -41,6 +41,7 @@ import io.metersphere.service.plan.remote.TestPlanService; import io.metersphere.service.scenario.ApiScenarioModuleService; import io.metersphere.service.scenario.ApiScenarioReportService; import io.metersphere.service.scenario.ApiScenarioService; +import jakarta.annotation.Resource; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.StringUtils; @@ -52,7 +53,6 @@ import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import jakarta.annotation.Resource; import java.util.*; import java.util.stream.Collectors; @@ -351,12 +351,11 @@ public class TestPlanScenarioCaseService { map.put(s, envMap.get(s)); } } - String envJsonStr = JSON.toJSONString(map); - if (!StringUtils.equals(envJsonStr, testPlanApiScenario.getEnvironment())) { - testPlanApiScenario.setEnvironmentType(EnvironmentType.JSON.toString()); - testPlanApiScenario.setEnvironment(JSON.toJSONString(map)); - mapper.updateByPrimaryKeyWithBLOBs(testPlanApiScenario); - } + + testPlanApiScenario.setEnvironmentType(runModeConfig.getEnvironmentType()); + testPlanApiScenario.setEnvironmentGroupId(runModeConfig.getEnvironmentGroupId()); + testPlanApiScenario.setEnvironment(JSON.toJSONString(map)); + mapper.updateByPrimaryKeyWithBLOBs(testPlanApiScenario); } sqlSession.flushStatements(); if (sqlSession != null && sqlSessionFactory != null) { diff --git a/framework/sdk-parent/sdk/src/main/java/io/metersphere/base/mapper/ext/BaseTaskMapper.xml b/framework/sdk-parent/sdk/src/main/java/io/metersphere/base/mapper/ext/BaseTaskMapper.xml index 5f0d2071a2..265538de8f 100644 --- a/framework/sdk-parent/sdk/src/main/java/io/metersphere/base/mapper/ext/BaseTaskMapper.xml +++ b/framework/sdk-parent/sdk/src/main/java/io/metersphere/base/mapper/ext/BaseTaskMapper.xml @@ -40,7 +40,7 @@ AND t.user_id = #{request.executor} AND (t.integrated_report_id IS NULL OR t.integrated_report_id = 'null') - ORDER BY t.create_time DESC + ORDER BY t.create_time,t.end_time DESC @@ -70,7 +70,7 @@ AND t.user_id = #{request.executor} - ORDER BY t.create_time DESC + ORDER BY t.create_time,t.end_time DESC diff --git a/test-track/backend/src/main/java/io/metersphere/controller/TestPlanController.java b/test-track/backend/src/main/java/io/metersphere/controller/TestPlanController.java index 2c92463a93..c9a3f654ab 100644 --- a/test-track/backend/src/main/java/io/metersphere/controller/TestPlanController.java +++ b/test-track/backend/src/main/java/io/metersphere/controller/TestPlanController.java @@ -5,11 +5,13 @@ import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import io.metersphere.base.domain.*; import io.metersphere.commons.constants.*; +import io.metersphere.commons.exception.MSException; import io.metersphere.commons.utils.PageUtils; import io.metersphere.commons.utils.Pager; import io.metersphere.dto.ScheduleDTO; import io.metersphere.dto.TestPlanDTOWithMetric; import io.metersphere.dto.TestPlanRerunParametersDTO; +import io.metersphere.i18n.Translator; import io.metersphere.log.annotation.MsAuditLog; import io.metersphere.notice.annotation.SendNotice; import io.metersphere.plan.dto.TestCaseReportStatusResultDTO; @@ -26,15 +28,15 @@ import io.metersphere.plan.request.function.TestCaseRelevanceRequest; import io.metersphere.plan.service.TestPlanProjectService; import io.metersphere.plan.service.TestPlanRerunService; import io.metersphere.plan.service.TestPlanService; -import io.metersphere.plan.service.remote.api.PlanApiAutomationService; import io.metersphere.request.ScheduleRequest; import io.metersphere.service.BaseScheduleService; +import io.metersphere.service.BaseUserService; import io.metersphere.service.wapper.CheckPermissionService; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.web.bind.annotation.*; -import jakarta.annotation.Resource; -import jakarta.servlet.http.HttpServletResponse; import java.io.UnsupportedEncodingException; import java.util.List; import java.util.Map; @@ -53,7 +55,7 @@ public class TestPlanController { @Resource private BaseScheduleService baseScheduleService; @Resource - private PlanApiAutomationService planApiAutomationService; + private BaseUserService baseUserService; @Resource private TestPlanRerunService testPlanRerunService; @@ -240,6 +242,9 @@ public class TestPlanController { @PostMapping("/run") public String run(@RequestBody TestPlanRunRequest testplanRunRequest) { + if (baseUserService.getUserDTO(testplanRunRequest.getUserId()) == null) { + MSException.throwException(Translator.get("user_not_exist")); + } return testPlanService.runPlan(testplanRunRequest); } diff --git a/test-track/backend/src/main/java/io/metersphere/plan/dto/TestPlanReportRunInfoDTO.java b/test-track/backend/src/main/java/io/metersphere/plan/dto/TestPlanReportRunInfoDTO.java index 141c3e335a..1958806901 100644 --- a/test-track/backend/src/main/java/io/metersphere/plan/dto/TestPlanReportRunInfoDTO.java +++ b/test-track/backend/src/main/java/io/metersphere/plan/dto/TestPlanReportRunInfoDTO.java @@ -15,6 +15,8 @@ public class TestPlanReportRunInfoDTO { private String envGroupId; private String runMode; + private Map requestEnvMap; + // <测试计划场景关联表ID, <项目ID,环境ID>> private Map>> scenarioRunInfo; // <测试计划场景关联表ID, <项目ID,环境ID>> @@ -47,7 +49,7 @@ public class TestPlanReportRunInfoDTO { }}); } } - + public void putUiScenarioRunInfo(String scenarioResourceId, String projectId, String environmentId) { if (uiScenarioRunInfo.containsKey(scenarioResourceId)) { if (uiScenarioRunInfo.get(scenarioResourceId).containsKey(projectId)) { diff --git a/test-track/backend/src/main/java/io/metersphere/plan/service/TestPlanReportService.java b/test-track/backend/src/main/java/io/metersphere/plan/service/TestPlanReportService.java index 37223afd73..b06e417008 100644 --- a/test-track/backend/src/main/java/io/metersphere/plan/service/TestPlanReportService.java +++ b/test-track/backend/src/main/java/io/metersphere/plan/service/TestPlanReportService.java @@ -10,7 +10,9 @@ import io.metersphere.commons.utils.*; import io.metersphere.constants.RunModeConstants; import io.metersphere.dto.*; import io.metersphere.environment.service.BaseEnvGroupProjectService; +import io.metersphere.environment.service.BaseEnvironmentService; import io.metersphere.excel.constants.TestPlanTestCaseStatus; +import io.metersphere.i18n.Translator; import io.metersphere.log.vo.OperatingLogDetails; import io.metersphere.plan.constant.ApiReportStatus; import io.metersphere.plan.dto.*; @@ -24,6 +26,7 @@ import io.metersphere.plan.service.remote.ui.PlanTestPlanUiScenarioCaseService; import io.metersphere.plan.utils.TestPlanRequestUtil; import io.metersphere.plan.utils.TestPlanStatusCalculator; import io.metersphere.request.report.QueryTestPlanReportRequest; +import io.metersphere.service.BaseProjectService; import io.metersphere.service.BaseUserService; import io.metersphere.service.ServiceUtils; import io.metersphere.utils.DiscoveryUtil; @@ -105,6 +108,10 @@ public class TestPlanReportService { private PlanTestPlanScenarioCaseService planTestPlanScenarioCaseService; @Resource private BaseUserService baseUserService; + @Resource + private BaseEnvironmentService apiTestEnvironmentService; + @Resource + private BaseProjectService baseProjectService; private final String GROUP = "GROUP"; @@ -264,6 +271,8 @@ public class TestPlanReportService { List scenarios) { TestPlanReportRunInfoDTO runInfoDTO = new TestPlanReportRunInfoDTO(); + runInfoDTO.setRequestEnvMap(config.getEnvMap()); + final Map runEnvMap = MapUtils.isNotEmpty(config.getEnvMap()) ? config.getEnvMap() : new HashMap<>(); runInfoDTO.setRunMode(config.getMode()); @@ -1129,7 +1138,8 @@ public class TestPlanReportService { } TestPlanSimpleReportDTO testPlanReportDTO = new TestPlanSimpleReportDTO(); BeanUtils.copyBean(testPlanReportDTO, testPlanReportContent); - this.generateEnvironmentInfo(testPlanReportDTO, reportId); + TestPlanReport testPlanReport = testPlanReportMapper.selectByPrimaryKey(reportId); + this.initTestPlanReportEnv(testPlanReportDTO, testPlanReport); testPlanReportDTO.setFunctionResult( getReportContentResultObject(testPlanReportContent.getFunctionResult(), TestPlanFunctionResultReportDTO.class) @@ -1204,7 +1214,6 @@ public class TestPlanReportService { ); testPlanReportDTO.setId(reportId); - TestPlanReport testPlanReport = testPlanReportMapper.selectByPrimaryKey(testPlanReportContent.getTestPlanReportId()); testPlanReportDTO.setName(testPlanReport.getName()); TestPlanService testPlanService = CommonBeanFactory.getBean(TestPlanService.class); TestPlanExtReportDTO extReport = null; @@ -1253,6 +1262,46 @@ public class TestPlanReportService { } } + public void initTestPlanReportEnv(TestPlanSimpleReportDTO testPlanReportDTO, TestPlanReport testPlanReport) { + TestPlanReportRunInfoDTO runInfoDTO = null; + if (StringUtils.isNotEmpty(testPlanReport.getRunInfo())) { + try { + runInfoDTO = JSON.parseObject(testPlanReport.getRunInfo(), TestPlanReportRunInfoDTO.class); + } catch (Exception e) { + LogUtil.error("解析测试计划报告记录的运行环境信息[" + testPlanReport.getRunInfo() + "]时出错!", e); + } + + } + if (runInfoDTO != null) { + if (StringUtils.isNotEmpty(runInfoDTO.getEnvGroupId())) { + EnvironmentGroup environmentGroup = apiTestEnvironmentService.selectById(runInfoDTO.getEnvGroupId()); + if (StringUtils.isNotEmpty(environmentGroup.getName())) { + testPlanReportDTO.setEnvGroupName(environmentGroup.getName()); + } + } else { + if (MapUtils.isNotEmpty(runInfoDTO.getRequestEnvMap())) { + Map> projectEnvMap = new HashMap<>(); + for (Map.Entry entry : runInfoDTO.getRequestEnvMap().entrySet()) { + String projectId = entry.getKey(); + String envId = entry.getValue(); + Project project = baseProjectService.getProjectById(projectId); + String projectName = project == null ? null : project.getName(); + String envNames = apiTestEnvironmentService.selectNameById(envId); + if (StringUtils.isNotEmpty(projectName) && StringUtils.isNotEmpty(envNames)) { + projectEnvMap.put(projectName, new ArrayList<>() {{ + this.add(envNames); + }}); + } + } + if (MapUtils.isNotEmpty(projectEnvMap)) { + testPlanReportDTO.setProjectEnvMap(projectEnvMap); + } + } + } + testPlanReportDTO.setRunMode(StringUtils.equalsIgnoreCase(runInfoDTO.getRunMode(), "serial") ? Translator.get("serial") : Translator.get("parallel")); + } + } + private boolean isDynamicallyGenerateReports(TestPlanReportContentWithBLOBs testPlanReportContent) { return testPlanReportContent != null && (StringUtils.isNotEmpty(testPlanReportContent.getPlanApiCaseReportStruct()) || StringUtils.isNotEmpty(testPlanReportContent.getPlanScenarioReportStruct()) || StringUtils.isNotEmpty(testPlanReportContent.getPlanLoadCaseReportStruct()) || StringUtils.isNotEmpty(testPlanReportContent.getPlanUiScenarioReportStruct())); diff --git a/test-track/backend/src/main/java/io/metersphere/plan/service/TestPlanService.java b/test-track/backend/src/main/java/io/metersphere/plan/service/TestPlanService.java index a4a75c8d2f..68d9352ed6 100644 --- a/test-track/backend/src/main/java/io/metersphere/plan/service/TestPlanService.java +++ b/test-track/backend/src/main/java/io/metersphere/plan/service/TestPlanService.java @@ -1332,6 +1332,7 @@ public class TestPlanService { config = JSON.parseMap(reportConfig); } TestPlanExecuteReportDTO testPlanExecuteReportDTO = testPlanReportService.genTestPlanExecuteReportDTOByTestPlanReportContent(testPlanReportContentWithBLOBs); + TestPlanSimpleReportDTO report = null; boolean apiBaseInfoChanged = false; if (StringUtils.isEmpty(testPlanReportContentWithBLOBs.getApiBaseCount())) { diff --git a/test-track/frontend/src/business/plan/env/EnvSelectPopover.vue b/test-track/frontend/src/business/plan/env/EnvSelectPopover.vue index 02d621b0e6..bdf13ee628 100644 --- a/test-track/frontend/src/business/plan/env/EnvSelectPopover.vue +++ b/test-track/frontend/src/business/plan/env/EnvSelectPopover.vue @@ -1,66 +1,138 @@ - - {{ $t('workspace.env_group.env_list') }} - {{ $t('workspace.env_group.name') }} + + {{ + $t("workspace.env_group.env_list") + }} + {{ $t("workspace.env_group.name") + }} - - - - + + + + - {{ getProjectName(pe.id) }} - - - - {{$t('api_test.environment.default_environment') }} - {{$t('api_test.environment.choose_new_environment')}} + {{ getProjectName(pe.id) }} + + + {{ + $t("api_test.environment.default_environment") + }} + {{ + $t("api_test.environment.choose_new_environment") + }} - {{ itemName }} - - + {{ itemName }} + + - - - - + + - + + :label="group.label" + > + :value="item.id" + > - - + - @@ -68,33 +140,34 @@ - -