This commit is contained in:
2025-03-04 21:43:35 +08:00
parent 297158f0d4
commit c5b6866b26
6 changed files with 204 additions and 8 deletions

View File

@@ -50,6 +50,10 @@ export default {
saveStep(list) { saveStep(list) {
let p = [] let p = []
list.forEach((item) => { list.forEach((item) => {
item.assertion.pop();
item.assignment.pop();
item.requestHeader.pop();
item.requestParams.pop();
p.push({ p.push({
...item, ...item,
caseId: this.$route.query.id, caseId: this.$route.query.id,

View File

@@ -1,7 +1,7 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-form :model="form" ref="form"> <el-form :model="form" ref="form">
<el-form-item label="步骤名称" prop="name"> <el-form-item label="名称" prop="name">
<el-input v-model="form.name" placeholder="请输入步骤名称"/> <el-input v-model="form.name" placeholder="请输入步骤名称"/>
</el-form-item> </el-form-item>
<el-form-item label="接口" prop="uri"> <el-form-item label="接口" prop="uri">
@@ -211,7 +211,6 @@ export default {
}); });
}, },
linkApi(row) { linkApi(row) {
console.log(row)
this.open = false this.open = false
if (row) { if (row) {
this.form.requestMethod = row.method this.form.requestMethod = row.method

View File

@@ -1,6 +1,6 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-form :model="form" ref="form"> <el-form :model="form" ref="form" :inline="true">
<el-form-item label="循环次数" prop="count"> <el-form-item label="循环次数" prop="count">
<el-input v-model="form.count" placeholder="请输入循环次数"/> <el-input v-model="form.count" placeholder="请输入循环次数"/>
</el-form-item> </el-form-item>
@@ -8,17 +8,97 @@
<el-switch v-model="form.async" active-color="#13ce66" inactive-color="#ff4949" :active-value="0" :inactive-value="2"/> <el-switch v-model="form.async" active-color="#13ce66" inactive-color="#ff4949" :active-value="0" :inactive-value="2"/>
</el-form-item> </el-form-item>
</el-form> </el-form>
<div v-loading="loading">
<div style="margin-bottom:20px;">
<el-dropdown trigger="click" @command="handleAdd">
<el-button type="primary" plain icon="el-icon-plus" size="mini">添加步骤</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item command="1">HTTP接口</el-dropdown-item>
<el-dropdown-item command="2">数据库源</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
<el-collapse v-model="activeName" accordion>
<el-collapse-item :name="index" v-for="(item, index) in list" :key="index" v-if="item.parentId && item.parentId === form.id">
<template slot="title">
<el-button size="mini" plain type="warning" icon="el-icon-rank" circle style="margin-right: 12px"/>
<el-tag effect="plain" style="width: 70px;text-align: center;margin-right: 12px;">{{ dict.type.step_type.findLast(t => t.value == item.type).label }}</el-tag>
<el-tag v-if="item.name" effect="plain" style="width: 240px;text-align: center;margin-right: 12px;" type="info">{{ item.name }}</el-tag>
<el-tag v-if="item.datasourceId" effect="plain" style="width: 240px;text-align: center;margin-right: 12px;" type="info">{{ datasourceList.findLast(t => t.id === item.datasourceId).name }}</el-tag>
<el-tag v-if="item.requestUrl" effect="plain" style="text-align: center;margin-right: 12px;" type="success">{{ item.requestUrl }}</el-tag>
</template>
<el-button size="mini" type="text" @click="handleDel(index)" style="float: right">删除</el-button>
<page1 v-if="item.type == 1" :form="item" :hosts="hosts"/>
<page2 v-if="item.type == 2" :form="item" :datasourceList="datasourceList"/>
</el-collapse-item>
</el-collapse>
</div>
</div> </div>
</template> </template>
<script> <script>
import page1 from "@/views/test/case/detail/page1.vue";
import page2 from "@/views/test/case/detail/page2.vue";
export default { export default {
dicts: ['step_type'],
components: {page1, page2},
props: { props: {
form: { form: {
type: Object type: Object
},
hosts: {
type: Array
},
datasourceList: {
type: Array
},
list: {
type: Array
},
},
data() {
return {
loading: false,
activeName: null,
} }
}, },
methods: {
handleAdd(type) {
this.list.push({
name: "",
parentId: this.form.id,
type: type,
requestMethod: 'POST',
requestUrl: "",
apiHttpId: null,
requestHeader: [{
key: "",
value: "",
}],
requestParams: [{
key: "",
value: "",
}],
assignment:[{
name: "",
type: "",
content: "",
path: "",
}],
assertion:[{
name: "",
source: "",
fn: "",
target: ""
}],
requestBody: "",
});
},
handleDel(index) {
this.list.splice(index, 1)
}
}
} }
</script> </script>

View File

@@ -11,19 +11,97 @@
<JsonEditorVue mode="text" v-model="form.breakError" class="jse-theme-dark"/> <JsonEditorVue mode="text" v-model="form.breakError" class="jse-theme-dark"/>
</el-form-item> </el-form-item>
</el-form> </el-form>
<div v-loading="loading">
<div style="margin-bottom:20px;">
<el-dropdown trigger="click" @command="handleAdd">
<el-button type="primary" plain icon="el-icon-plus" size="mini">添加步骤</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item command="1">HTTP接口</el-dropdown-item>
<el-dropdown-item command="2">数据库源</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
<el-collapse v-model="activeName" accordion>
<el-collapse-item :name="index" v-for="(item, index) in list" :key="index" v-if="item.parentId && item.parentId === form.id">
<template slot="title">
<el-button size="mini" plain type="warning" icon="el-icon-rank" circle style="margin-right: 12px"/>
<el-tag effect="plain" style="width: 70px;text-align: center;margin-right: 12px;">{{ dict.type.step_type.findLast(t => t.value == item.type).label }}</el-tag>
<el-tag v-if="item.name" effect="plain" style="width: 240px;text-align: center;margin-right: 12px;" type="info">{{ item.name }}</el-tag>
<el-tag v-if="item.datasourceId" effect="plain" style="width: 240px;text-align: center;margin-right: 12px;" type="info">{{ datasourceList.findLast(t => t.id === item.datasourceId).name }}</el-tag>
<el-tag v-if="item.requestUrl" effect="plain" style="text-align: center;margin-right: 12px;" type="success">{{ item.requestUrl }}</el-tag>
</template>
<el-button size="mini" type="text" @click="handleDel(index)" style="float: right">删除</el-button>
<page1 v-if="item.type == 1" :form="item" :hosts="hosts"/>
<page2 v-if="item.type == 2" :form="item" :datasourceList="datasourceList"/>
</el-collapse-item>
</el-collapse>
</div>
</div> </div>
</template> </template>
<script> <script>
import JsonEditorVue from "json-editor-vue"; import JsonEditorVue from "json-editor-vue";
import page1 from "@/views/test/case/detail/page1.vue";
import page2 from "@/views/test/case/detail/page2.vue";
export default { export default {
components: {JsonEditorVue}, components: {page1, page2, JsonEditorVue},
props: { props: {
form: { form: {
type: Object type: Object
},
hosts: {
type: Array
},
datasourceList: {
type: Array
},
list: {
type: Array
},
},
data() {
return {
loading: false,
activeName: null,
} }
}, },
methods: {
handleAdd(type) {
this.list.push({
name: "",
parentId: this.form.id,
type: type,
requestMethod: 'POST',
requestUrl: "",
apiHttpId: null,
requestHeader: [{
key: "",
value: "",
}],
requestParams: [{
key: "",
value: "",
}],
assignment:[{
name: "",
type: "",
content: "",
path: "",
}],
assertion:[{
name: "",
source: "",
fn: "",
target: ""
}],
requestBody: "",
});
},
handleDel(index) {
this.list.splice(index, 1)
}
}
} }
</script> </script>

View File

@@ -9,18 +9,19 @@
</el-dropdown> </el-dropdown>
</div> </div>
<el-collapse v-model="activeName" accordion v-if="list && list.length"> <el-collapse v-model="activeName" accordion v-if="list && list.length">
<el-collapse-item :name="index" v-for="(item, index) in list" :key="index"> <el-collapse-item :name="index" v-for="(item, index) in list" :key="index" v-if="!item.parentId">
<template slot="title"> <template slot="title">
<el-button size="mini" plain type="warning" icon="el-icon-rank" circle style="margin-right: 12px"/> <el-button size="mini" plain type="warning" icon="el-icon-rank" circle style="margin-right: 12px"/>
<el-tag effect="plain" style="width: 70px;text-align: center;margin-right: 12px;">{{ dict.type.step_type.findLast(t => t.value == item.type).label }}</el-tag> <el-tag effect="plain" style="width: 70px;text-align: center;margin-right: 12px;">{{ dict.type.step_type.findLast(t => t.value == item.type).label }}</el-tag>
<el-tag v-if="item.name" effect="plain" style="width: 240px;text-align: center;margin-right: 12px;" type="info">{{ item.name }}</el-tag> <el-tag v-if="item.name" effect="plain" style="width: 240px;text-align: center;margin-right: 12px;" type="info">{{ item.name }}</el-tag>
<el-tag v-if="item.datasourceId" effect="plain" style="width: 240px;text-align: center;margin-right: 12px;" type="info">{{ datasourceList.findLast(t => t.id === item.datasourceId).name }}</el-tag>
<el-tag v-if="item.requestUrl" effect="plain" style="text-align: center;margin-right: 12px;" type="success">{{ item.requestUrl }}</el-tag> <el-tag v-if="item.requestUrl" effect="plain" style="text-align: center;margin-right: 12px;" type="success">{{ item.requestUrl }}</el-tag>
</template> </template>
<el-button size="mini" type="text" @click="handleDel(index)" style="float: right">删除</el-button> <el-button size="mini" type="text" @click="handleDel(index)" style="float: right">删除</el-button>
<page1 v-if="item.type == 1" :form="item" :hosts="hosts"/> <page1 v-if="item.type == 1" :form="item" :hosts="hosts"/>
<page2 v-if="item.type == 2" :form="item" :datasourceList="datasourceList"/> <page2 v-if="item.type == 2" :form="item" :datasourceList="datasourceList"/>
<page3 v-if="item.type == 3" :form="item" :list="list"/> <page3 v-if="item.type == 3" :form="item" :list="list" :hosts="hosts" :datasourceList="datasourceList"/>
<page4 v-if="item.type == 4" :form="item" :list="list"/> <page4 v-if="item.type == 4" :form="item" :list="list" :hosts="hosts" :datasourceList="datasourceList"/>
</el-collapse-item> </el-collapse-item>
</el-collapse> </el-collapse>
<el-empty v-else/> <el-empty v-else/>
@@ -61,7 +62,37 @@ export default {
this.datasourceList = res.data; this.datasourceList = res.data;
}) })
listCaseStep({caseId: this.$route.query.id}).then(res => { listCaseStep({caseId: this.$route.query.id}).then(res => {
this.list = res.data; this.list = [];
res.data.forEach(item => {
let p = {
...item,
assertion: item.assertion ? JSON.parse(item.assertion) : [],
assignment: item.assignment ? JSON.parse(item.assignment) : [],
requestHeader: item.requestHeader ? JSON.parse(item.requestHeader) : [],
requestParams: item.requestParams ? JSON.parse(item.requestParams) : []
}
p.assertion.push({
name: "",
source: "",
fn: "",
target: ""
})
p.assignment.push({
name: "",
type: "",
content: "",
path: "",
})
p.requestHeader.push({
key: "",
value: "",
})
p.requestParams.push({
key: "",
value: "",
})
this.list.push(p)
})
this.loading = false; this.loading = false;
}); });

View File

@@ -14,6 +14,7 @@
<el-table-column label="创建时间" align="center" prop="createTime"/> <el-table-column label="创建时间" align="center" prop="createTime"/>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleRun(scope.row.id)">执行</el-button>
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row.id)">删除</el-button> <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row.id)">删除</el-button>
</template> </template>
</el-table-column> </el-table-column>
@@ -79,6 +80,9 @@ export default {
} }
}); });
}, },
handleRun(id) {
console.log(id)
},
handleRowClick(row) { handleRowClick(row) {
this.$tab.openPage(`用例[${row.name}]`, "/case/detail", {id: row.id}); this.$tab.openPage(`用例[${row.name}]`, "/case/detail", {id: row.id});
}, },