用例编排功能优化

This commit is contained in:
liangdaliang
2025-03-19 13:09:01 +08:00
parent 8c676dc30a
commit ad3e95bd73
5 changed files with 81 additions and 16 deletions

View File

@@ -17,6 +17,7 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.concurrent.CompletableFuture;
/**
* 用例Controller
@@ -87,6 +88,10 @@ public class TestCaseController extends BaseController {
@PostMapping("/run")
public AjaxResult run(@RequestBody IDQO qo) {
log.info("执行用例 id:{}, jmeterHomePath:{}", qo.getId(), jmeterHomePath);
return success(testCaseService.executeTestCaseById(qo.getId(), jmeterHomePath));
// 异步执行任务
CompletableFuture.runAsync(() -> {
testCaseService.executeTestCaseById(qo.getId(), jmeterHomePath);
});
return toAjax(true);
}
}

View File

@@ -6,7 +6,7 @@
</el-form-item>
</el-form>
<el-tabs>
<el-tab-pane label="用例编排">
<el-tab-pane label="接口编排">
<step @submit="submit"/>
</el-tab-pane>
<!-- <el-tab-pane label="操作日志">-->
@@ -96,7 +96,7 @@ export default {
}).then(res => {
this.$message.success("修改成功");
this.loading = false;
this.$tab.closeOpenPage({path: "/case"});
// this.$tab.closeOpenPage({path: "/case"});
})
}
}

View File

@@ -99,7 +99,7 @@
<el-table-column label="提取对象">
<template slot-scope="scope">
<el-select v-model="form.assignment[scope.$index].content" style="width: 100%;" placeholder="请选择提取对象">
<el-option v-for="dict in dict.type.extract_object" :key="dict.value" :label="dict.label" :value="dict.value" @change="e => handleTableEdit(e, 'assignment', scope)"/>
<el-option v-for="dict in extract_object" :key="dict.value" :label="dict.label" :value="dict.value" @change="e => handleTableEdit(e, 'assignment', scope)"/>
</el-select>
<!-- <el-input placeholder="请输入提取对象" v-model="form.assignment[scope.$index].content" @input="e => handleTableEdit(e, 'assignment', scope)" clearable/>-->
</template>
@@ -130,9 +130,6 @@
<el-tab-pane label="响应体" name="responseBody">
<codemirror v-model="resultLog.responseBody" :options="editorOptions" v-if="resultLog.responseBody"/>
</el-tab-pane>
<el-tab-pane label="sql结果" name="sqlResult">
<codemirror v-model="resultLog.sqlResult" :options="editorOptions" v-if="resultLog.sqlResult"/>
</el-tab-pane>
</el-tabs>
</el-collapse-item>
</el-collapse>
@@ -206,7 +203,7 @@ import {getCaseStepResultLog} from "@/api/test/caseStep";
export default {
components: {FolderPage, JsonEditorVue, codemirror},
dicts: ['http_method', 'http_protocol','extract_type','extract_object','assert_condition'],
dicts: ['http_method', 'http_protocol','extract_type','assert_condition'],
props: {
form: {
type: Object
@@ -231,6 +228,16 @@ export default {
pageSize: 10,
groupId: null,
},
extract_object: [{
value: '${RESPONSE_BODY}',
label: '${RESPONSE_BODY}'
}, {
value: '${RESPONSE_HEADER}',
label: '${RESPONSE_HEADER}'
}, {
value: '${RESPONSE_CODE}',
label: '${RESPONSE_CODE}'
}],
resultLog: {
requestHeader: '',
requestBody: '',
@@ -238,7 +245,6 @@ export default {
responseBody: '',
sqlResult: ''
},
title: '111111',
activeNames: 'requestHeader',
activeTabs: 'requestHeader',
editorOptions: {

View File

@@ -20,12 +20,18 @@
</el-table-column>
<el-table-column label="提取方式">
<template slot-scope="scope">
<el-input placeholder="请输入提取方式" v-model="form.assignment[scope.$index].type" @input="e => handleTableEdit(e, 'assignment', scope)" clearable/>
<el-select v-model="form.assignment[scope.$index].type" style="width: 100%;" placeholder="请选择提取方式">
<el-option v-for="dict in dict.type.extract_type" :key="dict.value" :label="dict.label" :value="dict.value" @change="e => handleTableEdit(e, 'assignment', scope)"/>
</el-select>
<!-- <el-input placeholder="请输入提取方式" v-model="form.assignment[scope.$index].type" @input="e => handleTableEdit(e, 'assignment', scope)" clearable/>-->
</template>
</el-table-column>
<el-table-column label="提取对象">
<template slot-scope="scope">
<el-input placeholder="请输入提取对象" v-model="form.assignment[scope.$index].content" @input="e => handleTableEdit(e, 'assignment', scope)" clearable/>
<el-select v-model="form.assignment[scope.$index].content" style="width: 100%;" placeholder="请选择提取对象">
<el-option v-for="dict in extract_object" :key="dict.value" :label="dict.label" :value="dict.value" @change="e => handleTableEdit(e, 'assignment', scope)"/>
</el-select>
<!-- <el-input placeholder="请输入提取对象" v-model="form.assignment[scope.$index].content" @input="e => handleTableEdit(e, 'assignment', scope)" clearable/>-->
</template>
</el-table-column>
<el-table-column label="提取表达式">
@@ -39,6 +45,15 @@
</template>
</el-table-column>
</el-table>
<el-collapse v-model="activeNames" accordion v-if="form.testCaseResultList" @change="handleLogChange">
<el-collapse-item :title="itemSub.title" :name="itemSub.title" v-for="(itemSub, index) in form.testCaseResultList" :key="index">
<el-tabs v-model="activeTabs">
<el-tab-pane label="sql结果" name="sqlResult">
<codemirror v-model="resultLog.sqlResult" :options="editorOptions" v-if="resultLog.sqlResult"/>
</el-tab-pane>
</el-tabs>
</el-collapse-item>
</el-collapse>
</el-tab-pane>
<el-tab-pane label="校验" name="assertion">
<el-table :data="form.assertion">
@@ -54,7 +69,10 @@
</el-table-column>
<el-table-column label="条件">
<template slot-scope="scope">
<el-input placeholder="请输入条件" v-model="form.assertion[scope.$index].fn" @input="e => handleTableEdit(e, 'assertion', scope)" clearable/>
<el-select v-model="form.assertion[scope.$index].fn" style="width: 100%;" placeholder="请选择条件">
<el-option v-for="dict in dict.type.assert_condition" :key="dict.value" :label="dict.label" :value="dict.value" @change="e => handleTableEdit(e, 'assertion', scope)"/>
</el-select>
<!-- <el-input placeholder="请输入条件" v-model="form.assertion[scope.$index].fn" @input="e => handleTableEdit(e, 'assertion', scope)" clearable/>-->
</template>
</el-table-column>
<el-table-column label="内容">
@@ -79,9 +97,11 @@ import "codemirror/lib/codemirror.css";
import "codemirror/mode/sql/sql"; // 语言模式
import "codemirror/theme/dracula.css";
import "codemirror/addon/display/autorefresh";
import {getCaseStepResultLog} from "@/api/test/caseStep";
export default {
components: { codemirror },
dicts: ['extract_type','assert_condition'],
props: {
form: {
type: Object
@@ -93,6 +113,19 @@ export default {
data() {
return {
activeName: "sql",
extract_object: [{
value: '${RESULT_DATA}',
label: '${RESULT_DATA}'
}],
resultLog: {
requestHeader: '',
requestBody: '',
responseHeader: '',
responseBody: '',
sqlResult: ''
},
activeNames: 'sqlResult',
activeTabs: 'sqlResult',
editorOptions: {
autoRefresh: true,
mode: "sql", // 代码语言
@@ -102,6 +135,16 @@ export default {
}
}
},
methods: {
handleLogChange(val) {
const selectedItem = this.form.testCaseResultList.find(item => item.title === val);
if (selectedItem) {
getCaseStepResultLog(selectedItem.id).then(res => {
this.resultLog = res.data;
});
}
},
}
}
</script>

View File

@@ -1,14 +1,18 @@
<template>
<div v-loading="loading">
<div style="margin-bottom:20px;">
<div style="margin-bottom:20px;" v-if="isVisible">
<el-dropdown trigger="click" @command="handleAdd">
<el-button type="primary" plain icon="el-icon-plus" size="mini">添加步骤</el-button>
<el-button type="primary" plain icon="el-icon-caret-right" size="mini" @click="handleRun(id)">调试</el-button>
<el-button type="primary" plain icon="el-icon-caret-right" size="mini" :disabled="isVisible">调试</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item v-for="dict in dict.type.step_type" :command="dict.value" :key="dict.value">{{ dict.label }}</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
<div style="margin-bottom:20px;" v-if="!isVisible">
<el-button type="primary" plain icon="el-icon-edit" size="mini" @click="caseEditVisible">用例编排</el-button>
<el-button type="primary" plain icon="el-icon-caret-right" size="mini" @click="handleRun(id)">调试</el-button>
</div>
<div>
</div>
<el-collapse v-model="activeName" accordion v-if="list && list.length">
@@ -32,7 +36,7 @@
</el-collapse>
<el-empty v-else/>
<div class="footer">
<el-button type="primary" @click="submit"> </el-button>
<el-button type="primary" @click="submit" v-if="isVisible"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
<el-dialog title="操作日志详细" :visible.sync="open" >
@@ -61,6 +65,7 @@ export default {
data() {
return {
id: '',
isVisible: false,
loading: false,
open: false,
activeName: null,
@@ -153,6 +158,9 @@ export default {
},
methods: {
caseEditVisible() {
this.isVisible = true;
},
handleRun(id) {
this.$modal.confirm('是否确认执行用例?').then(function () {
return runCase(id);
@@ -207,10 +215,13 @@ export default {
});
},
submit() {
this.isVisible = false;
this.$emit("submit", this.list);
},
cancel() {
this.$tab.closeOpenPage({path: "/case"});
this.isVisible = false;
this.$tab.refreshPage({path: "/case/detail/?id=" + this.id})
// this.$tab.closeOpenPage({path: "/case"});
},
handleDel(index) {
this.list.splice(index, 1)