diff --git a/backend/src/main/java/io/metersphere/api/service/ApiAutomationService.java b/backend/src/main/java/io/metersphere/api/service/ApiAutomationService.java
index 3fc87894f6..218968ca34 100644
--- a/backend/src/main/java/io/metersphere/api/service/ApiAutomationService.java
+++ b/backend/src/main/java/io/metersphere/api/service/ApiAutomationService.java
@@ -1393,9 +1393,11 @@ public class ApiAutomationService {
if (map != null) {
map.keySet().forEach(id -> {
ApiTestEnvironmentWithBLOBs environment = environmentService.get(map.get(id));
- EnvironmentConfig env = JSONObject.parseObject(environment.getConfig(), EnvironmentConfig.class);
- env.setApiEnvironmentid(environment.getId());
- envConfig.put(id, env);
+ if (environment != null && environment.getConfig() != null) {
+ EnvironmentConfig env = JSONObject.parseObject(environment.getConfig(), EnvironmentConfig.class);
+ env.setApiEnvironmentid(environment.getId());
+ envConfig.put(id, env);
+ }
});
}
try {
diff --git a/frontend/src/business/components/api/automation/report/SysnApiReportDetail.vue b/frontend/src/business/components/api/automation/report/SysnApiReportDetail.vue
index d94630e130..232036a4de 100644
--- a/frontend/src/business/components/api/automation/report/SysnApiReportDetail.vue
+++ b/frontend/src/business/components/api/automation/report/SysnApiReportDetail.vue
@@ -449,7 +449,9 @@ export default {
.report-header {
font-size: 15px;
}
-
+/deep/ .el-card__body{
+ padding: 0px;
+}
.report-header a {
text-decoration: none;
}
diff --git a/frontend/src/business/components/api/automation/scenario/EditApiScenario.vue b/frontend/src/business/components/api/automation/scenario/EditApiScenario.vue
index 07820a5870..50e397037a 100644
--- a/frontend/src/business/components/api/automation/scenario/EditApiScenario.vue
+++ b/frontend/src/business/components/api/automation/scenario/EditApiScenario.vue
@@ -195,7 +195,7 @@
:allow-drop="allowDrop" @node-drag-end="allowDrag" @node-click="nodeClick" v-if="!loading" draggable ref="stepTree">
-
@@ -416,6 +416,7 @@ export default {
stopDebug: "",
isTop: false,
stepSize: 0,
+ message: "",
}
},
created() {
@@ -509,6 +510,7 @@ export default {
if (e.data) {
let data = JSON.parse(e.data);
this.formatResult(data);
+ this.message = getUUID();
if (data.end) {
this.removeReport();
this.debugLoading = false;
@@ -561,7 +563,7 @@ export default {
}
this.debugResult = resMap;
this.sort();
- this.reload();
+ // this.reload();
this.reloadDebug = getUUID();
},
removeReport() {
@@ -709,72 +711,42 @@ export default {
this.isBtnHide = true;
this.$refs.scenarioApiRelevance.open();
},
- recursiveSorting(arr, scenarioProjectId) {
- for (let i in arr) {
- arr[i].index = Number(i) + 1;
- if (!arr[i].resourceId) {
- arr[i].resourceId = getUUID();
- }
- if (arr[i].type === ELEMENT_TYPE.LoopController && arr[i].loopType === "LOOP_COUNT" && arr[i].hashTree && arr[i].hashTree.length > 1) {
- arr[i].countController.proceed = true;
- }
- if (!arr[i].projectId) {
- // 如果自身没有ID并且场景有ID则赋值场景ID,否则赋值当前项目ID
- arr[i].projectId = scenarioProjectId ? scenarioProjectId : this.projectId;
- } else {
- const project = this.projectList.find(p => p.id === arr[i].projectId);
- if (!project) {
- arr[i].projectId = scenarioProjectId ? scenarioProjectId : this.projectId;
- }
- }
- // 添加debug结果
- let key = arr[i].resourceId;
- if (this.debugResult && this.debugResult.get(key)) {
- arr[i].requestResult = this.debugResult.get(key);
- arr[i].result = null;
- arr[i].debug = this.debug;
- this.findNode(key, arr[i].requestResult[0].success);
- }
- if (arr[i].hashTree && arr[i].hashTree.length > 0) {
- this.stepSize += arr[i].hashTree.length;
- this.recursiveSorting(arr[i].hashTree, arr[i].projectId);
- }
+ sort(stepArray, scenarioProjectId) {
+ if (!stepArray) {
+ stepArray = this.scenarioDefinition;
}
- },
- sort() {
- this.stepSize = this.scenarioDefinition.length;
- for (let i in this.scenarioDefinition) {
- // 排序
- this.scenarioDefinition[i].index = Number(i) + 1;
- if (!this.scenarioDefinition[i].resourceId) {
- this.scenarioDefinition[i].resourceId = getUUID();
+ for (let i in stepArray) {
+ stepArray[i].index = Number(i) + 1;
+ if (!stepArray[i].resourceId) {
+ stepArray[i].resourceId = getUUID();
}
- // 设置循环控制
- if (this.scenarioDefinition[i].type === ELEMENT_TYPE.LoopController && this.scenarioDefinition[i].hashTree
- && this.scenarioDefinition[i].hashTree.length > 1) {
- this.scenarioDefinition[i].countController.proceed = true;
+ if (stepArray[i].type === ELEMENT_TYPE.LoopController
+ && stepArray[i].loopType === "LOOP_COUNT"
+ && stepArray[i].hashTree
+ && stepArray[i].hashTree.length > 1) {
+ stepArray[i].countController.proceed = true;
}
- // 设置项目ID
- if (!this.scenarioDefinition[i].projectId) {
- this.scenarioDefinition[i].projectId = this.projectId;
+ if (!stepArray[i].projectId) {
+ // 如果自身没有ID并且场景有ID则赋值场景ID,否则赋值当前项目ID
+ stepArray[i].projectId = scenarioProjectId ? scenarioProjectId : this.projectId;
} else {
- const project = this.projectList.find(p => p.id === this.scenarioDefinition[i].projectId);
+ const project = this.projectList.find(p => p.id === stepArray[i].projectId);
if (!project) {
- this.scenarioDefinition[i].projectId = this.projectId;
+ stepArray[i].projectId = scenarioProjectId ? scenarioProjectId : this.projectId;
}
}
-
- if (this.scenarioDefinition[i].hashTree !== undefined && this.scenarioDefinition[i].hashTree.length > 0) {
- this.stepSize += this.scenarioDefinition[i].hashTree.length;
- this.recursiveSorting(this.scenarioDefinition[i].hashTree, this.scenarioDefinition[i].projectId);
- }
// 添加debug结果
- if (this.debugResult && this.debugResult.get(this.scenarioDefinition[i].resourceId)) {
- this.scenarioDefinition[i].result = null;
- this.scenarioDefinition[i].requestResult = this.debugResult.get(this.scenarioDefinition[i].resourceId);
- this.scenarioDefinition[i].debug = this.debug;
+ let key = stepArray[i].resourceId;
+ if (this.debugResult && this.debugResult.get(key)) {
+ stepArray[i].requestResult = this.debugResult.get(key);
+ stepArray[i].result = null;
+ stepArray[i].debug = this.debug;
+ this.findNode(key, stepArray[i].requestResult[0].success);
+ }
+ if (stepArray[i].hashTree && stepArray[i].hashTree.length > 0) {
+ this.stepSize += stepArray[i].hashTree.length;
+ this.sort(stepArray[i].hashTree, stepArray[i].projectId);
}
-
}
},
addCustomizeApi(request) {
@@ -970,7 +942,6 @@ export default {
});
}
},
-
checkDataIsCopy() {
// 如果是复制按钮创建的场景,直接进行保存
if (this.currentScenario.copy) {
@@ -1148,8 +1119,7 @@ export default {
this.currentScenario.apiScenarioModuleId = this.currentModule.id;
}
this.currentScenario.projectId = this.projectId;
- }
- ,
+ },
runRefresh() {
if (!this.debug) {
this.debugVisible = true;
diff --git a/frontend/src/business/components/api/automation/scenario/component/ApiComponent.vue b/frontend/src/business/components/api/automation/scenario/component/ApiComponent.vue
index 6934a02347..0c9c03e346 100644
--- a/frontend/src/business/components/api/automation/scenario/component/ApiComponent.vue
+++ b/frontend/src/business/components/api/automation/scenario/component/ApiComponent.vue
@@ -23,7 +23,7 @@
{{ $t('api_test.scenario.reference') }}
-
+
{{ request.requestResult[0].success ? 'success' : 'error' }}
@@ -133,7 +133,8 @@ export default {
currentEnvironmentId: String,
projectList: Array,
expandedNode: Array,
- envMap: Map
+ envMap: Map,
+ message: String
},
components: {
TemplateComponent,
@@ -188,6 +189,9 @@ export default {
envMap() {
this.getEnvironments();
},
+ message() {
+ this.reload();
+ },
},
computed: {
displayColor() {
@@ -264,7 +268,7 @@ export default {
if (this.request.protocol === 'SQL' || this.request.type === 'JDBCSampler') {
if (this.environment && this.environment.config) {
let config = JSON.parse(this.environment.config);
- if(config && config.databaseConfigs) {
+ if (config && config.databaseConfigs) {
config.databaseConfigs.forEach(item => {
databaseConfigsOptions.push(item);
});
@@ -337,7 +341,10 @@ export default {
})
}
},
- recursiveSorting(arr) {
+ sort(arr) {
+ if (!arr) {
+ arr = this.request.hashTree;
+ }
for (let i in arr) {
arr[i].disabled = true;
arr[i].index = Number(i) + 1;
@@ -345,19 +352,7 @@ export default {
arr[i].resourceId = getUUID();
}
if (arr[i].hashTree != undefined && arr[i].hashTree.length > 0) {
- this.recursiveSorting(arr[i].hashTree);
- }
- }
- },
- sort() {
- for (let i in this.request.hashTree) {
- if (!this.request.hashTree[i].resourceId) {
- this.request.hashTree[i].resourceId = getUUID();
- }
- this.request.hashTree[i].disabled = true;
- this.request.hashTree[i].index = Number(i) + 1;
- if (this.request.hashTree[i].hashTree != undefined && this.request.hashTree[i].hashTree.length > 0) {
- this.recursiveSorting(this.request.hashTree[i].hashTree);
+ this.sort(arr[i].hashTree);
}
}
},
diff --git a/frontend/src/business/components/api/automation/scenario/component/ApiScenarioComponent.vue b/frontend/src/business/components/api/automation/scenario/component/ApiScenarioComponent.vue
index 2fb68febaa..d98d858c32 100644
--- a/frontend/src/business/components/api/automation/scenario/component/ApiScenarioComponent.vue
+++ b/frontend/src/business/components/api/automation/scenario/component/ApiScenarioComponent.vue
@@ -23,7 +23,7 @@
{{ getProjectName(scenario.projectId) }}
-
+
{{ getCode() }}
@@ -43,6 +43,7 @@ export default {
name: "ApiScenarioComponent",
props: {
scenario: {},
+ message: String,
node: {},
isMax: {
type: Boolean,
@@ -59,7 +60,11 @@ export default {
currentEnvironmentId: String,
projectList: Array
},
- watch: {},
+ watch: {
+ message() {
+ this.reload();
+ },
+ },
created() {
if (!this.scenario.projectId) {
this.scenario.projectId = getCurrentProjectID();
diff --git a/frontend/src/business/components/api/automation/scenario/component/ComponentConfig.vue b/frontend/src/business/components/api/automation/scenario/component/ComponentConfig.vue
index eaa4dd073f..30bcfb2785 100644
--- a/frontend/src/business/components/api/automation/scenario/component/ComponentConfig.vue
+++ b/frontend/src/business/components/api/automation/scenario/component/ComponentConfig.vue
@@ -4,7 +4,7 @@
+ @remove="remove" @copyRow="copyRow" @refReload="refReload" @openScenario="openScenario" :project-list="projectList" :env-map="envMap" :message="message"/>
@@ -28,6 +28,7 @@
components: {MsConstantTimer, MsIfController, MsTransactionController, MsJsr233Processor, MsApiAssertions, MsApiExtract, MsApiComponent, MsLoopController, MsApiScenarioComponent, MsJdbcProcessor,JmeterElementComponent},
props: {
type: String,
+ message: String,
scenario: {},
draggable: {
type: Boolean,
diff --git a/frontend/src/business/components/api/automation/scenario/component/IfController.vue b/frontend/src/business/components/api/automation/scenario/component/IfController.vue
index b3c6785e94..77134af11f 100644
--- a/frontend/src/business/components/api/automation/scenario/component/IfController.vue
+++ b/frontend/src/business/components/api/automation/scenario/component/IfController.vue
@@ -27,7 +27,7 @@
-
+
{{ getCode() }}
@@ -43,6 +43,7 @@
props: {
controller: {},
node: {},
+ message: String,
isMax: {
type: Boolean,
default: false,
@@ -59,6 +60,7 @@
},
data() {
return {
+ loading: false,
operators: {
EQ: {
label: "commons.adv_search.operators.equals",
@@ -95,7 +97,18 @@
}
}
},
+ watch: {
+ message() {
+ this.reload();
+ },
+ },
methods: {
+ reload() {
+ this.loading = true
+ this.$nextTick(() => {
+ this.loading = false
+ })
+ },
getCode() {
if (this.node && this.node.data.debug) {
if (this.node.data.code && this.node.data.code === 'error') {
diff --git a/frontend/src/business/components/api/automation/scenario/component/JmeterElementComponent.vue b/frontend/src/business/components/api/automation/scenario/component/JmeterElementComponent.vue
index 10fa84ecdb..6c67cbbb22 100644
--- a/frontend/src/business/components/api/automation/scenario/component/JmeterElementComponent.vue
+++ b/frontend/src/business/components/api/automation/scenario/component/JmeterElementComponent.vue
@@ -15,7 +15,7 @@
-
+
{{ getCode() }}
@@ -38,6 +38,7 @@
type: Boolean,
default: false,
},
+ message: String,
isReadOnly: {
type: Boolean,
default:
@@ -59,7 +60,23 @@
defBackgroundColor: {type: String, default: "#F4F4FF"},
node: {},
},
+ data() {
+ return {
+ loading: false,
+ }
+ },
+ watch: {
+ message() {
+ this.reload();
+ },
+ },
methods: {
+ reload() {
+ this.loading = true
+ this.$nextTick(() => {
+ this.loading = false
+ })
+ },
getCode() {
if (this.node && this.node.data.debug) {
if (this.node.data.code && this.node.data.code === 'error') {
diff --git a/frontend/src/business/components/api/automation/scenario/component/LoopController.vue b/frontend/src/business/components/api/automation/scenario/component/LoopController.vue
index 40e5d7442f..7d075fc711 100644
--- a/frontend/src/business/components/api/automation/scenario/component/LoopController.vue
+++ b/frontend/src/business/components/api/automation/scenario/component/LoopController.vue
@@ -71,7 +71,7 @@
-
+
{{ getCode() }}
@@ -95,6 +95,7 @@ export default {
currentEnvironmentId: String,
currentScenario: {},
node: {},
+ message: String,
isMax: {
type: Boolean,
default: false,
@@ -156,6 +157,11 @@ export default {
},
};
},
+ watch: {
+ message() {
+ this.reload();
+ },
+ },
methods: {
getCode() {
if (this.node && this.node.data.debug) {
diff --git a/frontend/src/business/components/api/automation/scenario/component/TransactionController.vue b/frontend/src/business/components/api/automation/scenario/component/TransactionController.vue
index 0b8d5e0e30..523466a363 100644
--- a/frontend/src/business/components/api/automation/scenario/component/TransactionController.vue
+++ b/frontend/src/business/components/api/automation/scenario/component/TransactionController.vue
@@ -11,7 +11,7 @@
background-color="#FCF6EE"
:title="$t('api_test.automation.transcation_controller')">
-
+
{{ getCode() }}
@@ -34,6 +34,7 @@ export default {
props: {
controller: {},
node: {},
+ message: String,
isMax: {
type: Boolean,
default: false,
@@ -48,6 +49,11 @@ export default {
default: false,
},
},
+ watch: {
+ message() {
+ this.reload();
+ },
+ },
created() {
if (this.controller.generateParentSample == null) {
this.controller.generateParentSample = true;
@@ -58,6 +64,7 @@ export default {
},
data() {
return {
+ loading: false,
operators: {
EQ: {
label: "commons.adv_search.operators.equals",
@@ -95,6 +102,12 @@ export default {
}
},
methods: {
+ reload() {
+ this.loading = true;
+ this.$nextTick(() => {
+ this.loading = false;
+ });
+ },
getCode() {
if (this.node && this.node.data.debug) {
if (this.node.data.code && this.node.data.code === 'error') {