From 86113caae11a645c109bd404128357a78056ffcd Mon Sep 17 00:00:00 2001 From: "Captain.B" Date: Thu, 19 Mar 2020 18:53:41 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E5=A4=9A=E6=96=87=E4=BB=B6=E4=B8=8A?= =?UTF-8?q?=E4=BC=A0=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../commons/constants/FileType.java | 2 +- .../controller/LoadTestController.java | 10 +-- .../request/testplan/EditTestPlanRequest.java | 13 +++ .../io/metersphere/service/FileService.java | 21 ++++- .../service/FuctionalTestService.java | 66 +++++++-------- .../metersphere/service/LoadTestService.java | 66 ++++++++++----- .../plan/EditPerformanceTestPlan.vue | 17 ++-- .../components/PerformanceBasicConfig.vue | 81 +++++++++++-------- frontend/src/i18n/en-US.js | 4 +- frontend/src/i18n/zh-CN.js | 4 +- 10 files changed, 175 insertions(+), 109 deletions(-) diff --git a/backend/src/main/java/io/metersphere/commons/constants/FileType.java b/backend/src/main/java/io/metersphere/commons/constants/FileType.java index 6236b13cba..c091cc4a96 100644 --- a/backend/src/main/java/io/metersphere/commons/constants/FileType.java +++ b/backend/src/main/java/io/metersphere/commons/constants/FileType.java @@ -1,5 +1,5 @@ package io.metersphere.commons.constants; public enum FileType { - JMX + JMX, CSV } diff --git a/backend/src/main/java/io/metersphere/controller/LoadTestController.java b/backend/src/main/java/io/metersphere/controller/LoadTestController.java index dbe0e7c89e..5b1466e248 100644 --- a/backend/src/main/java/io/metersphere/controller/LoadTestController.java +++ b/backend/src/main/java/io/metersphere/controller/LoadTestController.java @@ -50,17 +50,17 @@ public class LoadTestController { @PostMapping(value = "/save", consumes = {"multipart/form-data"}) public String save( @RequestPart("request") SaveTestPlanRequest request, - @RequestPart(value = "file") MultipartFile file + @RequestPart(value = "file") List files ) { - return loadTestService.save(request, file); + return loadTestService.save(request, files); } @PostMapping(value = "/edit", consumes = {"multipart/form-data"}) public String edit( @RequestPart("request") EditTestPlanRequest request, - @RequestPart(value = "file", required = false) MultipartFile file + @RequestPart(value = "file", required = false) List files ) { - return loadTestService.edit(request, file); + return loadTestService.edit(request, files); } @GetMapping("/get/{testId}") @@ -89,7 +89,7 @@ public class LoadTestController { } @GetMapping("/file/metadata/{testId}") - public FileMetadata getFileMetadata(@PathVariable String testId) { + public List getFileMetadata(@PathVariable String testId) { return fileService.getFileMetadataByTestId(testId); } diff --git a/backend/src/main/java/io/metersphere/controller/request/testplan/EditTestPlanRequest.java b/backend/src/main/java/io/metersphere/controller/request/testplan/EditTestPlanRequest.java index dbb6e20560..1d59fcd4ab 100644 --- a/backend/src/main/java/io/metersphere/controller/request/testplan/EditTestPlanRequest.java +++ b/backend/src/main/java/io/metersphere/controller/request/testplan/EditTestPlanRequest.java @@ -1,4 +1,17 @@ package io.metersphere.controller.request.testplan; +import io.metersphere.base.domain.FileMetadata; + +import java.util.List; + public class EditTestPlanRequest extends TestPlanRequest { + private List updatedFileList; + + public List getUpdatedFileList() { + return updatedFileList; + } + + public void setUpdatedFileList(List updatedFileList) { + this.updatedFileList = updatedFileList; + } } diff --git a/backend/src/main/java/io/metersphere/service/FileService.java b/backend/src/main/java/io/metersphere/service/FileService.java index f3a854a34f..7db2904398 100644 --- a/backend/src/main/java/io/metersphere/service/FileService.java +++ b/backend/src/main/java/io/metersphere/service/FileService.java @@ -29,7 +29,7 @@ public class FileService { return fileContent.getFile(); } - public FileMetadata getFileMetadataByTestId(String testId) { + public List getFileMetadataByTestId(String testId) { LoadTestFileExample loadTestFileExample = new LoadTestFileExample(); loadTestFileExample.createCriteria().andTestIdEqualTo(testId); final List loadTestFiles = loadTestFileMapper.selectByExample(loadTestFileExample); @@ -37,8 +37,10 @@ public class FileService { if (CollectionUtils.isEmpty(loadTestFiles)) { return null; } - - return fileMetadataMapper.selectByPrimaryKey(loadTestFiles.get(0).getFileId()); + List fileIds = loadTestFiles.stream().map(LoadTestFile::getFileId).collect(Collectors.toList()); + FileMetadataExample example = new FileMetadataExample(); + example.createCriteria().andIdIn(fileIds); + return fileMetadataMapper.selectByExample(example); } public FileMetadata getFucFileMetadataByTestId(String testId) { @@ -74,4 +76,17 @@ public class FileService { fileContentMapper.deleteByExample(fileContentExample); } } + + public void deleteFileByIds(List ids) { + if (CollectionUtils.isEmpty(ids)) { + return; + } + FileMetadataExample example = new FileMetadataExample(); + example.createCriteria().andIdIn(ids); + fileMetadataMapper.deleteByExample(example); + + FileContentExample example2 = new FileContentExample(); + example2.createCriteria().andFileIdIn(ids); + fileContentMapper.deleteByExample(example2); + } } \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/service/FuctionalTestService.java b/backend/src/main/java/io/metersphere/service/FuctionalTestService.java index aaf1f5e736..16564d5e73 100644 --- a/backend/src/main/java/io/metersphere/service/FuctionalTestService.java +++ b/backend/src/main/java/io/metersphere/service/FuctionalTestService.java @@ -138,39 +138,39 @@ public class FuctionalTestService { public void run(RunTestPlanRequest request) { final FucTestWithBLOBs fucTest = fucTestMapper.selectByPrimaryKey(request.getId()); - if (fucTest == null) { - MSException.throwException("无法运行测试,未找到测试:" + request.getId()); - } - - final FileMetadata fileMetadata = fileService.getFileMetadataByTestId(request.getId()); - if (fileMetadata == null) { - MSException.throwException("无法运行测试,无法获取测试文件元信息,测试ID:" + request.getId()); - } - - final FileContent fileContent = fileService.getFileContent(fileMetadata.getId()); - if (fileContent == null) { - MSException.throwException("无法运行测试,无法获取测试文件内容,测试ID:" + request.getId()); - } - - System.out.println("开始运行:" + fucTest.getName()); - final Engine engine = EngineFactory.createEngine(fileMetadata.getType()); - if (engine == null) { - MSException.throwException(String.format("无法运行测试,未识别测试文件类型,测试ID:%s,文件类型:%s", - request.getId(), - fileMetadata.getType())); - } - - boolean init = true; - try { -// init = engine.init(EngineFactory.createContext(fucTest, fileMetadata, fileContent)); - } catch (Exception e) { - MSException.throwException(e); - } - if (!init) { - MSException.throwException(String.format("无法运行测试,初始化运行环境失败,测试ID:%s", request.getId())); - } - -// engine.start(); +// if (fucTest == null) { +// MSException.throwException("无法运行测试,未找到测试:" + request.getId()); +// } +// +// final List fileMetadataList = fileService.getFileMetadataByTestId(request.getId()); +// if (fileMetadataList == null) { +// MSException.throwException("无法运行测试,无法获取测试文件元信息,测试ID:" + request.getId()); +// } +// +// final FileContent fileContent = fileService.getFileContent(fileMetadata.getId()); +// if (fileContent == null) { +// MSException.throwException("无法运行测试,无法获取测试文件内容,测试ID:" + request.getId()); +// } +// +// System.out.println("开始运行:" + fucTest.getName()); +// final Engine engine = EngineFactory.createEngine(fileMetadata.getType()); +// if (engine == null) { +// MSException.throwException(String.format("无法运行测试,未识别测试文件类型,测试ID:%s,文件类型:%s", +// request.getId(), +// fileMetadata.getType())); +// } +// +// boolean init = true; +// try { +//// init = engine.init(EngineFactory.createContext(fucTest, fileMetadata, fileContent)); +// } catch (Exception e) { +// MSException.throwException(e); +// } +// if (!init) { +// MSException.throwException(String.format("无法运行测试,初始化运行环境失败,测试ID:%s", request.getId())); +// } +// +//// engine.start(); /// todo:通过调用stop方法能够停止正在运行的engine,但是如果部署了多个backend实例,页面发送的停止请求如何定位到具体的engine } diff --git a/backend/src/main/java/io/metersphere/service/LoadTestService.java b/backend/src/main/java/io/metersphere/service/LoadTestService.java index e5d9f94121..7c906af740 100644 --- a/backend/src/main/java/io/metersphere/service/LoadTestService.java +++ b/backend/src/main/java/io/metersphere/service/LoadTestService.java @@ -7,6 +7,7 @@ import io.metersphere.base.mapper.LoadTestFileMapper; import io.metersphere.base.mapper.LoadTestMapper; import io.metersphere.base.mapper.ext.ExtLoadTestMapper; import io.metersphere.commons.constants.EngineType; +import io.metersphere.commons.constants.FileType; import io.metersphere.commons.constants.TestStatus; import io.metersphere.commons.exception.MSException; import io.metersphere.commons.utils.LogUtil; @@ -15,6 +16,8 @@ import io.metersphere.dto.LoadTestDTO; import io.metersphere.engine.Engine; import io.metersphere.engine.EngineFactory; import io.metersphere.i18n.Translator; +import org.apache.commons.collections4.ListUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; @@ -25,6 +28,7 @@ import java.io.IOException; import java.util.List; import java.util.Optional; import java.util.UUID; +import java.util.stream.Collectors; @Service @Transactional(rollbackFor = Exception.class) @@ -52,20 +56,18 @@ public class LoadTestService { fileService.deleteFileByTestId(request.getId()); } - public String save(SaveTestPlanRequest request, MultipartFile file) { - if (file == null) { + public String save(SaveTestPlanRequest request, List files) { + if (files == null) { throw new IllegalArgumentException(Translator.get("file_cannot_be_null")); } - - final FileMetadata fileMetadata = saveFile(file); - final LoadTestWithBLOBs loadTest = saveLoadTest(request); - - LoadTestFile loadTestFile = new LoadTestFile(); - loadTestFile.setTestId(loadTest.getId()); - loadTestFile.setFileId(fileMetadata.getId()); - loadTestFileMapper.insert(loadTestFile); - + files.forEach(file -> { + final FileMetadata fileMetadata = saveFile(file); + LoadTestFile loadTestFile = new LoadTestFile(); + loadTestFile.setTestId(loadTest.getId()); + loadTestFile.setFileId(fileMetadata.getId()); + loadTestFileMapper.insert(loadTestFile); + }); return loadTest.getId(); } @@ -98,7 +100,8 @@ public class LoadTestService { fileMetadata.setSize(file.getSize()); fileMetadata.setCreateTime(System.currentTimeMillis()); fileMetadata.setUpdateTime(System.currentTimeMillis()); - fileMetadata.setType("JMX"); + FileType fileType = getFileType(fileMetadata.getName()); + fileMetadata.setType(fileType.name()); // TODO engine 选择 fileMetadata.setEngine(EngineType.DOCKER.name()); fileMetadataMapper.insert(fileMetadata); @@ -115,15 +118,30 @@ public class LoadTestService { return fileMetadata; } - public String edit(EditTestPlanRequest request, MultipartFile file) { + private FileType getFileType(String filename) { + int s = filename.lastIndexOf(".") + 1; + String type = filename.substring(s); + return FileType.valueOf(type.toUpperCase()); + } + + public String edit(EditTestPlanRequest request, List files) { // 新选择了一个文件,删除原来的文件 - if (file != null) { - fileService.deleteFileByTestId(request.getId()); - final FileMetadata fileMetadata = saveFile(file); - LoadTestFile loadTestFile = new LoadTestFile(); - loadTestFile.setTestId(request.getId()); - loadTestFile.setFileId(fileMetadata.getId()); - loadTestFileMapper.insert(loadTestFile); + if (files != null) { + List updatedFiles = request.getUpdatedFileList(); + List originFiles = fileService.getFileMetadataByTestId(request.getId()); + List updatedFileIds = updatedFiles.stream().map(FileMetadata::getId).collect(Collectors.toList()); + List originFileIds = originFiles.stream().map(FileMetadata::getId).collect(Collectors.toList()); + // 相减 + List deleteFileIds = ListUtils.subtract(originFileIds, updatedFileIds); + fileService.deleteFileByIds(deleteFileIds); + + files.forEach(file -> { + final FileMetadata fileMetadata = saveFile(file); + LoadTestFile loadTestFile = new LoadTestFile(); + loadTestFile.setTestId(request.getId()); + loadTestFile.setFileId(fileMetadata.getId()); + loadTestFileMapper.insert(loadTestFile); + }); } final LoadTestWithBLOBs loadTest = loadTestMapper.selectByPrimaryKey(request.getId()); @@ -149,10 +167,14 @@ public class LoadTestService { MSException.throwException(Translator.get("run_load_test_not_found") + request.getId()); } - final FileMetadata fileMetadata = fileService.getFileMetadataByTestId(request.getId()); - if (fileMetadata == null) { + final List fileMetadataList = fileService.getFileMetadataByTestId(request.getId()); + if (CollectionUtils.isEmpty(fileMetadataList)) { MSException.throwException(Translator.get("run_load_test_file_not_found") + request.getId()); } + FileMetadata fileMetadata = fileMetadataList.stream().filter(f -> StringUtils.equalsIgnoreCase(f.getType(), "JMX")) + .findFirst().orElseGet(() -> { + throw new RuntimeException(Translator.get("run_load_test_file_not_found") + request.getId()); + }); final FileContent fileContent = fileService.getFileContent(fileMetadata.getId()); if (fileContent == null) { diff --git a/frontend/src/business/components/performance/plan/EditPerformanceTestPlan.vue b/frontend/src/business/components/performance/plan/EditPerformanceTestPlan.vue index 732e17c91a..672a20323a 100644 --- a/frontend/src/business/components/performance/plan/EditPerformanceTestPlan.vue +++ b/frontend/src/business/components/performance/plan/EditPerformanceTestPlan.vue @@ -85,7 +85,7 @@ let testId = to.path.split('/')[4]; // find testId if (testId) { this.$get('/testplan/get/' + testId, response => { - if(response.data){ + if (response.data) { this.testPlan = response.data; } }); @@ -151,9 +151,13 @@ let formData = new FormData(); let url = this.testPlan.id ? this.editPath : this.savePath; - if (!this.testPlan.file.id) { - formData.append("file", this.testPlan.file); + if (this.$refs.basicConfig.uploadList.length > 0) { + this.$refs.basicConfig.uploadList.forEach(f => { + formData.append("file", f); + }); } + // 基本配置 + this.testPlan.updatedFileList = this.$refs.basicConfig.updatedFileList(); // 压力配置 this.testPlan.loadConfiguration = JSON.stringify(this.$refs.pressureConfig.convertProperty()); // 高级配置 @@ -199,12 +203,7 @@ return false; } - if (!this.testPlan.file) { - this.$message({ - message: this.$t('load_test.jmx_is_null'), - type: 'error' - }); - + if (!this.$refs.basicConfig.validConfig()) { return false; } diff --git a/frontend/src/business/components/performance/plan/components/PerformanceBasicConfig.vue b/frontend/src/business/components/performance/plan/components/PerformanceBasicConfig.vue index 02019d2654..006501cf40 100644 --- a/frontend/src/business/components/performance/plan/components/PerformanceBasicConfig.vue +++ b/frontend/src/business/components/performance/plan/components/PerformanceBasicConfig.vue @@ -1,10 +1,11 @@