From bf71b37cf4e08fa25782d3f5d42d6f0432b09df7 Mon Sep 17 00:00:00 2001 From: wenyann <64353056+wenyann@users.noreply.github.com> Date: Thu, 13 Aug 2020 19:09:02 +0800 Subject: [PATCH 01/27] =?UTF-8?q?style:=20=E6=B5=8B=E8=AF=95=E6=8A=A5?= =?UTF-8?q?=E5=91=8A=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../track/domain/ReportResultComponent.java | 20 +++++ .../dto/TestCaseReportModuleResultDTO.java | 5 ++ .../TemplateComponent/DefectListComponent.vue | 80 +++++++++++++++++++ .../TemplateComponent/TemplateComponent.vue | 5 +- .../TemplateComponent/TestResultComponent.vue | 66 ++++++++++++--- .../report/TestCaseReportTemplateEdit.vue | 10 ++- .../comonents/report/TestCaseReportView.vue | 4 +- frontend/src/i18n/en-US.js | 2 + frontend/src/i18n/zh-CN.js | 2 + frontend/src/i18n/zh-TW.js | 2 + 10 files changed, 181 insertions(+), 15 deletions(-) create mode 100644 frontend/src/business/components/track/plan/view/comonents/report/TemplateComponent/DefectListComponent.vue diff --git a/backend/src/main/java/io/metersphere/track/domain/ReportResultComponent.java b/backend/src/main/java/io/metersphere/track/domain/ReportResultComponent.java index 5f24e1a3b7..28c69361a3 100644 --- a/backend/src/main/java/io/metersphere/track/domain/ReportResultComponent.java +++ b/backend/src/main/java/io/metersphere/track/domain/ReportResultComponent.java @@ -86,12 +86,32 @@ public class ReportResultComponent extends ReportComponent { moduleResult.setCaseCount(0); moduleResult.setPassCount(0); moduleResult.setIssuesCount(0); + moduleResult.setFailureCount(0); + moduleResult.setBlockingCount(0); + moduleResult.setPrepareCount(0); + moduleResult.setSkipCount(0); + moduleResult.setUnderwayCount(0); moduleResult.setModuleId(rootNodeId); } moduleResult.setCaseCount(moduleResult.getCaseCount() + 1); if (StringUtils.equals(testCase.getStatus(), TestPlanTestCaseStatus.Pass.name())) { moduleResult.setPassCount(moduleResult.getPassCount() + 1); } + if (StringUtils.equals(testCase.getStatus(), TestPlanTestCaseStatus.Prepare.name())) { + moduleResult.setPrepareCount(moduleResult.getPrepareCount() + 1); + } + if (StringUtils.equals(testCase.getStatus(), TestPlanTestCaseStatus.Underway.name())) { + moduleResult.setUnderwayCount(moduleResult.getUnderwayCount() + 1); + } + if (StringUtils.equals(testCase.getStatus(), TestPlanTestCaseStatus.Failure.name())) { + moduleResult.setFailureCount(moduleResult.getFailureCount() + 1); + } + if (StringUtils.equals(testCase.getStatus(), TestPlanTestCaseStatus.Skip.name())) { + moduleResult.setSkipCount(moduleResult.getSkipCount() + 1); + } + if (StringUtils.equals(testCase.getStatus(), TestPlanTestCaseStatus.Blocking.name())) { + moduleResult.setBlockingCount(moduleResult.getBlockingCount() + 1); + } if (StringUtils.isNotBlank(testCase.getIssues())) { if (JSON.parseObject(testCase.getIssues()).getBoolean("hasIssues")) { moduleResult.setIssuesCount(moduleResult.getIssuesCount() + 1); diff --git a/backend/src/main/java/io/metersphere/track/dto/TestCaseReportModuleResultDTO.java b/backend/src/main/java/io/metersphere/track/dto/TestCaseReportModuleResultDTO.java index 59b82f0c50..00e05f9486 100644 --- a/backend/src/main/java/io/metersphere/track/dto/TestCaseReportModuleResultDTO.java +++ b/backend/src/main/java/io/metersphere/track/dto/TestCaseReportModuleResultDTO.java @@ -12,4 +12,9 @@ public class TestCaseReportModuleResultDTO { private Integer passCount; private Double passRate; private Integer issuesCount; + private Integer prepareCount; + private Integer skipCount; + private Integer failureCount; + private Integer blockingCount; + private Integer underwayCount; } diff --git a/frontend/src/business/components/track/plan/view/comonents/report/TemplateComponent/DefectListComponent.vue b/frontend/src/business/components/track/plan/view/comonents/report/TemplateComponent/DefectListComponent.vue new file mode 100644 index 0000000000..02acec71b1 --- /dev/null +++ b/frontend/src/business/components/track/plan/view/comonents/report/TemplateComponent/DefectListComponent.vue @@ -0,0 +1,80 @@ + + + + + diff --git a/frontend/src/business/components/track/plan/view/comonents/report/TemplateComponent/TemplateComponent.vue b/frontend/src/business/components/track/plan/view/comonents/report/TemplateComponent/TemplateComponent.vue index 911bddafe9..1d283a5e61 100644 --- a/frontend/src/business/components/track/plan/view/comonents/report/TemplateComponent/TemplateComponent.vue +++ b/frontend/src/business/components/track/plan/view/comonents/report/TemplateComponent/TemplateComponent.vue @@ -7,6 +7,7 @@ + @@ -16,6 +17,7 @@ + @@ -28,10 +30,11 @@ import TestResultChartComponent from "./TestResultChartComponent"; import RichTextComponent from "./RichTextComponent"; import FailureResultComponent from "./FailureResultComponent"; + import DefectListComponent from "./DefectListComponent"; export default { name: "TemplateComponent", components: { - FailureResultComponent, + FailureResultComponent,DefectListComponent, RichTextComponent, TestResultChartComponent, TestResultComponent, BaseInfoComponent}, props: { preview: { diff --git a/frontend/src/business/components/track/plan/view/comonents/report/TemplateComponent/TestResultComponent.vue b/frontend/src/business/components/track/plan/view/comonents/report/TemplateComponent/TestResultComponent.vue index c65c738aa5..8bca789386 100644 --- a/frontend/src/business/components/track/plan/view/comonents/report/TemplateComponent/TestResultComponent.vue +++ b/frontend/src/business/components/track/plan/view/comonents/report/TemplateComponent/TestResultComponent.vue @@ -18,6 +18,36 @@ :label="$t('test_track.plan_view.case_count')" width="180"> + + + + + + + + + + + + @@ -50,19 +80,37 @@ moduleName: this.$t('test_track.module.module') + '1', caseCount: '14', passRate: 10.8, - issuesCount: 3 + issuesCount: 3, + passCount:0, + failureCount:0, + blockingCount:0, + skipCount:0, + underwayCount:0, + prepareCount:0 }, { - moduleName: this.$t('test_track.module.module') + '2', - caseCount: '24', - passRate: 40, - issuesCount: 6 + moduleName: this.$t('test_track.module.module') + '1', + caseCount: '14', + passRate: 10.8, + issuesCount: 3, + passCount:0, + failureCount:0, + blockingCount:0, + skipCount:0, + underwayCount:0, + prepareCount:0 }, { - moduleName: this.$t('test_track.module.module') + '3', - caseCount: '50', - passRate: 76.9, - issuesCount: 8 + moduleName: this.$t('test_track.module.module') + '1', + caseCount: '14', + passRate: 10.8, + issuesCount: 3, + passCount:0, + failureCount:0, + blockingCount:0, + skipCount:0, + underwayCount:0, + prepareCount:0 } ] } diff --git a/frontend/src/business/components/track/plan/view/comonents/report/TestCaseReportTemplateEdit.vue b/frontend/src/business/components/track/plan/view/comonents/report/TestCaseReportTemplateEdit.vue index 87a24f035b..d5a022954b 100644 --- a/frontend/src/business/components/track/plan/view/comonents/report/TestCaseReportTemplateEdit.vue +++ b/frontend/src/business/components/track/plan/view/comonents/report/TestCaseReportTemplateEdit.vue @@ -77,10 +77,11 @@ [2, { name: this.$t('test_track.plan_view.test_result'), id: 2 , type: 'system'}], [3, { name: this.$t('test_track.plan_view.result_distribution'), id: 3 ,type: 'system'}], [4, { name: this.$t('test_track.plan_view.failure_case'), id: 4 ,type: 'system'}], - [5, { name: this.$t('test_track.plan_view.custom_component'), id: 5 ,type: 'custom'}] + [5, { name: this.$t('test_track.plan_view.defect_list'), id: 5 ,type: 'system'}], + [6, { name: this.$t('test_track.plan_view.custom_component'), id:6,type: 'custom'}] ] ), - components: [5], + components: [6], previews: [], template: {}, isReport: false @@ -109,12 +110,12 @@ this.template = { name: '', content: { - components: [1,2,3,4,5], + components: [1,2,3,4,5,6], customComponent: new Map() } }; this.previews = []; - this.components = [5]; + this.components = [6]; if (id) { this.type = 'edit'; this.getTemplateById(id); @@ -144,6 +145,7 @@ } } }); + }, handleClose() { window.removeEventListener('popstate', this.goBack, false); diff --git a/frontend/src/business/components/track/plan/view/comonents/report/TestCaseReportView.vue b/frontend/src/business/components/track/plan/view/comonents/report/TestCaseReportView.vue index a9f7514615..2689c0836a 100644 --- a/frontend/src/business/components/track/plan/view/comonents/report/TestCaseReportView.vue +++ b/frontend/src/business/components/track/plan/view/comonents/report/TestCaseReportView.vue @@ -69,7 +69,8 @@ [2, { name: this.$t('test_track.plan_view.test_result'), id: 2 , type: 'system'}], [3, { name: this.$t('test_track.plan_view.result_distribution'), id: 3 ,type: 'system'}], [4, { name: this.$t('test_track.plan_view.failure_case'), id: 4 ,type: 'system'}], - [5, { name: this.$t('test_track.plan_view.custom_component'), id: 5 ,type: 'custom'}] + [5, { name: this.$t('test_track.plan_view.defect_list'), id: 5 ,type: 'system'}], + [6, { name: this.$t('test_track.plan_view.custom_component'), id: 6 ,type: 'custom'}] ] ), isTestManagerOrTestUser: false @@ -166,6 +167,7 @@ getMetric() { this.result = this.$get('/test/plan/get/metric/' + this.planId, response => { this.metric = response.data; + console.log(this.metric) if (!this.metric.failureTestCases) { this.metric.failureTestCases = []; } diff --git a/frontend/src/i18n/en-US.js b/frontend/src/i18n/en-US.js index 2d07634630..b44b6b3059 100644 --- a/frontend/src/i18n/en-US.js +++ b/frontend/src/i18n/en-US.js @@ -601,6 +601,7 @@ export default { delete_confirm: "Confirm delete module:", delete_all_resource: "and all submodules and test cases under the module", module: "Module", + title:"Title" }, home: { recent_test: "Recent test", @@ -640,6 +641,7 @@ export default { result_distribution: "Result distribution", custom_component: "Custom", create_report: "Create report", + defect_list:"Defect list", view_report: "View report", component_library: "Component library", component_library_tip: "Drag and drop the component from the component library, add to the right, preview the report effect, only one can be added per system component.", diff --git a/frontend/src/i18n/zh-CN.js b/frontend/src/i18n/zh-CN.js index bf943918e5..9467935821 100644 --- a/frontend/src/i18n/zh-CN.js +++ b/frontend/src/i18n/zh-CN.js @@ -606,6 +606,7 @@ export default { delete_confirm: "确认删除模块: ", delete_all_resource: "以及模块下所有子模块和测试用例", module: "模块", + title:"标题", }, home: { recent_test: "最近测试", @@ -644,6 +645,7 @@ export default { test_result: "测试结果", result_distribution: "测试结果分布", custom_component: "自定义模块", + defect_list:"缺陷列表", create_report: "创建测试报告", view_report: "查看测试报告", component_library: "组件库", diff --git a/frontend/src/i18n/zh-TW.js b/frontend/src/i18n/zh-TW.js index 1a0024912a..41a7c70dd4 100644 --- a/frontend/src/i18n/zh-TW.js +++ b/frontend/src/i18n/zh-TW.js @@ -601,6 +601,7 @@ export default { delete_confirm: "確認刪除模塊: ", delete_all_resource: "以及模塊下所有子模塊和測試用例", module: "模塊", + title:"標題", }, home: { recent_test: "最近測試", @@ -640,6 +641,7 @@ export default { result_distribution: "測試結果分布", custom_component: "自定義模塊", create_report: "創建測試報告", + defect_list:"缺陷清單", view_report: "查看測試報告", component_library: "組件庫", component_library_tip: "拖拽組件庫中組件,添加至右側,預覽報告效果,每個系統組件只能添加壹個。", From 53ba3dd363128f438002c937b4e98826f6942294 Mon Sep 17 00:00:00 2001 From: wangzhen-fit2cloud Date: Fri, 14 Aug 2020 14:05:04 +0800 Subject: [PATCH 02/27] =?UTF-8?q?docs:=20=E5=9C=A8=20readme=20=E4=B8=AD?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=87=B4=E8=B0=A2=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 6c3febbb0b..b187c2dcdd 100755 --- a/README.md +++ b/README.md @@ -187,6 +187,12 @@ v1.1.0 是 v1.0.0 之后的功能版本。 - 基础设施: [Docker](https://www.docker.com/), [Kubernetes](https://kubernetes.io/) - 测试引擎: [JMeter](https://jmeter.apache.org/) +## 致谢 + +- [BlazeMeter](https://www.blazemeter.com/):感谢 BlazeMeter 提供的设计思路 +- [JMeter](https://jmeter.apache.org/):MeterSphere 使用了 JMeter 作为测试引擎 +- [Element](https://element.eleme.cn/#/):感谢 Element 提供的优秀组件库 + ## 加入 MeterSphere 团队 我们正在招聘 MeterSphere 技术布道师,一起打造开源明星项目,请发简历到 metersphere@fit2cloud.com From 7f9d8235942a07ee18ec344f20a8f32928d203ff Mon Sep 17 00:00:00 2001 From: wangzhen-fit2cloud Date: Fri, 14 Aug 2020 14:22:46 +0800 Subject: [PATCH 03/27] =?UTF-8?q?refactor:=20=E6=9B=B4=E6=96=B0=20readme?= =?UTF-8?q?=20=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b187c2dcdd..245a2a28ca 100755 --- a/README.md +++ b/README.md @@ -189,9 +189,9 @@ v1.1.0 是 v1.0.0 之后的功能版本。 ## 致谢 -- [BlazeMeter](https://www.blazemeter.com/):感谢 BlazeMeter 提供的设计思路 -- [JMeter](https://jmeter.apache.org/):MeterSphere 使用了 JMeter 作为测试引擎 -- [Element](https://element.eleme.cn/#/):感谢 Element 提供的优秀组件库 +- [BlazeMeter](https://www.blazemeter.com/):感谢 BlazeMeter 提供的设计思路 +- [JMeter](https://jmeter.apache.org/):MeterSphere 使用了 JMeter 作为测试引擎 +- [Element](https://element.eleme.cn/#/):感谢 Element 提供的优秀组件库 ## 加入 MeterSphere 团队 From 7e6530a591ae3198b891ecc30e860d3dcbf7af5a Mon Sep 17 00:00:00 2001 From: wenyann <64353056+wenyann@users.noreply.github.com> Date: Fri, 14 Aug 2020 14:33:02 +0800 Subject: [PATCH 04/27] =?UTF-8?q?style(=E6=B5=8B=E8=AF=95=E8=B7=9F?= =?UTF-8?q?=E8=B8=AA):=20=E6=B5=8B=E8=AF=95=E6=8A=A5=E5=91=8A=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TemplateComponent/DefectListComponent.vue | 38 ++++++++++--------- .../TemplateComponent/TemplateComponent.vue | 2 +- .../comonents/report/TestCaseReportView.vue | 4 +- frontend/src/i18n/en-US.js | 6 ++- frontend/src/i18n/zh-CN.js | 6 ++- frontend/src/i18n/zh-TW.js | 6 ++- 6 files changed, 39 insertions(+), 23 deletions(-) diff --git a/frontend/src/business/components/track/plan/view/comonents/report/TemplateComponent/DefectListComponent.vue b/frontend/src/business/components/track/plan/view/comonents/report/TemplateComponent/DefectListComponent.vue index 02acec71b1..d04a69d014 100644 --- a/frontend/src/business/components/track/plan/view/comonents/report/TemplateComponent/DefectListComponent.vue +++ b/frontend/src/business/components/track/plan/view/comonents/report/TemplateComponent/DefectListComponent.vue @@ -2,7 +2,8 @@ @@ -58,16 +57,19 @@ name: "DefectListComponent", components: {StatusTableItem, MethodTableItem, TypeTableItem, PriorityTableItem, CommonComponent}, props: { - failureTestCases: { + defectList: { type: Array, default() { return [ { + id: "1023", + module: "模块e", title: 'testCase1', + description: "第一个模块测试", + status: "接受/处理", + currentOwner: "Andy", + created: "2010.3.3", }, - { - title: 'testCase1', - } ] } } diff --git a/frontend/src/business/components/track/plan/view/comonents/report/TemplateComponent/TemplateComponent.vue b/frontend/src/business/components/track/plan/view/comonents/report/TemplateComponent/TemplateComponent.vue index 1d283a5e61..20f1782041 100644 --- a/frontend/src/business/components/track/plan/view/comonents/report/TemplateComponent/TemplateComponent.vue +++ b/frontend/src/business/components/track/plan/view/comonents/report/TemplateComponent/TemplateComponent.vue @@ -17,7 +17,7 @@ - + diff --git a/frontend/src/business/components/track/plan/view/comonents/report/TestCaseReportView.vue b/frontend/src/business/components/track/plan/view/comonents/report/TestCaseReportView.vue index 2689c0836a..47e43d6537 100644 --- a/frontend/src/business/components/track/plan/view/comonents/report/TestCaseReportView.vue +++ b/frontend/src/business/components/track/plan/view/comonents/report/TestCaseReportView.vue @@ -167,7 +167,6 @@ getMetric() { this.result = this.$get('/test/plan/get/metric/' + this.planId, response => { this.metric = response.data; - console.log(this.metric) if (!this.metric.failureTestCases) { this.metric.failureTestCases = []; } @@ -177,6 +176,9 @@ if (!this.metric.moduleExecuteResult) { this.metric.moduleExecuteResult = []; } + /*缺陷列表*/ + this.metric.defectList = []; + if (this.report.startTime) { this.metric.startTime = new Date(this.report.startTime); } diff --git a/frontend/src/i18n/en-US.js b/frontend/src/i18n/en-US.js index bee8cb3353..32e5a138c0 100644 --- a/frontend/src/i18n/en-US.js +++ b/frontend/src/i18n/en-US.js @@ -606,7 +606,11 @@ export default { delete_confirm: "Confirm delete module:", delete_all_resource: "and all submodules and test cases under the module", module: "Module", - title:"Title" + title: "Title", + describe: "Describe", + status: "Status", + current_owner: "Current Owner", + creation_time: "Creation time" }, home: { recent_test: "Recent test", diff --git a/frontend/src/i18n/zh-CN.js b/frontend/src/i18n/zh-CN.js index ed995f7b40..ca0b45eb0d 100644 --- a/frontend/src/i18n/zh-CN.js +++ b/frontend/src/i18n/zh-CN.js @@ -611,7 +611,11 @@ export default { delete_confirm: "确认删除模块: ", delete_all_resource: "以及模块下所有子模块和测试用例", module: "模块", - title:"标题", + title: "标题", + status: "状态", + describe: "描述", + current_owner: "处理人", + creation_time: "创建时间" }, home: { recent_test: "最近测试", diff --git a/frontend/src/i18n/zh-TW.js b/frontend/src/i18n/zh-TW.js index 8cc3789b1a..fce9ae9389 100644 --- a/frontend/src/i18n/zh-TW.js +++ b/frontend/src/i18n/zh-TW.js @@ -606,7 +606,11 @@ export default { delete_confirm: "確認刪除模塊: ", delete_all_resource: "以及模塊下所有子模塊和測試用例", module: "模塊", - title:"標題", + title: "標題", + status: "狀態", + describe: "描述", + current_owner: "處理人", + creation_time: "創建時間" }, home: { recent_test: "最近測試", From ce96ec0a4bf3ab52787cd13d963670144a33f043 Mon Sep 17 00:00:00 2001 From: shiziyuan9527 Date: Fri, 14 Aug 2020 14:50:06 +0800 Subject: [PATCH 05/27] =?UTF-8?q?feat:=20=E4=BF=AE=E6=94=B9sql?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/metersphere/base/domain/Issues.java | 27 + .../base/domain/IssuesExample.java | 740 ++++++++++++++++++ .../base/domain/TestCaseIssues.java | 2 - .../base/domain/TestCaseIssuesExample.java | 70 -- .../metersphere/base/mapper/IssuesMapper.java | 36 + .../metersphere/base/mapper/IssuesMapper.xml | 323 ++++++++ .../base/mapper/TestCaseIssuesMapper.xml | 29 +- .../db/migration/V13__service_integration.sql | 17 +- 8 files changed, 1148 insertions(+), 96 deletions(-) create mode 100644 backend/src/main/java/io/metersphere/base/domain/Issues.java create mode 100644 backend/src/main/java/io/metersphere/base/domain/IssuesExample.java create mode 100644 backend/src/main/java/io/metersphere/base/mapper/IssuesMapper.java create mode 100644 backend/src/main/java/io/metersphere/base/mapper/IssuesMapper.xml diff --git a/backend/src/main/java/io/metersphere/base/domain/Issues.java b/backend/src/main/java/io/metersphere/base/domain/Issues.java new file mode 100644 index 0000000000..1aac52464a --- /dev/null +++ b/backend/src/main/java/io/metersphere/base/domain/Issues.java @@ -0,0 +1,27 @@ +package io.metersphere.base.domain; + +import java.io.Serializable; +import lombok.Data; + +@Data +public class Issues implements Serializable { + private String id; + + private String title; + + private String status; + + private Long createTime; + + private Long updateTime; + + private String reporter; + + private String lastmodify; + + private String platform; + + private String description; + + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/domain/IssuesExample.java b/backend/src/main/java/io/metersphere/base/domain/IssuesExample.java new file mode 100644 index 0000000000..c2f363f61d --- /dev/null +++ b/backend/src/main/java/io/metersphere/base/domain/IssuesExample.java @@ -0,0 +1,740 @@ +package io.metersphere.base.domain; + +import java.util.ArrayList; +import java.util.List; + +public class IssuesExample { + protected String orderByClause; + + protected boolean distinct; + + protected List oredCriteria; + + public IssuesExample() { + oredCriteria = new ArrayList(); + } + + public void setOrderByClause(String orderByClause) { + this.orderByClause = orderByClause; + } + + public String getOrderByClause() { + return orderByClause; + } + + public void setDistinct(boolean distinct) { + this.distinct = distinct; + } + + public boolean isDistinct() { + return distinct; + } + + public List getOredCriteria() { + return oredCriteria; + } + + public void or(Criteria criteria) { + oredCriteria.add(criteria); + } + + public Criteria or() { + Criteria criteria = createCriteriaInternal(); + oredCriteria.add(criteria); + return criteria; + } + + public Criteria createCriteria() { + Criteria criteria = createCriteriaInternal(); + if (oredCriteria.size() == 0) { + oredCriteria.add(criteria); + } + return criteria; + } + + protected Criteria createCriteriaInternal() { + Criteria criteria = new Criteria(); + return criteria; + } + + public void clear() { + oredCriteria.clear(); + orderByClause = null; + distinct = false; + } + + protected abstract static class GeneratedCriteria { + protected List criteria; + + protected GeneratedCriteria() { + super(); + criteria = new ArrayList(); + } + + public boolean isValid() { + return criteria.size() > 0; + } + + public List getAllCriteria() { + return criteria; + } + + public List getCriteria() { + return criteria; + } + + protected void addCriterion(String condition) { + if (condition == null) { + throw new RuntimeException("Value for condition cannot be null"); + } + criteria.add(new Criterion(condition)); + } + + protected void addCriterion(String condition, Object value, String property) { + if (value == null) { + throw new RuntimeException("Value for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value)); + } + + protected void addCriterion(String condition, Object value1, Object value2, String property) { + if (value1 == null || value2 == null) { + throw new RuntimeException("Between values for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value1, value2)); + } + + public Criteria andIdIsNull() { + addCriterion("id is null"); + return (Criteria) this; + } + + public Criteria andIdIsNotNull() { + addCriterion("id is not null"); + return (Criteria) this; + } + + public Criteria andIdEqualTo(String value) { + addCriterion("id =", value, "id"); + return (Criteria) this; + } + + public Criteria andIdNotEqualTo(String value) { + addCriterion("id <>", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThan(String value) { + addCriterion("id >", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThanOrEqualTo(String value) { + addCriterion("id >=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThan(String value) { + addCriterion("id <", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThanOrEqualTo(String value) { + addCriterion("id <=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLike(String value) { + addCriterion("id like", value, "id"); + return (Criteria) this; + } + + public Criteria andIdNotLike(String value) { + addCriterion("id not like", value, "id"); + return (Criteria) this; + } + + public Criteria andIdIn(List values) { + addCriterion("id in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdNotIn(List values) { + addCriterion("id not in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdBetween(String value1, String value2) { + addCriterion("id between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andIdNotBetween(String value1, String value2) { + addCriterion("id not between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andTitleIsNull() { + addCriterion("title is null"); + return (Criteria) this; + } + + public Criteria andTitleIsNotNull() { + addCriterion("title is not null"); + return (Criteria) this; + } + + public Criteria andTitleEqualTo(String value) { + addCriterion("title =", value, "title"); + return (Criteria) this; + } + + public Criteria andTitleNotEqualTo(String value) { + addCriterion("title <>", value, "title"); + return (Criteria) this; + } + + public Criteria andTitleGreaterThan(String value) { + addCriterion("title >", value, "title"); + return (Criteria) this; + } + + public Criteria andTitleGreaterThanOrEqualTo(String value) { + addCriterion("title >=", value, "title"); + return (Criteria) this; + } + + public Criteria andTitleLessThan(String value) { + addCriterion("title <", value, "title"); + return (Criteria) this; + } + + public Criteria andTitleLessThanOrEqualTo(String value) { + addCriterion("title <=", value, "title"); + return (Criteria) this; + } + + public Criteria andTitleLike(String value) { + addCriterion("title like", value, "title"); + return (Criteria) this; + } + + public Criteria andTitleNotLike(String value) { + addCriterion("title not like", value, "title"); + return (Criteria) this; + } + + public Criteria andTitleIn(List values) { + addCriterion("title in", values, "title"); + return (Criteria) this; + } + + public Criteria andTitleNotIn(List values) { + addCriterion("title not in", values, "title"); + return (Criteria) this; + } + + public Criteria andTitleBetween(String value1, String value2) { + addCriterion("title between", value1, value2, "title"); + return (Criteria) this; + } + + public Criteria andTitleNotBetween(String value1, String value2) { + addCriterion("title not between", value1, value2, "title"); + return (Criteria) this; + } + + public Criteria andStatusIsNull() { + addCriterion("`status` is null"); + return (Criteria) this; + } + + public Criteria andStatusIsNotNull() { + addCriterion("`status` is not null"); + return (Criteria) this; + } + + public Criteria andStatusEqualTo(String value) { + addCriterion("`status` =", value, "status"); + return (Criteria) this; + } + + public Criteria andStatusNotEqualTo(String value) { + addCriterion("`status` <>", value, "status"); + return (Criteria) this; + } + + public Criteria andStatusGreaterThan(String value) { + addCriterion("`status` >", value, "status"); + return (Criteria) this; + } + + public Criteria andStatusGreaterThanOrEqualTo(String value) { + addCriterion("`status` >=", value, "status"); + return (Criteria) this; + } + + public Criteria andStatusLessThan(String value) { + addCriterion("`status` <", value, "status"); + return (Criteria) this; + } + + public Criteria andStatusLessThanOrEqualTo(String value) { + addCriterion("`status` <=", value, "status"); + return (Criteria) this; + } + + public Criteria andStatusLike(String value) { + addCriterion("`status` like", value, "status"); + return (Criteria) this; + } + + public Criteria andStatusNotLike(String value) { + addCriterion("`status` not like", value, "status"); + return (Criteria) this; + } + + public Criteria andStatusIn(List values) { + addCriterion("`status` in", values, "status"); + return (Criteria) this; + } + + public Criteria andStatusNotIn(List values) { + addCriterion("`status` not in", values, "status"); + return (Criteria) this; + } + + public Criteria andStatusBetween(String value1, String value2) { + addCriterion("`status` between", value1, value2, "status"); + return (Criteria) this; + } + + public Criteria andStatusNotBetween(String value1, String value2) { + addCriterion("`status` not between", value1, value2, "status"); + return (Criteria) this; + } + + public Criteria andCreateTimeIsNull() { + addCriterion("create_time is null"); + return (Criteria) this; + } + + public Criteria andCreateTimeIsNotNull() { + addCriterion("create_time is not null"); + return (Criteria) this; + } + + public Criteria andCreateTimeEqualTo(Long value) { + addCriterion("create_time =", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotEqualTo(Long value) { + addCriterion("create_time <>", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeGreaterThan(Long value) { + addCriterion("create_time >", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeGreaterThanOrEqualTo(Long value) { + addCriterion("create_time >=", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeLessThan(Long value) { + addCriterion("create_time <", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeLessThanOrEqualTo(Long value) { + addCriterion("create_time <=", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeIn(List values) { + addCriterion("create_time in", values, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotIn(List values) { + addCriterion("create_time not in", values, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeBetween(Long value1, Long value2) { + addCriterion("create_time between", value1, value2, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotBetween(Long value1, Long value2) { + addCriterion("create_time not between", value1, value2, "createTime"); + return (Criteria) this; + } + + public Criteria andUpdateTimeIsNull() { + addCriterion("update_time is null"); + return (Criteria) this; + } + + public Criteria andUpdateTimeIsNotNull() { + addCriterion("update_time is not null"); + return (Criteria) this; + } + + public Criteria andUpdateTimeEqualTo(Long value) { + addCriterion("update_time =", value, "updateTime"); + return (Criteria) this; + } + + public Criteria andUpdateTimeNotEqualTo(Long value) { + addCriterion("update_time <>", value, "updateTime"); + return (Criteria) this; + } + + public Criteria andUpdateTimeGreaterThan(Long value) { + addCriterion("update_time >", value, "updateTime"); + return (Criteria) this; + } + + public Criteria andUpdateTimeGreaterThanOrEqualTo(Long value) { + addCriterion("update_time >=", value, "updateTime"); + return (Criteria) this; + } + + public Criteria andUpdateTimeLessThan(Long value) { + addCriterion("update_time <", value, "updateTime"); + return (Criteria) this; + } + + public Criteria andUpdateTimeLessThanOrEqualTo(Long value) { + addCriterion("update_time <=", value, "updateTime"); + return (Criteria) this; + } + + public Criteria andUpdateTimeIn(List values) { + addCriterion("update_time in", values, "updateTime"); + return (Criteria) this; + } + + public Criteria andUpdateTimeNotIn(List values) { + addCriterion("update_time not in", values, "updateTime"); + return (Criteria) this; + } + + public Criteria andUpdateTimeBetween(Long value1, Long value2) { + addCriterion("update_time between", value1, value2, "updateTime"); + return (Criteria) this; + } + + public Criteria andUpdateTimeNotBetween(Long value1, Long value2) { + addCriterion("update_time not between", value1, value2, "updateTime"); + return (Criteria) this; + } + + public Criteria andReporterIsNull() { + addCriterion("reporter is null"); + return (Criteria) this; + } + + public Criteria andReporterIsNotNull() { + addCriterion("reporter is not null"); + return (Criteria) this; + } + + public Criteria andReporterEqualTo(String value) { + addCriterion("reporter =", value, "reporter"); + return (Criteria) this; + } + + public Criteria andReporterNotEqualTo(String value) { + addCriterion("reporter <>", value, "reporter"); + return (Criteria) this; + } + + public Criteria andReporterGreaterThan(String value) { + addCriterion("reporter >", value, "reporter"); + return (Criteria) this; + } + + public Criteria andReporterGreaterThanOrEqualTo(String value) { + addCriterion("reporter >=", value, "reporter"); + return (Criteria) this; + } + + public Criteria andReporterLessThan(String value) { + addCriterion("reporter <", value, "reporter"); + return (Criteria) this; + } + + public Criteria andReporterLessThanOrEqualTo(String value) { + addCriterion("reporter <=", value, "reporter"); + return (Criteria) this; + } + + public Criteria andReporterLike(String value) { + addCriterion("reporter like", value, "reporter"); + return (Criteria) this; + } + + public Criteria andReporterNotLike(String value) { + addCriterion("reporter not like", value, "reporter"); + return (Criteria) this; + } + + public Criteria andReporterIn(List values) { + addCriterion("reporter in", values, "reporter"); + return (Criteria) this; + } + + public Criteria andReporterNotIn(List values) { + addCriterion("reporter not in", values, "reporter"); + return (Criteria) this; + } + + public Criteria andReporterBetween(String value1, String value2) { + addCriterion("reporter between", value1, value2, "reporter"); + return (Criteria) this; + } + + public Criteria andReporterNotBetween(String value1, String value2) { + addCriterion("reporter not between", value1, value2, "reporter"); + return (Criteria) this; + } + + public Criteria andLastmodifyIsNull() { + addCriterion("lastmodify is null"); + return (Criteria) this; + } + + public Criteria andLastmodifyIsNotNull() { + addCriterion("lastmodify is not null"); + return (Criteria) this; + } + + public Criteria andLastmodifyEqualTo(String value) { + addCriterion("lastmodify =", value, "lastmodify"); + return (Criteria) this; + } + + public Criteria andLastmodifyNotEqualTo(String value) { + addCriterion("lastmodify <>", value, "lastmodify"); + return (Criteria) this; + } + + public Criteria andLastmodifyGreaterThan(String value) { + addCriterion("lastmodify >", value, "lastmodify"); + return (Criteria) this; + } + + public Criteria andLastmodifyGreaterThanOrEqualTo(String value) { + addCriterion("lastmodify >=", value, "lastmodify"); + return (Criteria) this; + } + + public Criteria andLastmodifyLessThan(String value) { + addCriterion("lastmodify <", value, "lastmodify"); + return (Criteria) this; + } + + public Criteria andLastmodifyLessThanOrEqualTo(String value) { + addCriterion("lastmodify <=", value, "lastmodify"); + return (Criteria) this; + } + + public Criteria andLastmodifyLike(String value) { + addCriterion("lastmodify like", value, "lastmodify"); + return (Criteria) this; + } + + public Criteria andLastmodifyNotLike(String value) { + addCriterion("lastmodify not like", value, "lastmodify"); + return (Criteria) this; + } + + public Criteria andLastmodifyIn(List values) { + addCriterion("lastmodify in", values, "lastmodify"); + return (Criteria) this; + } + + public Criteria andLastmodifyNotIn(List values) { + addCriterion("lastmodify not in", values, "lastmodify"); + return (Criteria) this; + } + + public Criteria andLastmodifyBetween(String value1, String value2) { + addCriterion("lastmodify between", value1, value2, "lastmodify"); + return (Criteria) this; + } + + public Criteria andLastmodifyNotBetween(String value1, String value2) { + addCriterion("lastmodify not between", value1, value2, "lastmodify"); + return (Criteria) this; + } + + public Criteria andPlatformIsNull() { + addCriterion("platform is null"); + return (Criteria) this; + } + + public Criteria andPlatformIsNotNull() { + addCriterion("platform is not null"); + return (Criteria) this; + } + + public Criteria andPlatformEqualTo(String value) { + addCriterion("platform =", value, "platform"); + return (Criteria) this; + } + + public Criteria andPlatformNotEqualTo(String value) { + addCriterion("platform <>", value, "platform"); + return (Criteria) this; + } + + public Criteria andPlatformGreaterThan(String value) { + addCriterion("platform >", value, "platform"); + return (Criteria) this; + } + + public Criteria andPlatformGreaterThanOrEqualTo(String value) { + addCriterion("platform >=", value, "platform"); + return (Criteria) this; + } + + public Criteria andPlatformLessThan(String value) { + addCriterion("platform <", value, "platform"); + return (Criteria) this; + } + + public Criteria andPlatformLessThanOrEqualTo(String value) { + addCriterion("platform <=", value, "platform"); + return (Criteria) this; + } + + public Criteria andPlatformLike(String value) { + addCriterion("platform like", value, "platform"); + return (Criteria) this; + } + + public Criteria andPlatformNotLike(String value) { + addCriterion("platform not like", value, "platform"); + return (Criteria) this; + } + + public Criteria andPlatformIn(List values) { + addCriterion("platform in", values, "platform"); + return (Criteria) this; + } + + public Criteria andPlatformNotIn(List values) { + addCriterion("platform not in", values, "platform"); + return (Criteria) this; + } + + public Criteria andPlatformBetween(String value1, String value2) { + addCriterion("platform between", value1, value2, "platform"); + return (Criteria) this; + } + + public Criteria andPlatformNotBetween(String value1, String value2) { + addCriterion("platform not between", value1, value2, "platform"); + return (Criteria) this; + } + } + + public static class Criteria extends GeneratedCriteria { + + protected Criteria() { + super(); + } + } + + public static class Criterion { + private String condition; + + private Object value; + + private Object secondValue; + + private boolean noValue; + + private boolean singleValue; + + private boolean betweenValue; + + private boolean listValue; + + private String typeHandler; + + public String getCondition() { + return condition; + } + + public Object getValue() { + return value; + } + + public Object getSecondValue() { + return secondValue; + } + + public boolean isNoValue() { + return noValue; + } + + public boolean isSingleValue() { + return singleValue; + } + + public boolean isBetweenValue() { + return betweenValue; + } + + public boolean isListValue() { + return listValue; + } + + public String getTypeHandler() { + return typeHandler; + } + + protected Criterion(String condition) { + super(); + this.condition = condition; + this.typeHandler = null; + this.noValue = true; + } + + protected Criterion(String condition, Object value, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.typeHandler = typeHandler; + if (value instanceof List) { + this.listValue = true; + } else { + this.singleValue = true; + } + } + + protected Criterion(String condition, Object value) { + this(condition, value, null); + } + + protected Criterion(String condition, Object value, Object secondValue, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.secondValue = secondValue; + this.typeHandler = typeHandler; + this.betweenValue = true; + } + + protected Criterion(String condition, Object value, Object secondValue) { + this(condition, value, secondValue, null); + } + } +} \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/domain/TestCaseIssues.java b/backend/src/main/java/io/metersphere/base/domain/TestCaseIssues.java index c658c42f84..cff8104fd7 100644 --- a/backend/src/main/java/io/metersphere/base/domain/TestCaseIssues.java +++ b/backend/src/main/java/io/metersphere/base/domain/TestCaseIssues.java @@ -11,7 +11,5 @@ public class TestCaseIssues implements Serializable { private String issuesId; - private String platform; - private static final long serialVersionUID = 1L; } \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/domain/TestCaseIssuesExample.java b/backend/src/main/java/io/metersphere/base/domain/TestCaseIssuesExample.java index 4870ff4ad4..02920aa81a 100644 --- a/backend/src/main/java/io/metersphere/base/domain/TestCaseIssuesExample.java +++ b/backend/src/main/java/io/metersphere/base/domain/TestCaseIssuesExample.java @@ -313,76 +313,6 @@ public class TestCaseIssuesExample { addCriterion("issues_id not between", value1, value2, "issuesId"); return (Criteria) this; } - - public Criteria andPlatformIsNull() { - addCriterion("platform is null"); - return (Criteria) this; - } - - public Criteria andPlatformIsNotNull() { - addCriterion("platform is not null"); - return (Criteria) this; - } - - public Criteria andPlatformEqualTo(String value) { - addCriterion("platform =", value, "platform"); - return (Criteria) this; - } - - public Criteria andPlatformNotEqualTo(String value) { - addCriterion("platform <>", value, "platform"); - return (Criteria) this; - } - - public Criteria andPlatformGreaterThan(String value) { - addCriterion("platform >", value, "platform"); - return (Criteria) this; - } - - public Criteria andPlatformGreaterThanOrEqualTo(String value) { - addCriterion("platform >=", value, "platform"); - return (Criteria) this; - } - - public Criteria andPlatformLessThan(String value) { - addCriterion("platform <", value, "platform"); - return (Criteria) this; - } - - public Criteria andPlatformLessThanOrEqualTo(String value) { - addCriterion("platform <=", value, "platform"); - return (Criteria) this; - } - - public Criteria andPlatformLike(String value) { - addCriterion("platform like", value, "platform"); - return (Criteria) this; - } - - public Criteria andPlatformNotLike(String value) { - addCriterion("platform not like", value, "platform"); - return (Criteria) this; - } - - public Criteria andPlatformIn(List values) { - addCriterion("platform in", values, "platform"); - return (Criteria) this; - } - - public Criteria andPlatformNotIn(List values) { - addCriterion("platform not in", values, "platform"); - return (Criteria) this; - } - - public Criteria andPlatformBetween(String value1, String value2) { - addCriterion("platform between", value1, value2, "platform"); - return (Criteria) this; - } - - public Criteria andPlatformNotBetween(String value1, String value2) { - addCriterion("platform not between", value1, value2, "platform"); - return (Criteria) this; - } } public static class Criteria extends GeneratedCriteria { diff --git a/backend/src/main/java/io/metersphere/base/mapper/IssuesMapper.java b/backend/src/main/java/io/metersphere/base/mapper/IssuesMapper.java new file mode 100644 index 0000000000..0dd8d77d7d --- /dev/null +++ b/backend/src/main/java/io/metersphere/base/mapper/IssuesMapper.java @@ -0,0 +1,36 @@ +package io.metersphere.base.mapper; + +import io.metersphere.base.domain.Issues; +import io.metersphere.base.domain.IssuesExample; +import java.util.List; +import org.apache.ibatis.annotations.Param; + +public interface IssuesMapper { + long countByExample(IssuesExample example); + + int deleteByExample(IssuesExample example); + + int deleteByPrimaryKey(String id); + + int insert(Issues record); + + int insertSelective(Issues record); + + List selectByExampleWithBLOBs(IssuesExample example); + + List selectByExample(IssuesExample example); + + Issues selectByPrimaryKey(String id); + + int updateByExampleSelective(@Param("record") Issues record, @Param("example") IssuesExample example); + + int updateByExampleWithBLOBs(@Param("record") Issues record, @Param("example") IssuesExample example); + + int updateByExample(@Param("record") Issues record, @Param("example") IssuesExample example); + + int updateByPrimaryKeySelective(Issues record); + + int updateByPrimaryKeyWithBLOBs(Issues record); + + int updateByPrimaryKey(Issues record); +} \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/IssuesMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/IssuesMapper.xml new file mode 100644 index 0000000000..5d5bac2cb6 --- /dev/null +++ b/backend/src/main/java/io/metersphere/base/mapper/IssuesMapper.xml @@ -0,0 +1,323 @@ + + + + + + + + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + id, title, `status`, create_time, update_time, reporter, lastmodify, platform + + + description + + + + + + delete from issues + where id = #{id,jdbcType=VARCHAR} + + + delete from issues + + + + + + insert into issues (id, title, `status`, + create_time, update_time, reporter, + lastmodify, platform, description + ) + values (#{id,jdbcType=VARCHAR}, #{title,jdbcType=VARCHAR}, #{status,jdbcType=VARCHAR}, + #{createTime,jdbcType=BIGINT}, #{updateTime,jdbcType=BIGINT}, #{reporter,jdbcType=VARCHAR}, + #{lastmodify,jdbcType=VARCHAR}, #{platform,jdbcType=VARCHAR}, #{description,jdbcType=LONGVARCHAR} + ) + + + insert into issues + + + id, + + + title, + + + `status`, + + + create_time, + + + update_time, + + + reporter, + + + lastmodify, + + + platform, + + + description, + + + + + #{id,jdbcType=VARCHAR}, + + + #{title,jdbcType=VARCHAR}, + + + #{status,jdbcType=VARCHAR}, + + + #{createTime,jdbcType=BIGINT}, + + + #{updateTime,jdbcType=BIGINT}, + + + #{reporter,jdbcType=VARCHAR}, + + + #{lastmodify,jdbcType=VARCHAR}, + + + #{platform,jdbcType=VARCHAR}, + + + #{description,jdbcType=LONGVARCHAR}, + + + + + + update issues + + + id = #{record.id,jdbcType=VARCHAR}, + + + title = #{record.title,jdbcType=VARCHAR}, + + + `status` = #{record.status,jdbcType=VARCHAR}, + + + create_time = #{record.createTime,jdbcType=BIGINT}, + + + update_time = #{record.updateTime,jdbcType=BIGINT}, + + + reporter = #{record.reporter,jdbcType=VARCHAR}, + + + lastmodify = #{record.lastmodify,jdbcType=VARCHAR}, + + + platform = #{record.platform,jdbcType=VARCHAR}, + + + description = #{record.description,jdbcType=LONGVARCHAR}, + + + + + + + + update issues + set id = #{record.id,jdbcType=VARCHAR}, + title = #{record.title,jdbcType=VARCHAR}, + `status` = #{record.status,jdbcType=VARCHAR}, + create_time = #{record.createTime,jdbcType=BIGINT}, + update_time = #{record.updateTime,jdbcType=BIGINT}, + reporter = #{record.reporter,jdbcType=VARCHAR}, + lastmodify = #{record.lastmodify,jdbcType=VARCHAR}, + platform = #{record.platform,jdbcType=VARCHAR}, + description = #{record.description,jdbcType=LONGVARCHAR} + + + + + + update issues + set id = #{record.id,jdbcType=VARCHAR}, + title = #{record.title,jdbcType=VARCHAR}, + `status` = #{record.status,jdbcType=VARCHAR}, + create_time = #{record.createTime,jdbcType=BIGINT}, + update_time = #{record.updateTime,jdbcType=BIGINT}, + reporter = #{record.reporter,jdbcType=VARCHAR}, + lastmodify = #{record.lastmodify,jdbcType=VARCHAR}, + platform = #{record.platform,jdbcType=VARCHAR} + + + + + + update issues + + + title = #{title,jdbcType=VARCHAR}, + + + `status` = #{status,jdbcType=VARCHAR}, + + + create_time = #{createTime,jdbcType=BIGINT}, + + + update_time = #{updateTime,jdbcType=BIGINT}, + + + reporter = #{reporter,jdbcType=VARCHAR}, + + + lastmodify = #{lastmodify,jdbcType=VARCHAR}, + + + platform = #{platform,jdbcType=VARCHAR}, + + + description = #{description,jdbcType=LONGVARCHAR}, + + + where id = #{id,jdbcType=VARCHAR} + + + update issues + set title = #{title,jdbcType=VARCHAR}, + `status` = #{status,jdbcType=VARCHAR}, + create_time = #{createTime,jdbcType=BIGINT}, + update_time = #{updateTime,jdbcType=BIGINT}, + reporter = #{reporter,jdbcType=VARCHAR}, + lastmodify = #{lastmodify,jdbcType=VARCHAR}, + platform = #{platform,jdbcType=VARCHAR}, + description = #{description,jdbcType=LONGVARCHAR} + where id = #{id,jdbcType=VARCHAR} + + + update issues + set title = #{title,jdbcType=VARCHAR}, + `status` = #{status,jdbcType=VARCHAR}, + create_time = #{createTime,jdbcType=BIGINT}, + update_time = #{updateTime,jdbcType=BIGINT}, + reporter = #{reporter,jdbcType=VARCHAR}, + lastmodify = #{lastmodify,jdbcType=VARCHAR}, + platform = #{platform,jdbcType=VARCHAR} + where id = #{id,jdbcType=VARCHAR} + + \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/TestCaseIssuesMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/TestCaseIssuesMapper.xml index 9a4bd3460f..10755b5265 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/TestCaseIssuesMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/TestCaseIssuesMapper.xml @@ -5,7 +5,6 @@ - @@ -66,7 +65,7 @@ - id, test_case_id, issues_id, platform + id, test_case_id, issues_id @@ -153,9 +146,6 @@ issues_id = #{record.issuesId,jdbcType=VARCHAR}, - - platform = #{record.platform,jdbcType=VARCHAR}, - @@ -165,8 +155,7 @@ update test_case_issues set id = #{record.id,jdbcType=VARCHAR}, test_case_id = #{record.testCaseId,jdbcType=VARCHAR}, - issues_id = #{record.issuesId,jdbcType=VARCHAR}, - platform = #{record.platform,jdbcType=VARCHAR} + issues_id = #{record.issuesId,jdbcType=VARCHAR} @@ -180,17 +169,13 @@ issues_id = #{issuesId,jdbcType=VARCHAR}, - - platform = #{platform,jdbcType=VARCHAR}, - where id = #{id,jdbcType=VARCHAR} update test_case_issues set test_case_id = #{testCaseId,jdbcType=VARCHAR}, - issues_id = #{issuesId,jdbcType=VARCHAR}, - platform = #{platform,jdbcType=VARCHAR} + issues_id = #{issuesId,jdbcType=VARCHAR} where id = #{id,jdbcType=VARCHAR} \ No newline at end of file diff --git a/backend/src/main/resources/db/migration/V13__service_integration.sql b/backend/src/main/resources/db/migration/V13__service_integration.sql index c48d2d627c..299084bace 100644 --- a/backend/src/main/resources/db/migration/V13__service_integration.sql +++ b/backend/src/main/resources/db/migration/V13__service_integration.sql @@ -13,6 +13,19 @@ create table if not exists test_case_issues id varchar(50) not null primary key, test_case_id varchar(50) not null, - issues_id varchar(100) not null, - platform varchar(50) not null + issues_id varchar(100) not null +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +create table if not exists issues +( + id varchar(50) not null + primary key, + title varchar(50) null, + description text null, + status varchar(50) null, + create_time bigint(13) null, + update_time bigint(13) null, + reporter varchar(50) null comment 'case issues creator', + lastmodify varchar(50) null, + platform varchar(50) null ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; \ No newline at end of file From c34fb465d0932baf81031949163f184cbbd31c70 Mon Sep 17 00:00:00 2001 From: "Captain.B" Date: Fri, 14 Aug 2020 15:36:44 +0800 Subject: [PATCH 06/27] =?UTF-8?q?refactor:=20=E5=90=AF=E5=8A=A8Jmeter?= =?UTF-8?q?=E5=AE=B9=E5=99=A8=E7=9A=84=E6=97=B6=E5=80=99=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?HEAP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker/jmeter-master/run-test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/jmeter-master/run-test.sh b/docker/jmeter-master/run-test.sh index 1be0ccc6fe..54c94d91a9 100644 --- a/docker/jmeter-master/run-test.sh +++ b/docker/jmeter-master/run-test.sh @@ -1,4 +1,4 @@ +export HEAP=$(cat /proc/meminfo | grep MemTotal | awk '{ mem=int($2/1024/1024 * 3/4 + 0.5); metasize=int(mem/4+0.5)"g"; if(mem<1) mem=1; if (metasize == "0g") metasize="256m"; HEAP="-Xms"mem"g -Xmx"mem"g -XX:MaxMetaspaceSize="metasize; print HEAP }') for file in ${TESTS_DIR}/*.jmx; do - echo "one shot run." jmeter -n -t ${file} -Jserver.rmi.ssl.disable=${SSL_DISABLED} done From ea872b5f79fda9a4ddc4d14218269e13fc6d6909 Mon Sep 17 00:00:00 2001 From: "Captain.B" Date: Fri, 14 Aug 2020 16:50:12 +0800 Subject: [PATCH 07/27] =?UTF-8?q?feat(=E6=8E=A5=E5=8F=A3=E6=B5=8B=E8=AF=95?= =?UTF-8?q?):=20Jmeter=20=E5=87=BD=E6=95=B0=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/components/ApiVariableAdvance.vue | 17 +++-- frontend/src/common/js/constants.js | 70 +++++++++---------- frontend/src/i18n/en-US.js | 2 + frontend/src/i18n/zh-CN.js | 4 +- frontend/src/i18n/zh-TW.js | 2 + 5 files changed, 49 insertions(+), 46 deletions(-) diff --git a/frontend/src/business/components/api/test/components/ApiVariableAdvance.vue b/frontend/src/business/components/api/test/components/ApiVariableAdvance.vue index cacd32ddb3..e55422404c 100644 --- a/frontend/src/business/components/api/test/components/ApiVariableAdvance.vue +++ b/frontend/src/business/components/api/test/components/ApiVariableAdvance.vue @@ -33,7 +33,7 @@ - +
@@ -49,15 +49,14 @@
- +
-
- - - -
+

Jmeter 内置函数

+ + + + +
diff --git a/frontend/src/common/js/constants.js b/frontend/src/common/js/constants.js index 302477cd60..fb0ee6caa2 100644 --- a/frontend/src/common/js/constants.js +++ b/frontend/src/common/js/constants.js @@ -113,39 +113,39 @@ export const MOCKJS_FUNC = [ ] export const JMETER_FUNC = [ - {name: "${__threadNum}"}, - {name: "${__samplerName}"}, - {name: "${__machineIP}"}, - {name: "${__machineName}"}, - {name: "${__time}"}, - {name: "${__log}"}, - {name: "${__logn}"}, - {name: "${__StringFromFile}"}, - {name: "${__FileToString}"}, - {name: "${__CSVRead}"}, - {name: "${__XPath}"}, - {name: "${__counter}"}, - {name: "${__intSum}"}, - {name: "${__longSum}"}, - {name: "${__Random}"}, - {name: "${__RandomString}"}, - {name: "${__UUID}"}, - {name: "${__BeanShell}"}, - {name: "${__javaScript}"}, - {name: "${__jexl}"}, - {name: "${__jexl2}"}, - {name: "${__property}"}, - {name: "${__P}"}, - {name: "${__setProperty}"}, - {name: "${__split}"}, - {name: "${__V}"}, - {name: "${__eval}"}, - {name: "${__evalVar}"}, - {name: "${__regexFunction}"}, - {name: "${__escapeOroRegexpChars}"}, - {name: "${__char}"}, - {name: "${__unescape}"}, - {name: "${__unescapeHtml}"}, - {name: "${__escapeHtml}"}, - {name: "${__TestPlanName}"}, + {type: "Information", name: "${__threadNum}", description: "get thread number"}, + {type: "Information", name: "${__samplerName}", description: "get the sampler name (label)"}, + {type: "Information", name: "${__machineIP}", description: "get the local machine IP address"}, + {type: "Information", name: "${__machineName}", description: "get the local machine name"}, + {type: "Information", name: "${__time}", description: "return current time in various formats"}, + {type: "Information", name: "${__log}", description: "log (or display) a message (and return the value)"}, + {type: "Information", name: "${__logn}", description: "log (or display) a message (empty return value)"}, + {type: "Input", name: "${__StringFromFile}", description: "read a line from a file"}, + {type: "Input", name: "${__FileToString}", description: "read an entire file"}, + {type: "Input", name: "${__CSVRead}", description: "read from CSV delimited file"}, + {type: "Input", name: "${__XPath}", description: "Use an XPath expression to read from a file"}, + {type: "Calculation", name: "${__counter}", description: "generate an incrementing number"}, + {type: "Calculation", name: "${__intSum}", description: "add int numbers"}, + {type: "Calculation", name: "${__longSum}", description: "add long numbers"}, + {type: "Calculation", name: "${__Random}", description: "generate a random number"}, + {type: "Calculation", name: "${__RandomString}", description: "generate a random string"}, + {type: "Calculation", name: "${__UUID}", description: "generate a random type 4 UUID"}, + {type: "Scripting", name: "${__BeanShell}", description: "run a BeanShell script"}, + {type: "Scripting", name: "${__javaScript}", description: "process JavaScript (Mozilla Rhino)"}, + {type: "Scripting", name: "${__jexl}", description: "evaluate a Commons Jexl expression"}, + {type: "Scripting", name: "${__jexl2}", description: "evaluate a Commons Jexl expression"}, + {type: "Properties", name: "${__property}", description: "read a property"}, + {type: "Properties", name: "${__P}", description: "read a property (shorthand method)"}, + {type: "Properties", name: "${__setProperty}", description: "set a JMeter property"}, + {type: "Variables", name: "${__split}", description: "Split a string into variables"}, + {type: "Variables", name: "${__V}", description: "evaluate a variable name"}, + {type: "Variables", name: "${__eval}", description: "evaluate a variable expression"}, + {type: "Variables", name: "${__evalVar}", description: "evaluate an expression stored in a variable"}, + {type: "String", name: "${__regexFunction}", description: "parse previous response using a regular expression"}, + {type: "String", name: "${__escapeOroRegexpChars}", description: "quote meta chars used by ORO regular expression"}, + {type: "String", name: "${__char}", description: "generate Unicode char values from a list of numbers"}, + {type: "String", name: "${__unescape}", description: "Process strings containing Java escapes (e.g. & )"}, + {type: "String", name: "${__unescapeHtml}", description: "Decode HTML-encoded strings"}, + {type: "String", name: "${__escapeHtml}", description: "Encode strings using HTML encoding"}, + {type: "String", name: "${__TestPlanName}", description: "Return name of current test plan"}, ] diff --git a/frontend/src/i18n/en-US.js b/frontend/src/i18n/en-US.js index cc729162d0..8ee3794d6a 100644 --- a/frontend/src/i18n/en-US.js +++ b/frontend/src/i18n/en-US.js @@ -353,6 +353,7 @@ export default { input_name: "Please enter the test name", select_project: "Please select project", variable_name: "Variable name", + variable: "Variable", copied: "copied", key: "Key", value: "Value", @@ -401,6 +402,7 @@ export default { url_description: "etc: https://fit2cloud.com", path_description: "etc:/login", parameters: "Query parameters", + jmeter_func: "Jmeter Functions", parameters_filter_example: "Example", parameters_filter_tips: "Only support MockJs function result preview", parameters_advance: "Advanced parameter settings", diff --git a/frontend/src/i18n/zh-CN.js b/frontend/src/i18n/zh-CN.js index a6b945d397..4e947594c5 100644 --- a/frontend/src/i18n/zh-CN.js +++ b/frontend/src/i18n/zh-CN.js @@ -354,6 +354,7 @@ export default { input_name: "请输入测试名称", select_project: "请选择项目", variable_name: "变量名", + variable: "变量", copied: "已拷贝", key: "键", value: "值", @@ -402,8 +403,7 @@ export default { path_description: "例如:/login", url_invalid: "URL无效", parameters: "请求参数", - parameters_filter: "内置函数", - parameters_filter_desc: "使用方法", + jmeter_func: "Jmeter 方法", parameters_filter_example: "示例", parameters_filter_tips: "只支持 MockJs 函数结果预览", parameters_advance: "高级参数设置", diff --git a/frontend/src/i18n/zh-TW.js b/frontend/src/i18n/zh-TW.js index 733f94a58d..73523d27eb 100644 --- a/frontend/src/i18n/zh-TW.js +++ b/frontend/src/i18n/zh-TW.js @@ -352,6 +352,7 @@ export default { input_name: "請輸入測試名稱", select_project: "請選擇項目", variable_name: "變數名", + variable: "變數", copied: "已拷貝", key: "鍵", value: "值", @@ -401,6 +402,7 @@ export default { path_description: "例如:/login", url_invalid: "URL無效", parameters: "請求參數", + jmeter_func: "Jmeter 方法", parameters_filter_example: "示例", parameters_filter_tips: "只支持MockJs函數結果預覽", parameters_advance: "高級參數設置", From b86fbafa00c71c01d16347e87641a8c1da6f62af Mon Sep 17 00:00:00 2001 From: "Captain.B" Date: Fri, 14 Aug 2020 16:51:36 +0800 Subject: [PATCH 08/27] =?UTF-8?q?feat(=E6=8E=A5=E5=8F=A3=E6=B5=8B=E8=AF=95?= =?UTF-8?q?):=20Jmeter=20=E5=87=BD=E6=95=B0=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/api/test/components/ApiVariableAdvance.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/business/components/api/test/components/ApiVariableAdvance.vue b/frontend/src/business/components/api/test/components/ApiVariableAdvance.vue index e55422404c..a7743050f5 100644 --- a/frontend/src/business/components/api/test/components/ApiVariableAdvance.vue +++ b/frontend/src/business/components/api/test/components/ApiVariableAdvance.vue @@ -51,7 +51,7 @@
-

Jmeter 内置函数

+

{{ $t('api_test.request.jmeter_func') }}

From f52a5cc07881aa730cd32171aa73ae96ee066f29 Mon Sep 17 00:00:00 2001 From: shiziyuan9527 Date: Fri, 14 Aug 2020 18:07:42 +0800 Subject: [PATCH 09/27] =?UTF-8?q?feat:=20=E9=9B=86=E6=88=90Tapd?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/mapper/ext/ExtIssuesMapper.java | 11 ++ .../base/mapper/ext/ExtIssuesMapper.xml | 12 ++ .../constants/IssuesManagePlatform.java | 2 +- .../commons/utils/RestTemplateUtils.java | 7 +- .../io/metersphere/service/IssuesService.java | 187 ++++++++++++++---- .../controller/TestCaseIssuesController.java | 4 +- .../view/comonents/TestPlanTestCaseEdit.vue | 1 + 7 files changed, 181 insertions(+), 43 deletions(-) create mode 100644 backend/src/main/java/io/metersphere/base/mapper/ext/ExtIssuesMapper.java create mode 100644 backend/src/main/java/io/metersphere/base/mapper/ext/ExtIssuesMapper.xml diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtIssuesMapper.java b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtIssuesMapper.java new file mode 100644 index 0000000000..8bd29e8c0b --- /dev/null +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtIssuesMapper.java @@ -0,0 +1,11 @@ +package io.metersphere.base.mapper.ext; + +import io.metersphere.base.domain.Issues; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface ExtIssuesMapper { + + List getIssues(@Param("caseId") String caseId, @Param("platform") String platform); +} diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtIssuesMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtIssuesMapper.xml new file mode 100644 index 0000000000..1b94ec96c5 --- /dev/null +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtIssuesMapper.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/commons/constants/IssuesManagePlatform.java b/backend/src/main/java/io/metersphere/commons/constants/IssuesManagePlatform.java index e898914154..d1ace27122 100644 --- a/backend/src/main/java/io/metersphere/commons/constants/IssuesManagePlatform.java +++ b/backend/src/main/java/io/metersphere/commons/constants/IssuesManagePlatform.java @@ -1,5 +1,5 @@ package io.metersphere.commons.constants; public enum IssuesManagePlatform { - Tapd, Jira + Tapd, Jira, Local } diff --git a/backend/src/main/java/io/metersphere/commons/utils/RestTemplateUtils.java b/backend/src/main/java/io/metersphere/commons/utils/RestTemplateUtils.java index 20a1b9323e..b4f6fdd323 100644 --- a/backend/src/main/java/io/metersphere/commons/utils/RestTemplateUtils.java +++ b/backend/src/main/java/io/metersphere/commons/utils/RestTemplateUtils.java @@ -1,5 +1,6 @@ package io.metersphere.commons.utils; +import io.metersphere.commons.exception.MSException; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; @@ -22,7 +23,8 @@ public class RestTemplateUtils { ResponseEntity responseEntity = restTemplate.exchange(url, HttpMethod.GET, requestEntity, String.class); return responseEntity.getBody(); } catch (Exception e) { - throw new RuntimeException("调用接口失败", e); + MSException.throwException("接口调用失败:" + e.getMessage()); + return null; } } @@ -34,7 +36,8 @@ public class RestTemplateUtils { ResponseEntity responseEntity = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class); return responseEntity.getBody(); } catch (Exception e) { - throw new RuntimeException("调用接口失败", e); + MSException.throwException("接口调用失败:" + e.getMessage()); + return null; } } diff --git a/backend/src/main/java/io/metersphere/service/IssuesService.java b/backend/src/main/java/io/metersphere/service/IssuesService.java index d8135f9222..e1302b103c 100644 --- a/backend/src/main/java/io/metersphere/service/IssuesService.java +++ b/backend/src/main/java/io/metersphere/service/IssuesService.java @@ -3,7 +3,9 @@ package io.metersphere.service; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import io.metersphere.base.domain.*; +import io.metersphere.base.mapper.IssuesMapper; import io.metersphere.base.mapper.TestCaseIssuesMapper; +import io.metersphere.base.mapper.ext.ExtIssuesMapper; import io.metersphere.commons.constants.IssuesManagePlatform; import io.metersphere.commons.exception.MSException; import io.metersphere.commons.user.SessionUser; @@ -12,7 +14,6 @@ import io.metersphere.commons.utils.RestTemplateUtils; import io.metersphere.commons.utils.SessionUtils; import io.metersphere.controller.ResultHolder; import io.metersphere.controller.request.IntegrationRequest; -import io.metersphere.track.dto.IssuesDTO; import io.metersphere.track.request.testcase.IssuesRequest; import io.metersphere.track.service.TestCaseService; import org.springframework.http.HttpHeaders; @@ -41,6 +42,10 @@ public class IssuesService { private ProjectService projectService; @Resource private TestCaseService testCaseService; + @Resource + private IssuesMapper issuesMapper; + @Resource + private ExtIssuesMapper extIssuesMapper; public void testAuth() { @@ -49,34 +54,6 @@ public class IssuesService { System.out.println(call.getData()); } - public void addIssues(IssuesRequest issuesRequest) { - String url = "https://api.tapd.cn/bugs"; - String testCaseId = issuesRequest.getTestCaseId(); - String tapdId = getTapdProjectId(testCaseId); - - if (StringUtils.isBlank(tapdId)) { - MSException.throwException("未关联Tapd 项目ID"); - } - - MultiValueMap paramMap = new LinkedMultiValueMap<>(); - paramMap.add("title", issuesRequest.getTitle()); - paramMap.add("workspace_id", tapdId); - paramMap.add("description", issuesRequest.getContent()); - - ResultHolder result = call(url, HttpMethod.POST, paramMap); - - String listJson = JSON.toJSONString(result.getData()); - JSONObject jsonObject = JSONObject.parseObject(listJson); - String issuesId = jsonObject.getObject("Bug", IssuesDTO.class).getId(); - - // 用例与第三方缺陷平台中的缺陷关联 - TestCaseIssues issues = new TestCaseIssues(); - issues.setId(UUID.randomUUID().toString()); - issues.setIssuesId(issuesId); - issues.setTestCaseId(testCaseId); - testCaseIssuesMapper.insert(issues); - } - private ResultHolder call(String url) { return call(url, HttpMethod.GET, null); } @@ -133,28 +110,142 @@ public class IssuesService { return headers; } - public IssuesDTO getTapdIssues(String projectId, String issuesId) { + public void addIssues(IssuesRequest issuesRequest) { + SessionUser user = SessionUtils.getUser(); + String orgId = user.getLastOrganizationId(); + + boolean tapd = isIntegratedPlatform(orgId, IssuesManagePlatform.Tapd.toString()); + boolean jira = isIntegratedPlatform(orgId, IssuesManagePlatform.Jira.toString()); + + String tapdId = getTapdProjectId(issuesRequest.getTestCaseId()); + String jiraId = ""; + + if (tapd || jira) { + if (StringUtils.isBlank(tapdId) && StringUtils.isBlank(jiraId)) { + MSException.throwException("集成了缺陷管理平台,但未进行项目关联!"); + } + } + + if (tapd) { + // 是否关联了项目 + if (StringUtils.isNotBlank(tapdId)) { + addTapdIssues(issuesRequest); + } + } + + if (jira) { + // addJiraIssues(issuesRequest); + } + + if (!tapd && !jira) { + addLocalIssues(issuesRequest); + } + + } + + public void addTapdIssues(IssuesRequest issuesRequest) { + String url = "https://api.tapd.cn/bugs"; + String testCaseId = issuesRequest.getTestCaseId(); + String tapdId = getTapdProjectId(testCaseId); + + if (StringUtils.isBlank(tapdId)) { + MSException.throwException("未关联Tapd 项目ID"); + } + + MultiValueMap paramMap = new LinkedMultiValueMap<>(); + paramMap.add("title", issuesRequest.getTitle()); + paramMap.add("workspace_id", tapdId); + paramMap.add("description", issuesRequest.getContent()); + + ResultHolder result = call(url, HttpMethod.POST, paramMap); + + String listJson = JSON.toJSONString(result.getData()); + JSONObject jsonObject = JSONObject.parseObject(listJson); + String issuesId = jsonObject.getObject("Bug", Issues.class).getId(); + + // 用例与第三方缺陷平台中的缺陷关联 + TestCaseIssues testCaseIssues = new TestCaseIssues(); + testCaseIssues.setId(UUID.randomUUID().toString()); + testCaseIssues.setIssuesId(issuesId); + testCaseIssues.setTestCaseId(testCaseId); + testCaseIssuesMapper.insert(testCaseIssues); + + // 插入缺陷表 + Issues issues = new Issues(); + issues.setId(issuesId); + issues.setPlatform(IssuesManagePlatform.Tapd.toString()); + issuesMapper.insert(issues); + } + + public void addLocalIssues(IssuesRequest request) { + SessionUser user = SessionUtils.getUser(); + String id = UUID.randomUUID().toString(); + Issues issues = new Issues(); + issues.setId(id); + issues.setStatus("new"); + issues.setReporter(user.getId()); + issues.setTitle(request.getTitle()); + issues.setDescription(request.getContent()); + issues.setCreateTime(System.currentTimeMillis()); + issues.setUpdateTime(System.currentTimeMillis()); + issues.setPlatform(IssuesManagePlatform.Local.toString()); + issuesMapper.insert(issues); + + TestCaseIssues testCaseIssues = new TestCaseIssues(); + testCaseIssues.setId(UUID.randomUUID().toString()); + testCaseIssues.setIssuesId(id); + testCaseIssues.setTestCaseId(request.getTestCaseId()); + testCaseIssuesMapper.insert(testCaseIssues); + } + + public Issues getTapdIssues(String projectId, String issuesId) { String url = "https://api.tapd.cn/bugs?workspace_id=" + projectId + "&id=" + issuesId; ResultHolder call = call(url); String listJson = JSON.toJSONString(call.getData()); if (StringUtils.equals(Boolean.FALSE.toString(), listJson)) { - return new IssuesDTO(); + return new Issues(); } JSONObject jsonObject = JSONObject.parseObject(listJson); - return jsonObject.getObject("Bug", IssuesDTO.class); + return jsonObject.getObject("Bug", Issues.class); } - public List getIssues(String caseId) { - List list = new ArrayList<>(); + public List getIssues(String caseId) { + List list = new ArrayList<>(); + SessionUser user = SessionUtils.getUser(); + String orgId = user.getLastOrganizationId(); + + boolean tapd = isIntegratedPlatform(orgId, IssuesManagePlatform.Tapd.toString()); + boolean jira = isIntegratedPlatform(orgId, IssuesManagePlatform.Jira.toString()); + + if (tapd) { + // 是否关联了项目 + String tapdId = getTapdProjectId(caseId); + if (StringUtils.isNotBlank(tapdId)) { + list.addAll(getTapdIssues(caseId)); + } + + } + + if (jira) { + // getJiraIssues(caseId); + } + + list.addAll(getLocalIssues(caseId)); + return list; + } + + public List getTapdIssues(String caseId) { + List list = new ArrayList<>(); String tapdId = getTapdProjectId(caseId); TestCaseIssuesExample example = new TestCaseIssuesExample(); example.createCriteria().andTestCaseIdEqualTo(caseId); - List issues = testCaseIssuesMapper.selectByExample(example); - List issuesIds = issues.stream().map(issue -> issue.getIssuesId()).collect(Collectors.toList()); + List issues = extIssuesMapper.getIssues(caseId, IssuesManagePlatform.Tapd.toString()); + + List issuesIds = issues.stream().map(issue -> issue.getId()).collect(Collectors.toList()); issuesIds.forEach(issuesId -> { - IssuesDTO dto = getTapdIssues(tapdId, issuesId); + Issues dto = getTapdIssues(tapdId, issuesId); if (StringUtils.isBlank(dto.getId())) { // 缺陷不存在,解除用例和缺陷的关联 TestCaseIssuesExample issuesExample = new TestCaseIssuesExample(); @@ -163,15 +254,35 @@ public class IssuesService { .andIssuesIdEqualTo(issuesId); testCaseIssuesMapper.deleteByExample(issuesExample); } else { - list.add(dto); + dto.setPlatform(IssuesManagePlatform.Tapd.toString()); + // 缺陷状态为 关闭,则不显示 + if (!StringUtils.equals("closed", dto.getStatus())) { + list.add(dto); + } } }); return list; } + public List getLocalIssues(String caseId) { + return extIssuesMapper.getIssues(caseId, IssuesManagePlatform.Local.toString()); + } + public String getTapdProjectId(String testCaseId) { TestCaseWithBLOBs testCase = testCaseService.getTestCase(testCaseId); Project project = projectService.getProjectById(testCase.getProjectId()); return project.getTapdId(); } + + /** + * 是否关联平台 + */ + public boolean isIntegratedPlatform(String orgId, String platform) { + IntegrationRequest request = new IntegrationRequest(); + request.setPlatform(platform); + request.setOrgId(orgId); + ServiceIntegration integration = integrationService.get(request); + return StringUtils.isNotBlank(integration.getId()); + } + } diff --git a/backend/src/main/java/io/metersphere/track/controller/TestCaseIssuesController.java b/backend/src/main/java/io/metersphere/track/controller/TestCaseIssuesController.java index f832b05940..b0c28a0646 100644 --- a/backend/src/main/java/io/metersphere/track/controller/TestCaseIssuesController.java +++ b/backend/src/main/java/io/metersphere/track/controller/TestCaseIssuesController.java @@ -1,7 +1,7 @@ package io.metersphere.track.controller; +import io.metersphere.base.domain.Issues; import io.metersphere.service.IssuesService; -import io.metersphere.track.dto.IssuesDTO; import io.metersphere.track.request.testcase.IssuesRequest; import org.springframework.web.bind.annotation.*; @@ -21,7 +21,7 @@ public class TestCaseIssuesController { } @GetMapping("/get/{id}") - public List getIssues(@PathVariable String id) { + public List getIssues(@PathVariable String id) { return issuesService.getIssues(id); } } diff --git a/frontend/src/business/components/track/plan/view/comonents/TestPlanTestCaseEdit.vue b/frontend/src/business/components/track/plan/view/comonents/TestPlanTestCaseEdit.vue index 4603afece3..e9e5010f3c 100644 --- a/frontend/src/business/components/track/plan/view/comonents/TestPlanTestCaseEdit.vue +++ b/frontend/src/business/components/track/plan/view/comonents/TestPlanTestCaseEdit.vue @@ -211,6 +211,7 @@ + From fa23fcdfcdd697e2fb40dedf542b386349758187 Mon Sep 17 00:00:00 2001 From: "Captain.B" Date: Fri, 14 Aug 2020 19:19:53 +0800 Subject: [PATCH 10/27] =?UTF-8?q?feat(=E6=8E=A5=E5=8F=A3=E6=B5=8B=E8=AF=95?= =?UTF-8?q?):=20=E4=BB=A3=E7=A0=81=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/parse/JmxDocumentParser.java | 125 ++++++++++++++++++ .../api/service/APITestService.java | 8 +- .../commons/utils/ScriptEngineUtils.java | 33 +++++ .../xml/reader/jmx/JmeterDocumentParser.java | 5 +- .../api/test/components/ApiBody.vue | 78 ++++++----- .../api/test/components/ApiVariable.vue | 8 +- .../test/components/ApiVariableAdvance.vue | 7 +- .../components/request/ApiHttpRequestForm.vue | 8 +- .../api/test/model/ScenarioModel.js | 8 -- 9 files changed, 224 insertions(+), 56 deletions(-) create mode 100644 backend/src/main/java/io/metersphere/api/parse/JmxDocumentParser.java create mode 100644 backend/src/main/java/io/metersphere/commons/utils/ScriptEngineUtils.java diff --git a/backend/src/main/java/io/metersphere/api/parse/JmxDocumentParser.java b/backend/src/main/java/io/metersphere/api/parse/JmxDocumentParser.java new file mode 100644 index 0000000000..5f1103cf5d --- /dev/null +++ b/backend/src/main/java/io/metersphere/api/parse/JmxDocumentParser.java @@ -0,0 +1,125 @@ +package io.metersphere.api.parse; + +import io.metersphere.commons.utils.LogUtil; +import io.metersphere.commons.utils.ScriptEngineUtils; +import org.apache.commons.lang3.StringUtils; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; +import java.io.ByteArrayInputStream; +import java.io.StringWriter; + +public class JmxDocumentParser { + private final static String HASH_TREE_ELEMENT = "hashTree"; + private final static String STRING_PROP = "stringProp"; + + public static byte[] parse(byte[] source) { + final InputSource inputSource = new InputSource(new ByteArrayInputStream(source)); + + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + try { + + DocumentBuilder docBuilder = factory.newDocumentBuilder(); + final Document document = docBuilder.parse(inputSource); + final Element jmeterTestPlan = document.getDocumentElement(); + + NodeList childNodes = jmeterTestPlan.getChildNodes(); + for (int i = 0; i < childNodes.getLength(); i++) { + Node node = childNodes.item(i); + if (node instanceof Element) { + Element ele = (Element) node; + parseHashTree(ele); + } + } + return documentToBytes(document); + } catch (Exception e) { + LogUtil.error(e); + return source; + } + } + + private static byte[] documentToBytes(Document document) throws TransformerException { + DOMSource domSource = new DOMSource(document); + StringWriter writer = new StringWriter(); + StreamResult result = new StreamResult(writer); + TransformerFactory tf = TransformerFactory.newInstance(); + Transformer transformer = tf.newTransformer(); + transformer.transform(domSource, result); + return writer.toString().getBytes(); + } + + private static void parseHashTree(Element hashTree) { + if (invalid(hashTree)) { + return; + } + + if (hashTree.getChildNodes().getLength() > 0) { + final NodeList childNodes = hashTree.getChildNodes(); + for (int i = 0; i < childNodes.getLength(); i++) { + Node node = childNodes.item(i); + if (node instanceof Element) { + Element ele = (Element) node; + if (invalid(ele)) { + continue; + } + + if (nodeNameEquals(ele, HASH_TREE_ELEMENT)) { + parseHashTree(ele); + } else { + if (nodeNameEquals(ele, STRING_PROP)) { + processStringProp(ele); + } + } + } + } + } + } + + private static void processStringProp(Element ele) { + String name = ele.getAttribute("name"); + NodeList childNodes; + switch (name) { + case "HTTPSampler.path": + childNodes = ele.getChildNodes(); + for (int i = 0; i < childNodes.getLength(); i++) { + Node node = childNodes.item(i); + if (node instanceof Element) { + String nodeValue = node.getNodeValue(); + System.out.println(nodeValue); + } + } + break; + case "Argument.value": + childNodes = ele.getChildNodes(); + for (int i = 0; i < childNodes.getLength(); i++) { + Node node = childNodes.item(i); + if (node instanceof Element) { + String nodeValue = node.getNodeValue(); + node.setNodeValue(ScriptEngineUtils.calculate(nodeValue)); + } + } + break; + default: + break; + } + } + + private static boolean nodeNameEquals(Node node, String desiredName) { + return desiredName.equals(node.getNodeName()) || desiredName.equals(node.getLocalName()); + } + + private static boolean invalid(Element ele) { + return !StringUtils.isBlank(ele.getAttribute("enabled")) && !Boolean.parseBoolean(ele.getAttribute("enabled")); + } + +} diff --git a/backend/src/main/java/io/metersphere/api/service/APITestService.java b/backend/src/main/java/io/metersphere/api/service/APITestService.java index 0c927b35ec..4dad243152 100644 --- a/backend/src/main/java/io/metersphere/api/service/APITestService.java +++ b/backend/src/main/java/io/metersphere/api/service/APITestService.java @@ -8,11 +8,15 @@ import io.metersphere.api.dto.scenario.request.dubbo.RegistryCenter; import io.metersphere.api.jmeter.JMeterService; import io.metersphere.api.parse.ApiImportParser; import io.metersphere.api.parse.ApiImportParserFactory; +import io.metersphere.api.parse.JmxDocumentParser; import io.metersphere.base.domain.*; import io.metersphere.base.mapper.ApiTestFileMapper; import io.metersphere.base.mapper.ApiTestMapper; import io.metersphere.base.mapper.ext.ExtApiTestMapper; -import io.metersphere.commons.constants.*; +import io.metersphere.commons.constants.APITestStatus; +import io.metersphere.commons.constants.FileType; +import io.metersphere.commons.constants.ScheduleGroup; +import io.metersphere.commons.constants.ScheduleType; import io.metersphere.commons.exception.MSException; import io.metersphere.commons.utils.BeanUtils; import io.metersphere.commons.utils.LogUtil; @@ -145,6 +149,8 @@ public class APITestService { MSException.throwException(Translator.get("file_cannot_be_null")); } byte[] bytes = fileService.loadFileAsBytes(file.getFileId()); + // 解析 xml 处理 mock 数据 + bytes = JmxDocumentParser.parse(bytes); InputStream is = new ByteArrayInputStream(bytes); APITestResult apiTest = get(request.getId()); diff --git a/backend/src/main/java/io/metersphere/commons/utils/ScriptEngineUtils.java b/backend/src/main/java/io/metersphere/commons/utils/ScriptEngineUtils.java new file mode 100644 index 0000000000..e169671ce9 --- /dev/null +++ b/backend/src/main/java/io/metersphere/commons/utils/ScriptEngineUtils.java @@ -0,0 +1,33 @@ +package io.metersphere.commons.utils; + +import org.apache.commons.io.IOUtils; + +import javax.script.ScriptEngine; +import javax.script.ScriptEngineManager; +import javax.script.ScriptException; +import java.nio.charset.StandardCharsets; + +public class ScriptEngineUtils { + private static final String ENGINE_NAME = "graal.js"; + private static ScriptEngine engine; + + static { + final ScriptEngineManager engineManager = new ScriptEngineManager(); + engine = engineManager.getEngineByName(ENGINE_NAME); + try { + String script = IOUtils.toString(ScriptEngineUtils.class.getResource("/javascript/func.js"), StandardCharsets.UTF_8); + engine.eval(script); + } catch (Exception e) { + LogUtil.error(e); + } + } + + public static String calculate(String input) { + try { + return engine.eval(input).toString(); + } catch (ScriptException e) { + LogUtil.error(e); + return input; + } + } +} diff --git a/backend/src/main/java/io/metersphere/performance/parse/xml/reader/jmx/JmeterDocumentParser.java b/backend/src/main/java/io/metersphere/performance/parse/xml/reader/jmx/JmeterDocumentParser.java index 60f1a40f46..5cdd5b3a54 100644 --- a/backend/src/main/java/io/metersphere/performance/parse/xml/reader/jmx/JmeterDocumentParser.java +++ b/backend/src/main/java/io/metersphere/performance/parse/xml/reader/jmx/JmeterDocumentParser.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import io.metersphere.commons.exception.MSException; import io.metersphere.commons.utils.CommonBeanFactory; +import io.metersphere.commons.utils.ScriptEngineUtils; import io.metersphere.config.KafkaProperties; import io.metersphere.i18n.Translator; import io.metersphere.performance.engine.EngineContext; @@ -377,7 +378,9 @@ public class JmeterDocumentParser implements DocumentParser { elementProp.setAttribute("name", jsonObject.getString("name")); elementProp.setAttribute("elementType", "Argument"); elementProp.appendChild(createStringProp(document, "Argument.name", jsonObject.getString("name"))); - elementProp.appendChild(createStringProp(document, "Argument.value", jsonObject.getString("value"))); + // 处理 mock data + String value = jsonObject.getString("value"); + elementProp.appendChild(createStringProp(document, "Argument.value", ScriptEngineUtils.calculate(value))); elementProp.appendChild(createStringProp(document, "Argument.metadata", "=")); item.appendChild(elementProp); } diff --git a/frontend/src/business/components/api/test/components/ApiBody.vue b/frontend/src/business/components/api/test/components/ApiBody.vue index 96fb5dcbaa..5b0a235e65 100644 --- a/frontend/src/business/components/api/test/components/ApiBody.vue +++ b/frontend/src/business/components/api/test/components/ApiBody.vue @@ -2,17 +2,22 @@
- {{$t('api_test.request.body_kv')}} + {{ $t('api_test.request.body_kv') }} - {{$t('api_test.request.body_text')}} + {{ $t('api_test.request.body_text') }} - - +
@@ -22,7 +27,7 @@ diff --git a/frontend/src/business/components/api/test/components/ApiVariable.vue b/frontend/src/business/components/api/test/components/ApiVariable.vue index ed208bd3f5..de092e23cb 100644 --- a/frontend/src/business/components/api/test/components/ApiVariable.vue +++ b/frontend/src/business/components/api/test/components/ApiVariable.vue @@ -34,13 +34,14 @@
-
+ + diff --git a/frontend/src/business/components/api/test/components/request/ApiHttpRequestForm.vue b/frontend/src/business/components/api/test/components/request/ApiHttpRequestForm.vue index 0da2523a54..a3e8ff3c1f 100644 --- a/frontend/src/business/components/api/test/components/request/ApiHttpRequestForm.vue +++ b/frontend/src/business/components/api/test/components/request/ApiHttpRequestForm.vue @@ -68,6 +68,12 @@ + + + + + + @@ -81,10 +87,13 @@ import MsApiExtract from "../extract/ApiExtract"; import ApiRequestMethodSelect from "../collapse/ApiRequestMethodSelect"; import {REQUEST_HEADERS} from "@/common/js/constants"; import MsApiVariable from "@/business/components/api/test/components/ApiVariable"; +import MsBeanShellProcessor from "../processor/BeanShellProcessor"; export default { name: "MsApiHttpRequestForm", - components: {MsApiVariable, ApiRequestMethodSelect, MsApiExtract, MsApiAssertions, MsApiBody, MsApiKeyValue}, + components: { + MsBeanShellProcessor, + MsApiVariable, ApiRequestMethodSelect, MsApiExtract, MsApiAssertions, MsApiBody, MsApiKeyValue}, props: { request: HttpRequest, scenario: Scenario, diff --git a/frontend/src/business/components/common/components/MsCodeEdit.vue b/frontend/src/business/components/common/components/MsCodeEdit.vue index 5e50d959db..4c0f1ca14f 100644 --- a/frontend/src/business/components/common/components/MsCodeEdit.vue +++ b/frontend/src/business/components/common/components/MsCodeEdit.vue @@ -1,5 +1,5 @@