From fc8c997716c4aa1369c5c80b8b9c37f2bfd7c623 Mon Sep 17 00:00:00 2001 From: fit2-zhao Date: Wed, 6 Jan 2021 12:24:13 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E6=8E=A5=E5=8F=A3=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=8C=96):=20=E6=95=B0=E6=8D=AE=E8=BF=81=E7=A7=BB=E5=88=9D?= =?UTF-8?q?=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/controller/APITestController.java | 82 +++-- .../controller/ApiAutomationController.java | 1 + .../api/dto/SaveHistoricalDataUpgrade.java | 18 + .../request/sampler/MsDubboSampler.java | 2 +- .../request/sampler/MsHTTPSamplerProxy.java | 6 +- .../service/HistoricalDataUpgradeService.java | 331 ++++++++++++++++++ .../api/automation/scenario/ApiComponent.vue | 4 +- .../assertion/ApiAssertionsEdit.vue | 2 +- .../request/database/BasisParameters.vue | 25 +- .../request/dubbo/BasisParameters.vue | 26 +- .../components/api/test/ApiTestList.vue | 15 +- .../business/components/api/test/Upgrade.vue | 109 ++++++ .../common/components/MsTableHeader.vue | 5 + 13 files changed, 555 insertions(+), 71 deletions(-) create mode 100644 backend/src/main/java/io/metersphere/api/dto/SaveHistoricalDataUpgrade.java create mode 100644 backend/src/main/java/io/metersphere/api/service/HistoricalDataUpgradeService.java create mode 100644 frontend/src/business/components/api/test/Upgrade.vue diff --git a/backend/src/main/java/io/metersphere/api/controller/APITestController.java b/backend/src/main/java/io/metersphere/api/controller/APITestController.java index 421eec048a..473793e47d 100644 --- a/backend/src/main/java/io/metersphere/api/controller/APITestController.java +++ b/backend/src/main/java/io/metersphere/api/controller/APITestController.java @@ -14,7 +14,6 @@ import io.metersphere.api.service.*; import io.metersphere.base.domain.ApiTest; import io.metersphere.base.domain.Schedule; import io.metersphere.commons.constants.RoleConstants; -import io.metersphere.commons.constants.ScheduleGroup; import io.metersphere.commons.utils.CronUtils; import io.metersphere.commons.utils.PageUtils; import io.metersphere.commons.utils.Pager; @@ -60,6 +59,8 @@ public class APITestController { private ScheduleService scheduleService; @Resource private APIReportService apiReportService; + @Resource + private HistoricalDataUpgradeService historicalDataUpgradeService; @GetMapping("recent/{count}") public List recentTest(@PathVariable int count) { @@ -109,6 +110,7 @@ public class APITestController { public void mergeCreate(@RequestPart("request") SaveAPITestRequest request, @RequestPart(value = "file") MultipartFile file, @RequestPart(value = "selectIds") List selectIds) { apiTestService.mergeCreate(request, file, selectIds); } + @PostMapping(value = "/update", consumes = {"multipart/form-data"}) public void update(@RequestPart("request") SaveAPITestRequest request, @RequestPart(value = "file") MultipartFile file, @RequestPart(value = "files") List bodyFiles) { checkownerService.checkApiTestOwner(request.getId()); @@ -189,19 +191,19 @@ public class APITestController { //查询完成率、进行中、已完成 List countResultByStatelList = apiDefinitionService.countStateByProjectID(projectId); apiCountResult.countStatus(countResultByStatelList); - long allCount = apiCountResult.getFinishedCount()+apiCountResult.getRunningCount()+apiCountResult.getNotStartedCount(); + long allCount = apiCountResult.getFinishedCount() + apiCountResult.getRunningCount() + apiCountResult.getNotStartedCount(); - if(allCount!=0){ - float complateRageNumber =(float)apiCountResult.getFinishedCount()*100/allCount; + if (allCount != 0) { + float complateRageNumber = (float) apiCountResult.getFinishedCount() * 100 / allCount; DecimalFormat df = new DecimalFormat("0.0"); - apiCountResult.setCompletionRage(df.format(complateRageNumber)+"%"); + apiCountResult.setCompletionRage(df.format(complateRageNumber) + "%"); } - apiCountResult.setHttpCountStr("HTTP  

"+apiCountResult.getHttpApiDataCountNumber()); - apiCountResult.setRpcCountStr("RPC  

"+apiCountResult.getRpcApiDataCountNumber()); - apiCountResult.setTcpCountStr("TCP  

"+apiCountResult.getTcpApiDataCountNumber()); - apiCountResult.setSqlCountStr("SQL  

"+apiCountResult.getSqlApiDataCountNumber()); - return apiCountResult; + apiCountResult.setHttpCountStr("HTTP  

" + apiCountResult.getHttpApiDataCountNumber()); + apiCountResult.setRpcCountStr("RPC  

" + apiCountResult.getRpcApiDataCountNumber()); + apiCountResult.setTcpCountStr("TCP  

" + apiCountResult.getTcpApiDataCountNumber()); + apiCountResult.setSqlCountStr("SQL  

" + apiCountResult.getSqlApiDataCountNumber()); + return apiCountResult; } @GetMapping("/testCaseInfoCount/{projectId}") @@ -222,21 +224,21 @@ public class APITestController { //未覆盖 已覆盖: 统计当前接口下是否含有案例 List countResultByApiCoverageList = apiDefinitionService.countApiCoverageByProjectID(projectId); apiCountResult.countApiCoverage(countResultByApiCoverageList); - long allCount = apiCountResult.getCoverageCount()+apiCountResult.getUncoverageCount(); + long allCount = apiCountResult.getCoverageCount() + apiCountResult.getUncoverageCount(); - if(allCount!=0){ - float coverageRageNumber =(float)apiCountResult.getCoverageCount()*100/allCount; + if (allCount != 0) { + float coverageRageNumber = (float) apiCountResult.getCoverageCount() * 100 / allCount; DecimalFormat df = new DecimalFormat("0.0"); - apiCountResult.setCoverageRage(df.format(coverageRageNumber)+"%"); + apiCountResult.setCoverageRage(df.format(coverageRageNumber) + "%"); } - apiCountResult.setHttpCountStr("HTTP  

"+apiCountResult.getHttpApiDataCountNumber()); - apiCountResult.setRpcCountStr("RPC  

"+apiCountResult.getRpcApiDataCountNumber()); - apiCountResult.setTcpCountStr("TCP  

"+apiCountResult.getTcpApiDataCountNumber()); - apiCountResult.setSqlCountStr("SQL  

"+apiCountResult.getSqlApiDataCountNumber()); + apiCountResult.setHttpCountStr("HTTP  

" + apiCountResult.getHttpApiDataCountNumber()); + apiCountResult.setRpcCountStr("RPC  

" + apiCountResult.getRpcApiDataCountNumber()); + apiCountResult.setTcpCountStr("TCP  

" + apiCountResult.getTcpApiDataCountNumber()); + apiCountResult.setSqlCountStr("SQL  

" + apiCountResult.getSqlApiDataCountNumber()); - return apiCountResult; + return apiCountResult; } @GetMapping("/testSceneInfoCount/{projectId}") @@ -263,15 +265,15 @@ public class APITestController { List countResultByRunResult = apiAutomationService.countRunResultByProjectID(projectId); apiCountResult.countRunResult(countResultByRunResult); - long allCount = apiCountResult.getUnexecuteCount()+apiCountResult.getExecutionPassCount()+apiCountResult.getExecutionFailedCount(); + long allCount = apiCountResult.getUnexecuteCount() + apiCountResult.getExecutionPassCount() + apiCountResult.getExecutionFailedCount(); - if(allCount!=0){ - float coverageRageNumber =(float)apiCountResult.getExecutionPassCount()*100/allCount; + if (allCount != 0) { + float coverageRageNumber = (float) apiCountResult.getExecutionPassCount() * 100 / allCount; DecimalFormat df = new DecimalFormat("0.0"); - apiCountResult.setPassRage(df.format(coverageRageNumber)+"%"); + apiCountResult.setPassRage(df.format(coverageRageNumber) + "%"); } - return apiCountResult; + return apiCountResult; } @@ -287,7 +289,7 @@ public class APITestController { apiCountResult.setThisWeekAddedCount(taskCountInThisWeek); long api_executedInThisWeekCountNumber = apiReportService.countByProjectIdAndCreateInThisWeek(projectId); long scene_executedInThisWeekCountNumber = apiScenarioReportService.countByProjectIdAndCreateAndByScheduleInThisWeek(projectId); - long executedInThisWeekCountNumber = api_executedInThisWeekCountNumber+scene_executedInThisWeekCountNumber; + long executedInThisWeekCountNumber = api_executedInThisWeekCountNumber + scene_executedInThisWeekCountNumber; apiCountResult.setThisWeekExecutedCount(executedInThisWeekCountNumber); //统计 失败 成功 以及总数 @@ -299,41 +301,41 @@ public class APITestController { apiCountResult.countScheduleExecute(allExecuteResult); long allCount = apiCountResult.getExecutedCount(); - if(allCount!=0){ - float coverageRageNumber =(float)apiCountResult.getSuccessCount()*100/allCount; + if (allCount != 0) { + float coverageRageNumber = (float) apiCountResult.getSuccessCount() * 100 / allCount; DecimalFormat df = new DecimalFormat("0.0"); - apiCountResult.setSuccessRage(df.format(coverageRageNumber)+"%"); + apiCountResult.setSuccessRage(df.format(coverageRageNumber) + "%"); } - return apiCountResult; + return apiCountResult; } @GetMapping("/faliureCaseAboutTestPlan/{projectId}/{limitNumber}") public List faliureCaseAboutTestPlan(@PathVariable String projectId, @PathVariable int limitNumber) { - List selectDataList = apiDefinitionExecResultService.findFaliureCaseInfoByProjectIDAndLimitNumberInSevenDays(projectId,limitNumber); + List selectDataList = apiDefinitionExecResultService.findFaliureCaseInfoByProjectIDAndLimitNumberInSevenDays(projectId, limitNumber); List returnList = new ArrayList<>(limitNumber); - for(int dataIndex = 0;dataIndex < limitNumber;dataIndex ++){ + for (int dataIndex = 0; dataIndex < limitNumber; dataIndex++) { ExecutedCaseInfoDTO dataDTO = new ExecutedCaseInfoDTO(); - dataDTO.setSortIndex(dataIndex+1); + dataDTO.setSortIndex(dataIndex + 1); - if(dataIndex testIds; + + private String projectId; + + private String modulePath; + + private String moduleId; +} diff --git a/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsDubboSampler.java b/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsDubboSampler.java index 6d97c94cc3..432d3e73e8 100644 --- a/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsDubboSampler.java +++ b/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsDubboSampler.java @@ -31,7 +31,7 @@ public class MsDubboSampler extends MsTestElement { private String type = "DubboSampler"; @JSONField(ordinal = 52) - private String protocol; + private String protocol = "DUBBO"; @JsonProperty(value = "interface") @JSONField(ordinal = 53, name = "interface") private String _interface; diff --git a/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsHTTPSamplerProxy.java b/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsHTTPSamplerProxy.java index 4770e79c04..dbfa8b8173 100644 --- a/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsHTTPSamplerProxy.java +++ b/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsHTTPSamplerProxy.java @@ -172,7 +172,7 @@ public class MsHTTPSamplerProxy extends MsTestElement { LogUtil.error(e); } // REST参数 - if (CollectionUtils.isNotEmpty(this.getArguments())) { + if (CollectionUtils.isNotEmpty(this.getRest())) { sampler.setArguments(httpArguments(this.getRest())); } // 请求参数 @@ -186,7 +186,9 @@ public class MsHTTPSamplerProxy extends MsTestElement { if (StringUtils.isNotEmpty(this.body.getType()) && this.body.getType().equals("Form Data")) { sampler.setDoMultipart(true); } - sampler.setArguments(httpArguments(bodyParams)); + if (CollectionUtils.isNotEmpty(bodyParams)) { + sampler.setArguments(httpArguments(bodyParams)); + } } } diff --git a/backend/src/main/java/io/metersphere/api/service/HistoricalDataUpgradeService.java b/backend/src/main/java/io/metersphere/api/service/HistoricalDataUpgradeService.java new file mode 100644 index 0000000000..e29e74dc39 --- /dev/null +++ b/backend/src/main/java/io/metersphere/api/service/HistoricalDataUpgradeService.java @@ -0,0 +1,331 @@ +package io.metersphere.api.service; + +import com.alibaba.fastjson.JSON; +import io.metersphere.api.dto.SaveHistoricalDataUpgrade; +import io.metersphere.api.dto.automation.ScenarioStatus; +import io.metersphere.api.dto.definition.request.MsScenario; +import io.metersphere.api.dto.definition.request.MsTestElement; +import io.metersphere.api.dto.definition.request.assertions.MsAssertions; +import io.metersphere.api.dto.definition.request.controller.MsIfController; +import io.metersphere.api.dto.definition.request.extract.MsExtract; +import io.metersphere.api.dto.definition.request.processors.post.MsJSR223PostProcessor; +import io.metersphere.api.dto.definition.request.processors.pre.MsJSR223PreProcessor; +import io.metersphere.api.dto.definition.request.sampler.MsDubboSampler; +import io.metersphere.api.dto.definition.request.sampler.MsHTTPSamplerProxy; +import io.metersphere.api.dto.definition.request.sampler.MsJDBCSampler; +import io.metersphere.api.dto.definition.request.sampler.MsTCPSampler; +import io.metersphere.api.dto.definition.request.timer.MsConstantTimer; +import io.metersphere.api.dto.scenario.Scenario; +import io.metersphere.api.dto.scenario.request.*; +import io.metersphere.base.domain.*; +import io.metersphere.base.mapper.ApiScenarioMapper; +import io.metersphere.base.mapper.ApiTestMapper; +import io.metersphere.base.mapper.ext.ExtApiScenarioMapper; +import io.metersphere.commons.utils.BeanUtils; +import io.metersphere.commons.utils.DateUtils; +import io.metersphere.commons.utils.LogUtil; +import io.metersphere.commons.utils.SessionUtils; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.ibatis.session.ExecutorType; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.io.*; +import java.net.URL; +import java.util.*; + +@Service +@Transactional(rollbackFor = Exception.class) +public class HistoricalDataUpgradeService { + @Resource + private ApiTestMapper apiTestMapper; + @Resource + private ExtApiScenarioMapper extApiScenarioMapper; + @Resource + SqlSessionFactory sqlSessionFactory; + + private int getNextNum(String projectId) { + ApiScenario apiScenario = extApiScenarioMapper.getNextNum(projectId); + if (apiScenario == null) { + return 100001; + } else { + return Optional.of(apiScenario.getNum() + 1).orElse(100001); + } + } + + private MsScenario createScenario(Scenario oldScenario) { + MsScenario scenario = new MsScenario(); + scenario.setVariables(oldScenario.getVariables()); + scenario.setName(oldScenario.getName()); + scenario.setEnableCookieShare(oldScenario.isEnableCookieShare()); + scenario.setEnvironmentId(oldScenario.getEnvironmentId()); + scenario.setReferenced("Upgrade"); + scenario.setId(oldScenario.getId()); + scenario.setResourceId(UUID.randomUUID().toString()); + LinkedList testElements = new LinkedList<>(); + int index = 1; + for (Request request : oldScenario.getRequests()) { + // 条件控制器 + MsIfController ifController = null; + if (request.getController() != null && StringUtils.isNotEmpty(request.getController().getValue()) + && StringUtils.isNotEmpty(request.getController().getVariable())) { + ifController = new MsIfController(); + BeanUtils.copyBean(ifController, request.getController()); + ifController.setType("IfController"); + ifController.setName("IfController"); + ifController.setIndex(index + ""); + ifController.setResourceId(UUID.randomUUID().toString()); + } + // 等待控制器 + if (request.getTimer() != null && StringUtils.isNotEmpty(request.getTimer().getDelay())) { + MsConstantTimer constantTimer = new MsConstantTimer(); + BeanUtils.copyBean(constantTimer, request.getTimer()); + constantTimer.setType("ConstantTimer"); + constantTimer.setIndex(index + ""); + constantTimer.setResourceId(UUID.randomUUID().toString()); + testElements.add(constantTimer); + } + + MsTestElement element = null; + if (request instanceof HttpRequest) { + element = new MsHTTPSamplerProxy(); + HttpRequest request1 = (HttpRequest) request; + if (StringUtils.isEmpty(request1.getPath()) && StringUtils.isNotEmpty(request1.getUrl())) { + try { + URL urlObject = new URL(request1.getUrl()); + String envPath = StringUtils.equals(urlObject.getPath(), "/") ? "" : urlObject.getPath(); + request1.setPath(envPath); + } catch (Exception ex) { + LogUtil.error(ex.getMessage()); + } + } + BeanUtils.copyBean(element, request1); + ((MsHTTPSamplerProxy) element).setProtocol(RequestType.HTTP); + ((MsHTTPSamplerProxy) element).setArguments(request1.getParameters()); + element.setType("HTTPSamplerProxy"); + } + if (request instanceof DubboRequest) { + String requestJson = JSON.toJSONString(request); + element = JSON.parseObject(requestJson, MsDubboSampler.class); + element.setType("DubboSampler"); + } + if (request instanceof SqlRequest) { + element = new MsJDBCSampler(); + SqlRequest request1 = (SqlRequest) request; + BeanUtils.copyBean(element, request1); + element.setType("JDBCSampler"); + } + if (request instanceof TCPRequest) { + element = new MsTCPSampler(); + TCPRequest request1 = (TCPRequest) request; + BeanUtils.copyBean(element, request1); + element.setType("TCPSampler"); + } + element.setIndex(index + ""); + element.setResourceId(UUID.randomUUID().toString()); + LinkedList msTestElements = new LinkedList<>(); + // 断言规则 + if (request.getAssertions() != null && ((request.getAssertions().getDuration() != null && request.getAssertions().getDuration().getValue() > 0) || + CollectionUtils.isNotEmpty(request.getAssertions().getJsonPath()) || CollectionUtils.isNotEmpty(request.getAssertions().getJsr223()) || + CollectionUtils.isNotEmpty(request.getAssertions().getRegex()) || CollectionUtils.isNotEmpty(request.getAssertions().getXpath2()))) { + String assertions = JSON.toJSONString(request.getAssertions()); + MsAssertions msAssertions = JSON.parseObject(assertions, MsAssertions.class); + msAssertions.setType("Assertions"); + msAssertions.setIndex(index + ""); + msAssertions.setResourceId(UUID.randomUUID().toString()); + msTestElements.add(msAssertions); + } + // 提取规则 + if (request.getExtract() != null && (CollectionUtils.isNotEmpty(request.getExtract().getJson()) || + CollectionUtils.isNotEmpty(request.getExtract().getRegex()) || CollectionUtils.isNotEmpty(request.getExtract().getXpath()))) { + String extractJson = JSON.toJSONString(request.getExtract()); + MsExtract extract = JSON.parseObject(extractJson, MsExtract.class); + extract.setType("Extract"); + extract.setIndex(index + ""); + extract.setResourceId(UUID.randomUUID().toString()); + msTestElements.add(extract); + } + // 前置脚本 + if (request.getJsr223PreProcessor() != null && StringUtils.isNotEmpty(request.getJsr223PreProcessor().getScript())) { + String preJson = JSON.toJSONString(request.getJsr223PreProcessor()); + MsJSR223PreProcessor preProcessor = JSON.parseObject(preJson, MsJSR223PreProcessor.class); + preProcessor.setType("JSR223PreProcessor"); + preProcessor.setIndex(index + ""); + preProcessor.setResourceId(UUID.randomUUID().toString()); + msTestElements.add(preProcessor); + } + // 后置脚本 + if (request.getJsr223PostProcessor() != null && StringUtils.isNotEmpty(request.getJsr223PostProcessor().getScript())) { + String preJson = JSON.toJSONString(request.getJsr223PostProcessor()); + MsJSR223PostProcessor preProcessor = JSON.parseObject(preJson, MsJSR223PostProcessor.class); + preProcessor.setType("JSR223PostProcessor"); + preProcessor.setIndex(index + ""); + preProcessor.setResourceId(UUID.randomUUID().toString()); + msTestElements.add(preProcessor); + } + if (CollectionUtils.isNotEmpty(msTestElements)) { + element.setHashTree(msTestElements); + } + if (ifController != null) { + LinkedList elements = new LinkedList<>(); + elements.add(element); + ifController.setHashTree(elements); + testElements.add(ifController); + } else { + testElements.add(element); + } + index++; + } + scenario.setHashTree(testElements); + return scenario; + } + + private ApiScenarioWithBLOBs checkNameExist(Scenario oldScenario, String projectId, ApiScenarioMapper mapper) { + ApiScenarioExample example = new ApiScenarioExample(); + example.createCriteria().andIdEqualTo(oldScenario.getId()); + List list = mapper.selectByExampleWithBLOBs(example); + if (list.size() > 0) { + return list.get(0); + } + return null; + } + + private static final String BODY_FILE_DIR = "/opt/metersphere/data/body"; + + //文件的拷贝 + private static void copyFile(String sourcePath, String newPath) { + File readfile = new File(sourcePath); + File newFile = new File(newPath); + BufferedWriter bufferedWriter = null; + Writer writer = null; + FileOutputStream fileOutputStream = null; + BufferedReader bufferedReader = null; + try { + fileOutputStream = new FileOutputStream(newFile, true); + writer = new OutputStreamWriter(fileOutputStream, "UTF-8"); + bufferedWriter = new BufferedWriter(writer); + + bufferedReader = new BufferedReader(new FileReader(readfile)); + + String line = null; + while ((line = bufferedReader.readLine()) != null) { + bufferedWriter.write(line); + bufferedWriter.newLine(); + bufferedWriter.flush(); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (bufferedWriter != null) { + bufferedWriter.close(); + } + if (bufferedReader != null) { + bufferedReader.close(); + } + if (writer != null) { + writer.close(); + } + if (fileOutputStream != null) { + fileOutputStream.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + private static void copyDir(String sourcePathDir, String newPathDir) { + File start = new File(sourcePathDir); + File end = new File(newPathDir); + String[] filePath = start.list(); + if (!end.exists()) { + end.mkdir(); + } + for (String temp : filePath) { + //添加满足情况的条件 + if (new File(sourcePathDir + File.separator + temp).isFile()) { + //为文件则进行拷贝 + copyFile(sourcePathDir + File.separator + temp, newPathDir + File.separator + temp); + } + } + } + + private void createBodyFiles(String testId) { + String dir = BODY_FILE_DIR + "/" + testId; + File testDir = new File(dir); + if (testDir.exists()) { + testDir.mkdirs(); + } + copyDir(dir, BODY_FILE_DIR); + } + + private void createApiScenarioWithBLOBs(SaveHistoricalDataUpgrade saveHistoricalDataUpgrade, Scenario oldScenario, String scenarioDefinition, ApiScenarioMapper mapper) { + if (StringUtils.isEmpty(oldScenario.getName())) { + oldScenario.setName("默认名称-" + DateUtils.getTimeStr(System.currentTimeMillis())); + } + ApiScenarioWithBLOBs scenario = checkNameExist(oldScenario, saveHistoricalDataUpgrade.getProjectId(), mapper); + if (scenario != null) { + scenario.setName(oldScenario.getName()); + scenario.setProjectId(saveHistoricalDataUpgrade.getProjectId()); + scenario.setTags(scenario.getTags()); + scenario.setLevel("P0"); + scenario.setModulePath(saveHistoricalDataUpgrade.getModulePath()); + scenario.setApiScenarioModuleId(saveHistoricalDataUpgrade.getModuleId()); + scenario.setPrincipal(Objects.requireNonNull(SessionUtils.getUser()).getId()); + scenario.setStepTotal(oldScenario.getRequests().size()); + scenario.setScenarioDefinition(scenarioDefinition); + scenario.setUpdateTime(System.currentTimeMillis()); + scenario.setStatus(ScenarioStatus.Underway.name()); + scenario.setUserId(SessionUtils.getUserId()); + scenario.setNum(getNextNum(saveHistoricalDataUpgrade.getProjectId())); + mapper.updateByPrimaryKeySelective(scenario); + } else { + scenario = new ApiScenarioWithBLOBs(); + scenario.setId(oldScenario.getId()); + scenario.setName(oldScenario.getName()); + scenario.setProjectId(saveHistoricalDataUpgrade.getProjectId()); + scenario.setTags(scenario.getTags()); + scenario.setLevel("P0"); + scenario.setModulePath(saveHistoricalDataUpgrade.getModulePath()); + scenario.setApiScenarioModuleId(saveHistoricalDataUpgrade.getModuleId()); + scenario.setPrincipal(Objects.requireNonNull(SessionUtils.getUser()).getId()); + scenario.setStepTotal(oldScenario.getRequests().size()); + scenario.setScenarioDefinition(scenarioDefinition); + scenario.setCreateTime(System.currentTimeMillis()); + scenario.setUpdateTime(System.currentTimeMillis()); + scenario.setStatus(ScenarioStatus.Underway.name()); + scenario.setUserId(SessionUtils.getUserId()); + scenario.setNum(getNextNum(saveHistoricalDataUpgrade.getProjectId())); + mapper.insert(scenario); + } + } + + public String upgrade(SaveHistoricalDataUpgrade saveHistoricalDataUpgrade) { + ApiTestExample example = new ApiTestExample(); + example.createCriteria().andIdIn(saveHistoricalDataUpgrade.getTestIds()); + List blobs = apiTestMapper.selectByExampleWithBLOBs(example); + SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH); + ApiScenarioMapper mapper = sqlSession.getMapper(ApiScenarioMapper.class); + for (ApiTest test : blobs) { + // 附件迁移 + createBodyFiles(test.getId()); + + List scenarios = JSON.parseArray(test.getScenarioDefinition(), Scenario.class); + if (CollectionUtils.isNotEmpty(scenarios)) { + // 批量处理 + for (Scenario scenario : scenarios) { + MsScenario scenario1 = createScenario(scenario); + String scenarioDefinition = JSON.toJSONString(scenario1); + createApiScenarioWithBLOBs(saveHistoricalDataUpgrade, scenario, scenarioDefinition, mapper); + } + } + } + sqlSession.flushStatements(); + return null; + } +} diff --git a/frontend/src/business/components/api/automation/scenario/ApiComponent.vue b/frontend/src/business/components/api/automation/scenario/ApiComponent.vue index 918abd1d24..7390d6edd0 100644 --- a/frontend/src/business/components/api/automation/scenario/ApiComponent.vue +++ b/frontend/src/business/components/api/automation/scenario/ApiComponent.vue @@ -58,8 +58,8 @@

{{$t('api_test.definition.request.req_param')}}

- - + +

{{$t('api_test.definition.request.res_param')}}

diff --git a/frontend/src/business/components/api/definition/components/assertion/ApiAssertionsEdit.vue b/frontend/src/business/components/api/definition/components/assertion/ApiAssertionsEdit.vue index b2fdd70c8c..3b6b8849e1 100644 --- a/frontend/src/business/components/api/definition/components/assertion/ApiAssertionsEdit.vue +++ b/frontend/src/business/components/api/definition/components/assertion/ApiAssertionsEdit.vue @@ -55,7 +55,7 @@ import MsApiAssertionRegex from "./ApiAssertionRegex"; import MsApiAssertionDuration from "./ApiAssertionDuration"; import MsApiAssertionJsonPath from "./ApiAssertionJsonPath"; - import MsApiAssertionJsr223 from "@/business/components/api/test/components/assertion/ApiAssertionJsr223"; + import MsApiAssertionJsr223 from "./ApiAssertionJsr223"; import MsApiAssertionXPath2 from "./ApiAssertionXPath2"; export default { diff --git a/frontend/src/business/components/api/definition/components/request/database/BasisParameters.vue b/frontend/src/business/components/api/definition/components/request/database/BasisParameters.vue index 3de55bde9a..9402456eee 100644 --- a/frontend/src/business/components/api/definition/components/request/database/BasisParameters.vue +++ b/frontend/src/business/components/api/definition/components/request/database/BasisParameters.vue @@ -63,18 +63,19 @@ -
- - - - - - - - - +
+
+ + + + + + + + +
diff --git a/frontend/src/business/components/api/definition/components/request/dubbo/BasisParameters.vue b/frontend/src/business/components/api/definition/components/request/dubbo/BasisParameters.vue index 9e3057827b..287cf0d22f 100644 --- a/frontend/src/business/components/api/definition/components/request/dubbo/BasisParameters.vue +++ b/frontend/src/business/components/api/definition/components/request/dubbo/BasisParameters.vue @@ -41,19 +41,19 @@
- -
- - - - - - - - - +
+
+ + + + + + + + +
diff --git a/frontend/src/business/components/api/test/ApiTestList.vue b/frontend/src/business/components/api/test/ApiTestList.vue index 35785fddbc..941b67b0aa 100644 --- a/frontend/src/business/components/api/test/ApiTestList.vue +++ b/frontend/src/business/components/api/test/ApiTestList.vue @@ -7,7 +7,7 @@ :title="$t('commons.test')" @create="create" :createTip="$t('load_test.create')" :runTip="$t('load_test.run')" :show-run="true" - @runTest="runTest"/> + @runTest="runTest" @historicalDataUpgrade="historicalDataUpgrade"/> @@ -54,7 +54,8 @@ - + @@ -72,13 +73,14 @@ import {TEST_CONFIGS} from "../../common/components/search/search-components"; import {ApiEvent, LIST_CHANGE} from "@/business/components/common/head/ListEvent"; import ApiCopyDialog from "./components/ApiCopyDialog"; + import MsUpgrade from "./Upgrade"; export default { components: { ApiCopyDialog, OneClickOperation, MsTableOperators, - MsApiTestStatus, MsMainContainer, MsContainer, MsTableHeader, MsTablePagination, MsTableOperator + MsApiTestStatus, MsMainContainer, MsContainer, MsTableHeader, MsTablePagination, MsTableOperator, MsUpgrade }, data() { return { @@ -204,6 +206,13 @@ _filter(filters, this.condition); this.init(); }, + historicalDataUpgrade() { + if (this.selectIds.size < 1) { + this.$warning(this.$t('test_track.plan_view.select_manipulate')); + } else { + this.$refs.upgrade.openOneClickOperation(); + } + } }, created() { this.init(); diff --git a/frontend/src/business/components/api/test/Upgrade.vue b/frontend/src/business/components/api/test/Upgrade.vue new file mode 100644 index 0000000000..5e0f9c2d92 --- /dev/null +++ b/frontend/src/business/components/api/test/Upgrade.vue @@ -0,0 +1,109 @@ + + + + + diff --git a/frontend/src/business/components/common/components/MsTableHeader.vue b/frontend/src/business/components/common/components/MsTableHeader.vue index 09af2c28de..00c0f9d991 100644 --- a/frontend/src/business/components/common/components/MsTableHeader.vue +++ b/frontend/src/business/components/common/components/MsTableHeader.vue @@ -13,6 +13,8 @@ + @@ -84,6 +86,9 @@ }, runTest() { this.$emit('runTest') + }, + historicalDataUpgrade() { + this.$emit('historicalDataUpgrade'); } }, computed: {