- {{$t('commons.adv_search.title')}}
+ {{ $t('commons.adv_search.title') }}
+
-
+ v-if="item.id == 'path'"
+ sortable="custom"
+ prop="path"
+ min-width="180px"
+ :label="$t('api_test.definition.api_path')"
+ show-overflow-tooltip
+ :key="index"/>
-
+
@@ -83,12 +86,12 @@
:key="index"/>
+ v-if="item.id=='updateTime'"
+ sortable="updateTime"
+ min-width="160"
+ :label="$t('api_test.definition.api_last_time')"
+ prop="updateTime"
+ :key="index">
{{ scope.row.updateTime | timestampFormatDate }}
@@ -154,7 +157,7 @@ import {parseEnvironment} from "@/business/components/api/test/model/Environment
import MsTableHeaderSelectPopover from "@/business/components/common/components/table/MsTableHeaderSelectPopover";
import MsTableAdvSearchBar from "@/business/components/common/components/search/MsTableAdvSearchBar";
import {API_CASE_CONFIGS} from "@/business/components/common/components/search/search-components";
-import {_filter, _handleSelect, _handleSelectAll, _sort, getLabel, getSystemLabel,} from "@/common/js/tableUtils";
+import {_filter, _handleSelect, _handleSelectAll, _sort, getLabel} from "@/common/js/tableUtils";
import {API_CASE_LIST} from "@/common/js/constants";
import {Api_Case_List} from "@/business/components/common/model/JsonData";
import HeaderCustom from "@/business/components/common/head/HeaderCustom";
@@ -179,110 +182,116 @@ export default {
ShowMoreBtn,
MsBatchEdit,
MsApiCaseTableExtendBtns,
- MsReferenceView,
- MsTableAdvSearchBar
+ MsReferenceView,
+ MsTableAdvSearchBar
+ },
+ data() {
+ return {
+ type: API_CASE_LIST,
+ headerItems: Api_Case_List,
+ tableLabel: [],
+ condition: {
+ components: API_CASE_CONFIGS
+ },
+ selectCase: {},
+ result: {},
+ moduleId: "",
+ selectDataRange: "all",
+ deletePath: "/test/case/delete",
+ selectRows: new Set(),
+ clickRow: {},
+ buttons: [
+ {name: this.$t('api_test.definition.request.batch_delete'), handleClick: this.handleDeleteBatch},
+ {name: this.$t('api_test.definition.request.batch_edit'), handleClick: this.handleEditBatch}
+ ],
+ typeArr: [
+ {id: 'priority', name: this.$t('test_track.case.priority')},
+ {id: 'method', name: this.$t('api_test.definition.api_type')},
+ {id: 'path', name: this.$t('api_test.request.path')},
+ ],
+ priorityFilters: [
+ {text: 'P0', value: 'P0'},
+ {text: 'P1', value: 'P1'},
+ {text: 'P2', value: 'P2'},
+ {text: 'P3', value: 'P3'}
+ ],
+ valueArr: {
+ priority: CASE_PRIORITY,
+ method: REQ_METHOD,
+ },
+ methodColorMap: new Map(API_METHOD_COLOUR),
+ tableData: [],
+ currentPage: 1,
+ pageSize: 10,
+ total: 0,
+ screenHeight: document.documentElement.clientHeight - 330,//屏幕高度
+ environmentId: undefined,
+ selectAll: false,
+ unSelection: [],
+ selectDataCounts: 0,
+ environments: [],
+ }
+ },
+ props: {
+ currentProtocol: String,
+ selectNodeIds: Array,
+ activeDom: String,
+ visible: {
+ type: Boolean,
+ default: false,
},
- data() {
- return {
- type: API_CASE_LIST,
- headerItems: Api_Case_List,
- tableLabel: [],
- condition: {
- components: API_CASE_CONFIGS
- },
- selectCase: {},
- result: {},
- moduleId: "",
- selectDataRange: "all",
- deletePath: "/test/case/delete",
- selectRows: new Set(),
- clickRow: {},
- buttons: [
- {name: this.$t('api_test.definition.request.batch_delete'), handleClick: this.handleDeleteBatch},
- {name: this.$t('api_test.definition.request.batch_edit'), handleClick: this.handleEditBatch}
- ],
- typeArr: [
- {id: 'priority', name: this.$t('test_track.case.priority')},
- {id: 'method', name: this.$t('api_test.definition.api_type')},
- {id: 'path', name: this.$t('api_test.request.path')},
- ],
- priorityFilters: [
- {text: 'P0', value: 'P0'},
- {text: 'P1', value: 'P1'},
- {text: 'P2', value: 'P2'},
- {text: 'P3', value: 'P3'}
- ],
- valueArr: {
- priority: CASE_PRIORITY,
- method: REQ_METHOD,
- },
- methodColorMap: new Map(API_METHOD_COLOUR),
- tableData: [],
- currentPage: 1,
- pageSize: 10,
- total: 0,
- screenHeight: document.documentElement.clientHeight - 330,//屏幕高度
- environmentId: undefined,
- selectAll: false,
- unSelection: [],
- selectDataCounts: 0,
- environments: [],
+ trashEnable: {
+ type: Boolean,
+ default: false,
+ },
+ isReadOnly: {
+ type: Boolean,
+ default: false
+ },
+ isCaseRelevance: {
+ type: Boolean,
+ default: false,
+ },
+ relevanceProjectId: String,
+ model: {
+ type: String,
+ default() {
+ 'api'
}
},
- props: {
- currentProtocol: String,
- selectNodeIds: Array,
- activeDom: String,
- visible: {
- type: Boolean,
- default: false,
- },
- trashEnable: {
- type: Boolean,
- default: false,
- },
- isReadOnly: {
- type: Boolean,
- default: false
- },
- isCaseRelevance: {
- type: Boolean,
- default: false,
- },
- relevanceProjectId: String,
- model: {
- type: String,
- default() {
- 'api'
- }
- },
- planId: String
- },
- created: function () {
+ planId: String
+ },
+ created: function () {
+ this.initTable();
+ this.$nextTick(() => {
+ this.$refs.caseTable.bodyWrapper.scrollTop = 5
+ })
+ },
+ watch: {
+ selectNodeIds() {
+ this.selectAll = false;
+ this.unSelection = [];
+ this.selectDataCounts = 0;
this.initTable();
- getSystemLabel(this, this.type)
- this.$nextTick(() => {
- this.$refs.caseTable.bodyWrapper.scrollTop = 5
- })
- getLabel(this, API_CASE_LIST);
},
- watch: {
- selectNodeIds() {
- getLabel(this, API_CASE_LIST);
- this.initTable();
- },
- currentProtocol() {
- this.initTable();
- },
- trashEnable() {
- if (this.trashEnable) {
- this.initTable();
- }
- },
- relevanceProjectId() {
+ currentProtocol() {
+ this.selectAll = false;
+ this.unSelection = [];
+ this.selectDataCounts = 0;
+ this.initTable();
+ },
+ trashEnable() {
+ if (this.trashEnable) {
+ this.selectAll = false;
+ this.unSelection = [];
+ this.selectDataCounts = 0;
this.initTable();
}
},
+ relevanceProjectId() {
+ this.initTable();
+ }
+ },
computed: {
// 接口定义用例列表
isApiModel() {
@@ -294,362 +303,395 @@ export default {
},
methods: {
customHeader() {
- getLabel(this, API_CASE_LIST);
this.$refs.headerCustom.open(this.tableLabel)
},
initTable() {
- getLabel(this, API_CASE_LIST);
this.selectRows = new Set();
this.condition.status = "";
this.condition.moduleIds = this.selectNodeIds;
if (this.trashEnable) {
- this.condition.status = "Trash";
- this.condition.moduleIds = [];
- }
+ this.condition.status = "Trash";
+ this.condition.moduleIds = [];
+ }
+ if(!this.selectAll){
this.selectAll = false;
this.unSelection = [];
this.selectDataCounts = 0;
- this.condition.projectId = this.projectId;
+ }
+ this.condition.projectId = this.projectId;
- if (this.currentProtocol != null) {
- this.condition.protocol = this.currentProtocol;
+ if (this.currentProtocol != null) {
+ this.condition.protocol = this.currentProtocol;
+ }
+
+ //检查是否只查询本周数据
+ this.isSelectThissWeekData();
+ this.condition.selectThisWeedData = false;
+ this.condition.id = null;
+ if (this.selectDataRange == 'thisWeekCount') {
+ this.condition.selectThisWeedData = true;
+ } else if (this.selectDataRange != null) {
+ let selectParamArr = this.selectDataRange.split("single:");
+
+ if (selectParamArr.length == 2) {
+ this.condition.id = selectParamArr[1];
}
+ }
+ if (this.condition.projectId) {
+ this.result = this.$post('/api/testcase/list/' + this.currentPage + "/" + this.pageSize, this.condition, response => {
+ this.total = response.data.itemCount;
+ this.tableData = response.data.listObject;
- //检查是否只查询本周数据
- this.isSelectThissWeekData();
- this.condition.selectThisWeedData = false;
- this.condition.id = null;
- if (this.selectDataRange == 'thisWeekCount') {
- this.condition.selectThisWeedData = true;
- } else if (this.selectDataRange != null) {
- let selectParamArr = this.selectDataRange.split("single:");
-
- if (selectParamArr.length == 2) {
- this.condition.id = selectParamArr[1];
- }
- }
- if (this.condition.projectId) {
- this.result = this.$post('/api/testcase/list/' + this.currentPage + "/" + this.pageSize, this.condition, response => {
- this.total = response.data.itemCount;
- this.tableData = response.data.listObject;
+ if(!this.selectAll){
this.unSelection = response.data.listObject.map(s => s.id);
+ }
- this.tableData.forEach(item => {
- if (item.tags && item.tags.length > 0) {
- item.tags = JSON.parse(item.tags);
- }
- })
- if (this.$refs.caseTable) {
- this.$refs.caseTable.doLayout()
+ this.tableData.forEach(item => {
+ if (item.tags && item.tags.length > 0) {
+ item.tags = JSON.parse(item.tags);
}
- });
- }
- getLabel(this, API_CASE_LIST);
-
- },
- open() {
- this.$refs.searchBar.open();
- },
- handleSelect(selection, row) {
- _handleSelect(this, selection, row, this.selectRows);
- this.selectRowsCount(this.selectRows)
- },
- showExecResult(row) {
- this.visible = false;
- this.$emit('showExecResult', row);
- },
- filter(filters) {
- _filter(filters, this.condition);
- this.initTable();
- },
- sort(column) {
- // 每次只对一个字段排序
- if (this.condition.orders) {
- this.condition.orders = [];
- }
- _sort(column, this.condition);
- this.initTable();
- },
- handleSelectAll(selection) {
- _handleSelectAll(this, selection, this.tableData, this.selectRows);
- this.selectRowsCount(this.selectRows)
- },
- search() {
- this.changeSelectDataRangeAll();
- this.initTable();
- },
- buildPagePath(path) {
- return path + "/" + this.currentPage + "/" + this.pageSize;
- },
-
- handleTestCase(testCase) {
- this.$get('/api/definition/get/' + testCase.apiDefinitionId, (response) => {
- let api = response.data;
- let selectApi = api;
- let request = {};
- if (Object.prototype.toString.call(api.request).match(/\[object (\w+)\]/)[1].toLowerCase() === 'object') {
- request = api.request;
- } else {
- request = JSON.parse(api.request);
- }
- if (!request.hashTree) {
- request.hashTree = [];
- }
- selectApi.url = request.path;
- this.$refs.caseList.open(selectApi, testCase.id);
- });
- },
- reductionApi(row) {
- let ids = [row.id];
- this.$post('/api/testcase/reduction/', ids, () => {
- this.$success(this.$t('commons.save_success'));
- this.search();
- });
- },
- handleDeleteBatch() {
- // if (this.trashEnable) {
- this.$alert(this.$t('api_test.definition.request.delete_confirm') + "?", '', {
- confirmButtonText: this.$t('commons.confirm'),
- callback: (action) => {
- if (action === 'confirm') {
- let obj = {};
- obj.projectId = this.projectId;
- obj.selectAllDate = this.isSelectAllDate;
- obj.unSelectIds = this.unSelection;
- obj.ids = Array.from(this.selectRows).map(row => row.id);
- obj = Object.assign(obj, this.condition);
- this.$post('/api/testcase/deleteBatchByParam/', obj, () => {
- this.selectRows.clear();
- this.initTable();
- this.$success(this.$t('commons.delete_success'));
- });
- }
- }
- });
- // } else {
- // this.$alert(this.$t('api_test.definition.request.delete_confirm') + "?", '', {
- // confirmButtonText: this.$t('commons.confirm'),
- // callback: (action) => {
- // if (action === 'confirm') {
- // let ids = Array.from(this.selectRows).map(row => row.id);
- // this.$post('/api/testcase/removeToGc/', ids, () => {
- // this.selectRows.clear();
- // this.initTable();
- // this.$success(this.$t('commons.delete_success'));
- // });
- // }
- // }
- // });
- // }
- },
- handleEditBatch() {
- if (this.currentProtocol == 'HTTP') {
- this.valueArr.method = REQ_METHOD;
- } else if (this.currentProtocol == 'TCP') {
- this.valueArr.method = TCP_METHOD;
- } else if (this.currentProtocol == 'SQL') {
- this.valueArr.method = SQL_METHOD;
- } else if (this.currentProtocol == 'DUBBO') {
- this.valueArr.method = DUBBO_METHOD;
- }
- this.$refs.batchEdit.open();
- },
- batchEdit(form) {
- let arr = Array.from(this.selectRows);
- let ids = arr.map(row => row.id);
- let param = {};
- param[form.type] = form.value;
- param.ids = ids;
- param.projectId = this.projectId;
- param.selectAllDate = this.isSelectAllDate;
- param.unSelectIds = this.unSelection;
- param = Object.assign(param, this.condition);
- this.$post('/api/testcase/batch/editByParam', param, () => {
- this.$success(this.$t('commons.save_success'));
- this.initTable();
- });
- },
- handleDelete(apiCase) {
- // if (this.trashEnable) {
- this.$alert(this.$t('api_test.definition.request.delete_confirm') + ' ' + apiCase.name + " ?", '', {
- confirmButtonText: this.$t('commons.confirm'),
- callback: (action) => {
- if (action === 'confirm') {
- this.$get('/api/testcase/delete/' + apiCase.id, () => {
- this.$success(this.$t('commons.delete_success'));
- this.initTable();
- });
- }
- }
- });
- return;
- },
- setEnvironment(data) {
- this.environmentId = data.id;
- },
- selectRowsCount(selection) {
- let selectedIDs = this.getIds(selection);
- let allIDs = this.tableData.map(s => s.id);
- this.unSelection = allIDs.filter(function (val) {
- return selectedIDs.indexOf(val) === -1
- });
- if (this.isSelectAllDate) {
- this.selectDataCounts = this.total - this.unSelection.length;
- } else {
- this.selectDataCounts = selection.size;
- }
- },
- isSelectDataAll(dataType) {
- this.isSelectAllDate = dataType;
- this.selectRowsCount(this.selectRows)
- //如果已经全选,不需要再操作了
- if (this.selectRows.size != this.tableData.length) {
- this.$refs.caseTable.toggleAllSelection(true);
- }
- },
- //判断是否只显示本周的数据。 从首页跳转过来的请求会带有相关参数
- isSelectThissWeekData() {
- this.selectDataRange = "all";
- let routeParam = this.$route.params.dataSelectRange;
- let dataType = this.$route.params.dataType;
- if (dataType === 'apiTestCase') {
- this.selectDataRange = routeParam;
- }
- },
- changeSelectDataRangeAll() {
- this.$emit("changeSelectDataRangeAll", "testCase");
- },
- getIds(rowSets) {
- let rowArray = Array.from(rowSets)
- let ids = rowArray.map(s => s.id);
- return ids;
- },
- showCaseRef(row) {
- let param = {};
- Object.assign(param, row);
- param.moduleId = undefined;
- this.$refs.viewRef.open(param);
- },
- showEnvironment(row) {
-
- let projectID = this.projectId;
- if (this.projectId) {
- this.$get('/api/environment/list/' + this.projectId, response => {
- this.environments = response.data;
- this.environments.forEach(environment => {
- parseEnvironment(environment);
- });
- });
- } else {
- this.environment = undefined;
- }
- this.clickRow = row;
- this.$refs.setEnvironment.open(row);
- },
- headerDragend(newWidth, oldWidth, column, event) {
- let finalWidth = newWidth;
- if (column.minWidth > finalWidth) {
- finalWidth = column.minWidth;
- }
- column.width = finalWidth;
- column.realWidth = finalWidth;
- },
- createPerformance(row, environment) {
- /**
- * 思路:调用后台创建性能测试的方法,把当前案例的hashTree在后台转化为jmx并文件创建性能测试。
- * 然后跳转到修改性能测试的页面
- *
- * 性能测试保存地址: performance/save
- *
- */
- if (!environment) {
- this.$warning(this.$t('api_test.environment.select_environment'));
- return;
- }
- let runData = [];
- let singleLoading = true;
- row.request = JSON.parse(row.request);
- row.request.name = row.id;
- row.request.useEnvironment = environment.id;
- runData.push(row.request);
- /*触发执行操作*/
- let testPlan = new TestPlan();
- let threadGroup = new ThreadGroup();
- threadGroup.hashTree = [];
- testPlan.hashTree = [threadGroup];
- runData.forEach(item => {
- threadGroup.hashTree.push(item);
- })
- let reqObj = {
- id: row.id,
- testElement: testPlan,
- name: row.name,
- projectId: this.projectId,
- };
- let bodyFiles = getBodyUploadFiles(reqObj, runData);
- reqObj.reportId = "run";
-
- let url = "/api/genPerformanceTestXml";
-
- this.$fileUpload(url, null, bodyFiles, reqObj, response => {
- let jmxObj = {};
- jmxObj.name = response.data.name;
- jmxObj.xml = response.data.xml;
- jmxObj.attachFiles = response.data.attachFiles;
- jmxObj.attachByteFiles = response.data.attachByteFiles;
- jmxObj.caseId = reqObj.id;
- this.$store.commit('setTest', {
- name: row.name,
- jmx: jmxObj
})
- this.$router.push({
- path: "/performance/test/create"
+ if (this.$refs.caseTable) {
+ setTimeout(() => {
+ this.$refs.caseTable.doLayout();
+ this.result.loading = false;
+ }, 500)
+ }
+ this.$nextTick(function(){
+ this.checkTableRowIsSelect();
})
- // let performanceId = response.data;
- // if(performanceId!=null){
- // this.$router.push({
- // path: "/performance/test/edit/"+performanceId,
- // })
- // }
- }, erro => {
- this.$emit('runRefresh', {});
});
- },
+ }
+ getLabel(this, API_CASE_LIST);
+
},
+ checkTableRowIsSelect(){
+ //如果默认全选的话,则选中应该选中的行
+ if(this.selectAll){
+ let unSelectIds = this.unSelection;
+ this.tableData.forEach(row=>{
+ if(unSelectIds.indexOf(row.id)<0){
+ this.$refs.caseTable.toggleRowSelection(row,true);
+
+ //默认全选,需要把选中对行添加到selectRows中。不然会影响到勾选函数统计
+ if (!this.selectRows.has(row)) {
+ this.$set(row, "showMore", true);
+ this.selectRows.add(row);
+ }
+ }else{
+ //不勾选的行,也要判断是否被加入了selectRow中。加入了的话就去除。
+ if (this.selectRows.has(row)) {
+ this.$set(row, "showMore", false);
+ this.selectRows.delete(row);
+ }
+ }
+ })
+ }
+ },
+
+ open() {
+ this.$refs.searchBar.open();
+ },
+ handleSelect(selection, row) {
+ _handleSelect(this, selection, row, this.selectRows);
+ this.selectRowsCount(this.selectRows)
+ },
+ showExecResult(row) {
+ this.visible = false;
+ this.$emit('showExecResult', row);
+ },
+ filter(filters) {
+ _filter(filters, this.condition);
+ this.initTable();
+ },
+ sort(column) {
+ // 每次只对一个字段排序
+ if (this.condition.orders) {
+ this.condition.orders = [];
+ }
+ _sort(column, this.condition);
+ this.initTable();
+ },
+ handleSelectAll(selection) {
+ _handleSelectAll(this, selection, this.tableData, this.selectRows);
+ this.selectRowsCount(this.selectRows)
+ },
+ search() {
+ this.changeSelectDataRangeAll();
+ this.initTable();
+ },
+ buildPagePath(path) {
+ return path + "/" + this.currentPage + "/" + this.pageSize;
+ },
+
+ handleTestCase(testCase) {
+ this.$get('/api/definition/get/' + testCase.apiDefinitionId, (response) => {
+ let api = response.data;
+ let selectApi = api;
+ let request = {};
+ if (Object.prototype.toString.call(api.request).match(/\[object (\w+)\]/)[1].toLowerCase() === 'object') {
+ request = api.request;
+ } else {
+ request = JSON.parse(api.request);
+ }
+ if (!request.hashTree) {
+ request.hashTree = [];
+ }
+ selectApi.url = request.path;
+ this.$refs.caseList.open(selectApi, testCase.id);
+ });
+ },
+ reductionApi(row) {
+ let ids = [row.id];
+ this.$post('/api/testcase/reduction/', ids, () => {
+ this.$success(this.$t('commons.save_success'));
+ this.search();
+ });
+ },
+ handleDeleteBatch() {
+ // if (this.trashEnable) {
+ this.$alert(this.$t('api_test.definition.request.delete_confirm') + "?", '', {
+ confirmButtonText: this.$t('commons.confirm'),
+ callback: (action) => {
+ if (action === 'confirm') {
+ let obj = {};
+ obj.projectId = this.projectId;
+ obj.selectAllDate = this.selectAll;
+ obj.unSelectIds = this.unSelection;
+ obj.ids = Array.from(this.selectRows).map(row => row.id);
+ obj = Object.assign(obj, this.condition);
+ this.$post('/api/testcase/deleteBatchByParam/', obj, () => {
+ this.selectRows.clear();
+ this.initTable();
+ this.$success(this.$t('commons.delete_success'));
+ });
+ }
+ }
+ });
+ // } else {
+ // this.$alert(this.$t('api_test.definition.request.delete_confirm') + "?", '', {
+ // confirmButtonText: this.$t('commons.confirm'),
+ // callback: (action) => {
+ // if (action === 'confirm') {
+ // let ids = Array.from(this.selectRows).map(row => row.id);
+ // this.$post('/api/testcase/removeToGc/', ids, () => {
+ // this.selectRows.clear();
+ // this.initTable();
+ // this.$success(this.$t('commons.delete_success'));
+ // });
+ // }
+ // }
+ // });
+ // }
+ },
+ handleEditBatch() {
+ if (this.currentProtocol == 'HTTP') {
+ this.valueArr.method = REQ_METHOD;
+ } else if (this.currentProtocol == 'TCP') {
+ this.valueArr.method = TCP_METHOD;
+ } else if (this.currentProtocol == 'SQL') {
+ this.valueArr.method = SQL_METHOD;
+ } else if (this.currentProtocol == 'DUBBO') {
+ this.valueArr.method = DUBBO_METHOD;
+ }
+ this.$refs.batchEdit.open();
+ },
+ batchEdit(form) {
+ let arr = Array.from(this.selectRows);
+ let ids = arr.map(row => row.id);
+ let param = {};
+ param[form.type] = form.value;
+ param.ids = ids;
+ param.projectId = this.projectId;
+ param.selectAllDate = this.selectAll;
+ param.unSelectIds = this.unSelection;
+ param = Object.assign(param, this.condition);
+ this.$post('/api/testcase/batch/editByParam', param, () => {
+ this.$success(this.$t('commons.save_success'));
+ this.initTable();
+ });
+ },
+ handleDelete(apiCase) {
+ // if (this.trashEnable) {
+ this.$alert(this.$t('api_test.definition.request.delete_confirm') + ' ' + apiCase.name + " ?", '', {
+ confirmButtonText: this.$t('commons.confirm'),
+ callback: (action) => {
+ if (action === 'confirm') {
+ this.$get('/api/testcase/delete/' + apiCase.id, () => {
+ this.$success(this.$t('commons.delete_success'));
+ this.initTable();
+ });
+ }
+ }
+ });
+ return;
+ },
+ setEnvironment(data) {
+ this.environmentId = data.id;
+ },
+ selectRowsCount(selection) {
+ let selectedIDs = this.getIds(selection);
+ let allIDs = this.tableData.map(s => s.id);
+ this.unSelection = allIDs.filter(function (val) {
+ return selectedIDs.indexOf(val) === -1
+ });
+ if (this.selectAll) {
+ this.selectDataCounts = this.total - this.unSelection.length;
+ } else {
+ this.selectDataCounts = selection.size;
+ }
+ },
+ isSelectDataAll(dataType) {
+ this.selectAll = dataType;
+ this.selectRowsCount(this.selectRows)
+ //如果已经全选,不需要再操作了
+ if (this.selectRows.size != this.tableData.length) {
+ this.$refs.caseTable.toggleAllSelection(true);
+ }
+ },
+ //判断是否只显示本周的数据。 从首页跳转过来的请求会带有相关参数
+ isSelectThissWeekData() {
+ this.selectDataRange = "all";
+ let routeParam = this.$route.params.dataSelectRange;
+ let dataType = this.$route.params.dataType;
+ if (dataType === 'apiTestCase') {
+ this.selectDataRange = routeParam;
+ }
+ },
+ changeSelectDataRangeAll() {
+ this.$emit("changeSelectDataRangeAll", "testCase");
+ },
+ getIds(rowSets) {
+ let rowArray = Array.from(rowSets)
+ let ids = rowArray.map(s => s.id);
+ return ids;
+ },
+ showCaseRef(row) {
+ let param = {};
+ Object.assign(param, row);
+ param.moduleId = undefined;
+ this.$refs.viewRef.open(param);
+ },
+ showEnvironment(row) {
+
+ let projectID = this.projectId;
+ if (this.projectId) {
+ this.$get('/api/environment/list/' + this.projectId, response => {
+ this.environments = response.data;
+ this.environments.forEach(environment => {
+ parseEnvironment(environment);
+ });
+ });
+ } else {
+ this.environment = undefined;
+ }
+ this.clickRow = row;
+ this.$refs.setEnvironment.open(row);
+ },
+ headerDragend(newWidth, oldWidth, column, event) {
+ let finalWidth = newWidth;
+ if (column.minWidth > finalWidth) {
+ finalWidth = column.minWidth;
+ }
+ column.width = finalWidth;
+ column.realWidth = finalWidth;
+ },
+ createPerformance(row, environment) {
+ /**
+ * 思路:调用后台创建性能测试的方法,把当前案例的hashTree在后台转化为jmx并文件创建性能测试。
+ * 然后跳转到修改性能测试的页面
+ *
+ * 性能测试保存地址: performance/save
+ *
+ */
+ if (!environment) {
+ this.$warning(this.$t('api_test.environment.select_environment'));
+ return;
+ }
+ let runData = [];
+ let singleLoading = true;
+ row.request = JSON.parse(row.request);
+ row.request.name = row.id;
+ row.request.useEnvironment = environment.id;
+ runData.push(row.request);
+ /*触发执行操作*/
+ let testPlan = new TestPlan();
+ let threadGroup = new ThreadGroup();
+ threadGroup.hashTree = [];
+ testPlan.hashTree = [threadGroup];
+ runData.forEach(item => {
+ threadGroup.hashTree.push(item);
+ })
+ let reqObj = {
+ id: row.id,
+ testElement: testPlan,
+ name: row.name,
+ projectId: this.projectId,
+ };
+ let bodyFiles = getBodyUploadFiles(reqObj, runData);
+ reqObj.reportId = "run";
+
+ let url = "/api/genPerformanceTestXml";
+
+ this.$fileUpload(url, null, bodyFiles, reqObj, response => {
+ let jmxObj = {};
+ jmxObj.name = response.data.name;
+ jmxObj.xml = response.data.xml;
+ jmxObj.attachFiles = response.data.attachFiles;
+ jmxObj.attachByteFiles = response.data.attachByteFiles;
+ jmxObj.caseId = reqObj.id;
+ this.$store.commit('setTest', {
+ name: row.name,
+ jmx: jmxObj
+ })
+ this.$router.push({
+ path: "/performance/test/create"
+ })
+ // let performanceId = response.data;
+ // if(performanceId!=null){
+ // this.$router.push({
+ // path: "/performance/test/edit/"+performanceId,
+ // })
+ // }
+ }, erro => {
+ this.$emit('runRefresh', {});
+ });
+ },
+ },
}
diff --git a/frontend/src/business/components/api/definition/components/list/ApiList.vue b/frontend/src/business/components/api/definition/components/list/ApiList.vue
index 58c0da0cb6..cd9169b499 100644
--- a/frontend/src/business/components/api/definition/components/list/ApiList.vue
+++ b/frontend/src/business/components/api/definition/components/list/ApiList.vue
@@ -235,7 +235,7 @@
import {
_handleSelect,
_handleSelectAll, buildBatchParam, getLabel,
- getSelectDataCounts, getSystemLabel, initCondition,
+ getSelectDataCounts, initCondition,
setUnSelectIds, toggleAllSelection
} from "@/common/js/tableUtils";
import {_filter, _sort} from "@/common/js/tableUtils";
@@ -380,16 +380,16 @@
} else {
this.condition.filters = {status: ["Prepare", "Underway", "Completed"]};
}
- this.getSystemLabel(this.type)
this.initTable();
this.getMaintainerOptions();
- getLabel(this, API_LIST);
},
watch: {
selectNodeIds() {
+ initCondition(this.condition,false);
this.initTable();
},
currentProtocol() {
+ initCondition(this.condition,false);
this.initTable();
},
trashEnable() {
@@ -399,21 +399,12 @@
} else {
this.condition.filters = {status: ["Prepare", "Underway", "Completed"]};
}
+ initCondition(this.condition,false);
this.initTable();
}
},
methods: {
- getSystemLabel(type) {
- let param = {}
- param.type = type
- this.$post('/system/system/header', param, response => {
- if (response.data != null) {
- this.tableLabel = eval(response.data.props);
- }
- })
- },
customHeader() {
- getLabel(this, API_LIST);
this.$refs.headerCustom.open(this.tableLabel)
},
handleBatchMove() {
@@ -421,7 +412,7 @@
},
initTable() {
this.selectRows = new Set();
- initCondition(this.condition);
+ initCondition(this.condition,this.condition.selectAll);
this.selectDataCounts = 0;
this.condition.moduleIds = this.selectNodeIds;
this.condition.projectId = this.projectId;
@@ -464,13 +455,42 @@
}
})
if (this.$refs.apiDefinitionTable) {
- this.$refs.apiDefinitionTable.doLayout()
+ setTimeout(() => {
+ this.$refs.apiDefinitionTable.doLayout();
+ this.result.loading = false;
+ }, 500)
}
-
+ // nexttick:表格加载完成之后触发。判断是否需要勾选行
+ this.$nextTick(function(){
+ this.checkTableRowIsSelect();
+ })
});
}
getLabel(this, API_LIST);
},
+ checkTableRowIsSelect(){
+ //如果默认全选的话,则选中应该选中的行
+ if(this.condition.selectAll){
+ let unSelectIds = this.condition.unSelectIds;
+ this.tableData.forEach(row=>{
+ if(unSelectIds.indexOf(row.id)<0){
+ this.$refs.apiDefinitionTable.toggleRowSelection(row,true);
+
+ //默认全选,需要把选中对行添加到selectRows中。不然会影响到勾选函数统计
+ if (!this.selectRows.has(row)) {
+ this.$set(row, "showMore", true);
+ this.selectRows.add(row);
+ }
+ }else{
+ //不勾选的行,也要判断是否被加入了selectRow中。加入了的话就去除。
+ if (this.selectRows.has(row)) {
+ this.$set(row, "showMore", false);
+ this.selectRows.delete(row);
+ }
+ }
+ })
+ }
+ },
genProtocalFilter(protocalType) {
if (protocalType === "HTTP") {
this.methodFilters = [
diff --git a/frontend/src/business/components/api/definition/components/module/ApiModule.vue b/frontend/src/business/components/api/definition/components/module/ApiModule.vue
index 11eb4dfccb..d5b90d1b4e 100644
--- a/frontend/src/business/components/api/definition/components/module/ApiModule.vue
+++ b/frontend/src/business/components/api/definition/components/module/ApiModule.vue
@@ -20,6 +20,7 @@
:condition="condition"
:current-module="currentModule"
:is-read-only="isReadOnly"
+ :moduleOptions="extendTreeNodes"
@exportAPI="exportAPI"
@saveAsEdit="saveAsEdit"
@refreshTable="$emit('refreshTable')"
@@ -34,25 +35,25 @@
diff --git a/frontend/src/business/components/api/definition/model/NodeTree.js b/frontend/src/business/components/api/definition/model/NodeTree.js
index ab714f0a0d..694972537a 100644
--- a/frontend/src/business/components/api/definition/model/NodeTree.js
+++ b/frontend/src/business/components/api/definition/model/NodeTree.js
@@ -9,4 +9,16 @@ export function buildNodePath(node, option, moduleOptions) {
}
}
}
+// 构建树
+export function buildTree(node, option) {
+ option.id = node.id;
+ option.name = node.name;
+ option.path = option.path + '/' + node.name;
+ node.path = option.path;
+ if (node.children) {
+ for (let i = 0; i < node.children.length; i++) {
+ buildTree(node.children[i], {path: option.path});
+ }
+ }
+}
diff --git a/frontend/src/business/components/api/test/components/ApiEnvironmentConfig.vue b/frontend/src/business/components/api/test/components/ApiEnvironmentConfig.vue
index c534d2bd60..3c22c4b94f 100644
--- a/frontend/src/business/components/api/test/components/ApiEnvironmentConfig.vue
+++ b/frontend/src/business/components/api/test/components/ApiEnvironmentConfig.vue
@@ -46,13 +46,15 @@
icon: 'el-icon-delete',
func: this.deleteEnvironment
}
- ]
+ ],
+ selectEnvironmentId: ''
}
},
methods: {
- open: function (projectId) {
+ open: function (projectId, envId) {
this.visible = true;
this.projectId = projectId;
+ this.selectEnvironmentId = envId;
this.getEnvironments();
listenGoBack(this.close);
},
@@ -114,7 +116,16 @@
this.result = this.$get('/api/environment/list/' + this.projectId, response => {
this.environments = response.data;
if (this.environments.length > 0) {
- this.$refs.environmentItems.itemSelected(0, this.environments[0]);
+ if (this.selectEnvironmentId) {
+ const index = this.environments.findIndex(e => e.id === this.selectEnvironmentId);
+ if (index !== -1) {
+ this.$refs.environmentItems.itemSelected(index, this.environments[index]);
+ } else {
+ this.$refs.environmentItems.itemSelected(0, this.environments[0]);
+ }
+ } else {
+ this.$refs.environmentItems.itemSelected(0, this.environments[0]);
+ }
} else {
let item = new Environment({
projectId: this.projectId
diff --git a/frontend/src/business/components/common/components/MsModuleMinder.vue b/frontend/src/business/components/common/components/MsModuleMinder.vue
index e13ea1f363..f0b4d03f19 100644
--- a/frontend/src/business/components/common/components/MsModuleMinder.vue
+++ b/frontend/src/business/components/common/components/MsModuleMinder.vue
@@ -155,7 +155,7 @@ export default {
width: 100%;
background: white;
height: 100vh;
- z-index: 999999;
+ z-index: 2;
}
.full-screen >>> .minder-container {
diff --git a/frontend/src/business/components/common/components/search/MsSearchBar.vue b/frontend/src/business/components/common/components/search/MsSearchBar.vue
new file mode 100644
index 0000000000..43188da64f
--- /dev/null
+++ b/frontend/src/business/components/common/components/search/MsSearchBar.vue
@@ -0,0 +1,78 @@
+
+
+
+
+
+ {{ $t('commons.more_operator') }}
+
+
+
+
+
+ {{ item.label }}
+
+
+
+ {{ item.label }}
+
+
+
+
+
+
+ {{child.label}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/business/components/common/head/HeaderCustom.vue b/frontend/src/business/components/common/head/HeaderCustom.vue
index 99bb68f0ae..bd8f9ad28a 100644
--- a/frontend/src/business/components/common/head/HeaderCustom.vue
+++ b/frontend/src/business/components/common/head/HeaderCustom.vue
@@ -52,6 +52,10 @@ export default {
this.defaultCheckedKeys.push(i.id)
}
)
+ if(this.type==='api_list'||this.type==='api_case_list'||this.type==='api_scenario_list'||this.type==='test_plan_function_test_case'
+ ||this.type==='test_plan_api_case'||this.type==='test_plan_load_case'||this.type==='test_plan_scenario_case'){
+ this.fieldSelected=items
+ }
},
saveHeader() {
let param = {
diff --git a/frontend/src/business/components/common/model/JsonData.js b/frontend/src/business/components/common/model/JsonData.js
index 57c5bc5b9a..f064c52d91 100644
--- a/frontend/src/business/components/common/model/JsonData.js
+++ b/frontend/src/business/components/common/model/JsonData.js
@@ -81,7 +81,6 @@ export const Test_Case_Review_Case_List = [
{id: 'name', label: i18n.t('commons.name')},
{id: 'priority', label: i18n.t('test_track.case.priority')},
{id: 'type', label: i18n.t('test_track.case.type')},
- {id: 'method', label: i18n.t('test_track.case.method')},
{id: 'nodePath', label: i18n.t('test_track.case.module')},
{id: 'projectName', label: i18n.t('test_track.review.review_project')},
{id: 'reviewerName', label: i18n.t('test_track.review.reviewer')},
@@ -107,7 +106,7 @@ export const Test_Plan_Function_Test_Case = [
//测试计划-api用例
export const Test_Plan_Api_Case = [
{id: 'num', label: i18n.t('commons.id')},
- {id: 'name', label: i18n.t('commons.name')},
+ {id: 'name', label: i18n.t('api_test.definition.api_name')},
{id: 'priority', label: i18n.t('test_track.case.priority')},
{id: 'path', label: i18n.t('api_test.definition.api_path')},
{id: 'createUser', label: '创建人'},
@@ -124,12 +123,12 @@ export const Test_Plan_Load_Case = [
{id: 'createTime', label: i18n.t('commons.create_time')},
{id: 'status', label: i18n.t('commons.status')},
{id: 'caseStatus', label: i18n.t('test_track.plan.load_case.execution_status')},
- {id: 'loadReportId', label: i18n.t('test_track.plan.load_case.view_report')},
+ {id: 'loadReportId', label: i18n.t('test_track.plan.load_case.report')},
]
//测试计划-场景用例
export const Test_Plan_Scenario_Case = [
{id: 'num', label: i18n.t('commons.id')},
- {id: 'name', label: i18n.t('commons.name')},
+ {id: 'name', label: i18n.t('api_test.automation.scenario_name')},
{id: 'level', label: i18n.t('api_test.automation.case_level')},
{id: 'tagNames', label: i18n.t('api_test.automation.tag')},
{id: 'userId', label: i18n.t('api_test.automation.creator')},
diff --git a/frontend/src/business/components/common/select-tree/SelectTree.vue b/frontend/src/business/components/common/select-tree/SelectTree.vue
index 945c3bd35d..903273af67 100644
--- a/frontend/src/business/components/common/select-tree/SelectTree.vue
+++ b/frontend/src/business/components/common/select-tree/SelectTree.vue
@@ -152,10 +152,13 @@
return JSON.stringify(this.data).indexOf(this.obj.children) !== -1 ? this.data : this.switchTree();
},
},
+ mounted() {
+ this.init();
+ },
methods: {
outsideClick(e) {
e.stopPropagation();
- this.isShowSelect=false;
+ this.isShowSelect = false;
},
init() {
if (this.defaultKey != undefined && this.defaultKey.length > 0) {
@@ -233,7 +236,9 @@
setKey(thisKey) {
this.$refs.tree.setCurrentKey(thisKey);
let node = this.$refs.tree.getNode(thisKey);
- this.setData(node.data);
+ if (node && node.data) {
+ this.setData(node.data);
+ }
},
//单选:设置、初始化对象
setData(data) {
@@ -284,7 +289,7 @@
},
//下拉框关闭执行
popoverHide() {
- this.$emit('getValue', this.returnDataKeys, this.returnDatas);
+ this.$emit('getValue', this.returnDataKeys, this.returnDatas ? this.returnDatas : {});
},
// 多选,清空所有勾选
clearSelectedNodes() {
@@ -340,10 +345,13 @@
// 隐藏select自带的下拉框
this.$refs.select.blur();
},
- treeData() {//监听tree数据
- this.$nextTick(() => {
- this.init();
- })
+ treeData: {//监听tree数据
+ handler: function () {
+ this.$nextTick(() => {
+ this.init();
+ })
+ },
+ deep: true
},
filterText(val) {
this.$nextTick(() => {
diff --git a/frontend/src/business/components/performance/report/PerformanceReportCompare.vue b/frontend/src/business/components/performance/report/PerformanceReportCompare.vue
new file mode 100644
index 0000000000..3193c0c973
--- /dev/null
+++ b/frontend/src/business/components/performance/report/PerformanceReportCompare.vue
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/business/components/performance/report/PerformanceReportView.vue b/frontend/src/business/components/performance/report/PerformanceReportView.vue
index 13a512d91e..9758cddeed 100644
--- a/frontend/src/business/components/performance/report/PerformanceReportView.vue
+++ b/frontend/src/business/components/performance/report/PerformanceReportView.vue
@@ -28,10 +28,6 @@
{{ $t('report.downloadJtl') }}
-
-
-
-
@@ -83,6 +79,7 @@
+
@@ -99,11 +96,13 @@ import {checkoutTestManagerOrTestUser, exportPdf} from "@/common/js/utils";
import html2canvas from 'html2canvas';
import MsPerformanceReportExport from "./PerformanceReportExport";
import {Message} from "element-ui";
+import SameTestReports from "@/business/components/performance/report/components/SameTestReports";
export default {
name: "PerformanceReportView",
components: {
+ SameTestReports,
MsPerformanceReportExport,
MsReportErrorLog,
MsReportLogDetails,
@@ -312,6 +311,9 @@ export default {
Message.error({message: JSON.parse(data).message || e.message, showClose: true});
});
});
+ },
+ compareReports() {
+ this.$refs.compareReports.open(this.report);
}
},
created() {
diff --git a/frontend/src/business/components/performance/report/PerformanceTestReportList.vue b/frontend/src/business/components/performance/report/PerformanceTestReportList.vue
index 02e4a052df..9f5faffcc8 100644
--- a/frontend/src/business/components/performance/report/PerformanceTestReportList.vue
+++ b/frontend/src/business/components/performance/report/PerformanceTestReportList.vue
@@ -25,37 +25,32 @@
{{ scope.row.createTime | timestampFormatDate }}
-
@@ -85,6 +80,7 @@
:total="total"/>
+
@@ -101,11 +97,14 @@ import MsTableHeader from "../../common/components/MsTableHeader";
import {LIST_CHANGE, PerformanceEvent} from "@/business/components/common/head/ListEvent";
import ShowMoreBtn from "../../track/case/components/ShowMoreBtn";
import {_filter, _sort} from "@/common/js/tableUtils";
-
+import MsDialogFooter from "@/business/components/common/components/MsDialogFooter";
+import SameTestReports from "@/business/components/performance/report/components/SameTestReports";
export default {
name: "PerformanceTestReportList",
components: {
+ SameTestReports,
+ MsDialogFooter,
MsTableHeader,
ReportTriggerModeItem,
MsTableOperatorButton,
@@ -200,6 +199,9 @@ export default {
}
});
},
+ handleDiff(report) {
+ this.$refs.compareReports.open(report);
+ },
_handleDeleteNoMsg(report) {
this.result = this.$post(this.deletePath + report.id, {}, () => {
this.initTableData();
diff --git a/frontend/src/business/components/performance/report/components/PerformancePressureConfig.vue b/frontend/src/business/components/performance/report/components/PerformancePressureConfig.vue
index ee9ebb5d74..769fb87c8c 100644
--- a/frontend/src/business/components/performance/report/components/PerformancePressureConfig.vue
+++ b/frontend/src/business/components/performance/report/components/PerformancePressureConfig.vue
@@ -1,24 +1,32 @@
-
+
-
- {{ threadGroup.attributes.testname }}
-
-
- {{ $t('load_test.thread_num') }}{{ threadGroup.threadNumber }},
- {{ $t('load_test.duration') }}: {{ threadGroup.duration }} {{ getUnitLabel(threadGroup) }}
-
-
- {{ $t('load_test.thread_num') }} {{ threadGroup.threadNumber }},
- {{ $t('load_test.iterate_num') }} {{ threadGroup.iterateNum }}
-
+
+
+
+
+ {{ threadGroup.attributes.testname }}
+
+
+
+
+
+ {{ $t('load_test.thread_num') }}{{ threadGroup.threadNumber }},
+ {{ $t('load_test.duration') }}: {{ threadGroup.duration }} {{ getUnitLabel(threadGroup) }}
+
+
+ {{ $t('load_test.thread_num') }} {{ threadGroup.threadNumber }},
+ {{ $t('load_test.iterate_num') }} {{ threadGroup.iterateNum }}
+
+
+
@@ -134,7 +142,7 @@
-
+
@@ -578,4 +586,9 @@ export default {
.title {
margin-left: 60px;
}
+.wordwrap {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
diff --git a/frontend/src/business/components/performance/report/components/RequestStatistics.vue b/frontend/src/business/components/performance/report/components/RequestStatistics.vue
index bbfd104715..06e59e8851 100644
--- a/frontend/src/business/components/performance/report/components/RequestStatistics.vue
+++ b/frontend/src/business/components/performance/report/components/RequestStatistics.vue
@@ -37,7 +37,7 @@
diff --git a/frontend/src/business/components/performance/report/components/SameTestReports.vue b/frontend/src/business/components/performance/report/components/SameTestReports.vue
new file mode 100644
index 0000000000..6e203f66fb
--- /dev/null
+++ b/frontend/src/business/components/performance/report/components/SameTestReports.vue
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.createTime | timestampFormatDate }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/business/components/performance/router.js b/frontend/src/business/components/performance/router.js
index 7b8f266e53..4ea1fe4d8c 100644
--- a/frontend/src/business/components/performance/router.js
+++ b/frontend/src/business/components/performance/router.js
@@ -1,5 +1,3 @@
-import MsProject from "@/business/components/settings/project/MsProject";
-
const PerformanceTest = () => import('@/business/components/performance/PerformanceTest')
const PerformanceTestHome = () => import('@/business/components/performance/home/PerformanceTestHome')
const EditPerformanceTest = () => import('@/business/components/performance/test/EditPerformanceTest')
@@ -7,6 +5,7 @@ const PerformanceTestList = () => import('@/business/components/performance/test
const PerformanceTestReportList = () => import('@/business/components/performance/report/PerformanceTestReportList')
const PerformanceChart = () => import('@/business/components/performance/report/components/PerformanceChart')
const PerformanceReportView = () => import('@/business/components/performance/report/PerformanceReportView')
+const PerformanceReportCompare = () => import('@/business/components/performance/report/PerformanceReportCompare')
export default {
path: "/performance",
@@ -62,6 +61,11 @@ export default {
path: "report/view/:reportId",
name: "perReportView",
component: PerformanceReportView
- }
+ },
+ {
+ path: "report/compare/:reportId",
+ name: "ReportCompare",
+ component: PerformanceReportCompare,
+ },
]
}
diff --git a/frontend/src/business/components/performance/test/components/ExistFiles.vue b/frontend/src/business/components/performance/test/components/ExistFiles.vue
index fc75b9f832..bcecb0713c 100644
--- a/frontend/src/business/components/performance/test/components/ExistFiles.vue
+++ b/frontend/src/business/components/performance/test/components/ExistFiles.vue
@@ -157,7 +157,7 @@ export default {
for (let i = 0; i < rows.length; i++) {
let row = rows[i];
if (this.tableData.filter(f => f.name === row.name).length > 0) {
- this.$error(this.$t('load_test.delete_file'));
+ this.$error(this.$t('load_test.delete_file') + ', name: ' + row.name);
this.selectIds.clear();
return;
}
@@ -216,7 +216,7 @@ export default {
}
if (this.tableData.filter(f => f.name === file.name).length > 0) {
- this.$error(this.$t('load_test.delete_file'));
+ this.$error(this.$t('load_test.delete_file') + ', name: ' + file.name);
return false;
}
},
diff --git a/frontend/src/business/components/performance/test/components/ExistScenarios.vue b/frontend/src/business/components/performance/test/components/ExistScenarios.vue
index e159ef00f0..72926742e6 100644
--- a/frontend/src/business/components/performance/test/components/ExistScenarios.vue
+++ b/frontend/src/business/components/performance/test/components/ExistScenarios.vue
@@ -121,7 +121,7 @@ export default {
for (let i = 0; i < rows.length; i++) {
let row = rows[i];
if (this.tableData.filter(f => f.name === row.name + ".jmx").length > 0) {
- this.$error(this.$t('load_test.delete_file'));
+ this.$error(this.$t('load_test.delete_file') + ', name: ' + row.name);
return;
}
}
diff --git a/frontend/src/business/components/performance/test/components/PerformancePressureConfig.vue b/frontend/src/business/components/performance/test/components/PerformancePressureConfig.vue
index 221b9a6c9e..07617d348e 100644
--- a/frontend/src/business/components/performance/test/components/PerformancePressureConfig.vue
+++ b/frontend/src/business/components/performance/test/components/PerformancePressureConfig.vue
@@ -4,7 +4,7 @@
-
+
-
- {{ threadGroup.attributes.testname }}
-
-
- {{ $t('load_test.thread_num') }}{{ threadGroup.threadNumber }},
- {{ $t('load_test.duration') }}: {{ threadGroup.duration }} {{ getUnitLabel(threadGroup) }}
-
-
- {{ $t('load_test.thread_num') }} {{ threadGroup.threadNumber }},
- {{$t('load_test.iterate_num')}} {{threadGroup.iterateNum}}
-
+
+
+
+
+ {{ threadGroup.attributes.testname }}
+
+
+
+
+
+ {{ $t('load_test.thread_num') }}{{ threadGroup.threadNumber }},
+ {{ $t('load_test.duration') }}: {{ threadGroup.duration }} {{ getUnitLabel(threadGroup) }}
+
+
+ {{ $t('load_test.thread_num') }} {{ threadGroup.threadNumber }},
+ {{ $t('load_test.iterate_num') }} {{ threadGroup.iterateNum }}
+
+
+
@@ -42,6 +50,7 @@
v-model="threadGroup.threadNumber"
@change="calculateTotalChart(threadGroup)"
:min="resourcePoolResourceLength"
+ :max="maxThreadNumbers"
size="mini"/>
@@ -109,6 +118,7 @@
@@ -219,7 +229,8 @@ export default {
resourcePools: [],
activeNames: ["0"],
threadGroups: [],
- resourcePoolResourceLength: 1
+ resourcePoolResourceLength: 1,
+ maxThreadNumbers: 5000,
}
},
mounted() {
@@ -336,6 +347,22 @@ export default {
});
}
},
+ resourcePoolChange() {
+ let result = this.resourcePools.filter(p => p.id === this.resourcePool);
+ if (result.length === 1) {
+ let threadNumber = 0;
+ result[0].resources.forEach(resource => {
+ threadNumber += JSON.parse(resource.configuration).maxConcurrency;
+ })
+ this.maxThreadNumbers = threadNumber;
+ this.threadGroups.forEach(tg => {
+ if (tg.threadNumber > threadNumber) {
+ this.$set(tg, "threadNumber", threadNumber);
+ }
+ })
+ this.calculateTotalChart();
+ }
+ },
calculateTotalChart() {
let handler = this;
if (handler.duration < handler.rampUpTime) {
@@ -344,6 +371,11 @@ export default {
if (handler.rampUpTime < handler.step) {
handler.step = handler.rampUpTime;
}
+ // 线程数不能小于资源池节点的数量
+ let resourcePool = this.resourcePools.filter(v => v.id === this.resourcePool)[0];
+ if (resourcePool) {
+ this.resourcePoolResourceLength = resourcePool.resources.length;
+ }
let color = ['#60acfc', '#32d3eb', '#5bc49f', '#feb64d', '#ff7c7c', '#9287e7', '#ca8622', '#bda29a', '#6e7074', '#546570', '#c4ccd3'];
handler.options = {
color: color,
@@ -649,7 +681,7 @@ export default {
border-bottom: 1px solid #DCDFE6;
}
-/deep/ .el-collapse-item__content{
+/deep/ .el-collapse-item__content {
padding-left: 10px;
padding-bottom: 5px;
border-left-width: 8px;
@@ -682,4 +714,10 @@ export default {
.title {
margin-left: 60px;
}
+
+.wordwrap {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
diff --git a/frontend/src/business/components/settings/organization/OrganizationMember.vue b/frontend/src/business/components/settings/organization/OrganizationMember.vue
index a9e94e66a6..85f5db6fb6 100644
--- a/frontend/src/business/components/settings/organization/OrganizationMember.vue
+++ b/frontend/src/business/components/settings/organization/OrganizationMember.vue
@@ -216,8 +216,36 @@
})
}
this.total = data.itemCount;
+
+ this.$nextTick(function(){
+ this.checkTableRowIsSelect();
+ });
})
},
+
+ checkTableRowIsSelect(){
+ //如果默认全选的话,则选中应该选中的行
+ if(this.condition.selectAll){
+ let unSelectIds = this.condition.unSelectIds;
+ this.tableData.forEach(row=>{
+ if(unSelectIds.indexOf(row.id)<0){
+ this.$refs.userTable.toggleRowSelection(row,true);
+
+ //默认全选,需要把选中对行添加到selectRows中。不然会影响到勾选函数统计
+ if (!this.selectRows.has(row)) {
+ this.$set(row, "showMore", true);
+ this.selectRows.add(row);
+ }
+ }else{
+ //不勾选的行,也要判断是否被加入了selectRow中。加入了的话就去除。
+ if (this.selectRows.has(row)) {
+ this.$set(row, "showMore", false);
+ this.selectRows.delete(row);
+ }
+ }
+ })
+ }
+ },
buildPagePath(path) {
return path + "/" + this.currentPage + "/" + this.pageSize;
},
diff --git a/frontend/src/business/components/settings/system/User.vue b/frontend/src/business/components/settings/system/User.vue
index be2f32c869..277a125398 100644
--- a/frontend/src/business/components/settings/system/User.vue
+++ b/frontend/src/business/components/settings/system/User.vue
@@ -598,7 +598,7 @@ export default {
return;
}
this.selectRows = new Set();
- this.condition.selectAll = false;
+ // this.condition.selectAll = false;
this.result = this.$post(this.buildPagePath(this.queryPath), this.condition, response => {
let data = response.data;
this.total = data.itemCount;
@@ -615,8 +615,38 @@ export default {
});
}
}
+
+ this.$nextTick(function(){
+ this.checkTableRowIsSelect();
+ });
+
})
},
+
+ checkTableRowIsSelect(){
+ //如果默认全选的话,则选中应该选中的行
+ if(this.condition.selectAll){
+ let unSelectIds = this.condition.unSelectIds;
+ this.tableData.forEach(row=>{
+ if(unSelectIds.indexOf(row.id)<0){
+ this.$refs.userTable.toggleRowSelection(row,true);
+
+ //默认全选,需要把选中对行添加到selectRows中。不然会影响到勾选函数统计
+ if (!this.selectRows.has(row)) {
+ this.$set(row, "showMore", true);
+ this.selectRows.add(row);
+ }
+ }else{
+ //不勾选的行,也要判断是否被加入了selectRow中。加入了的话就去除。
+ if (this.selectRows.has(row)) {
+ this.$set(row, "showMore", false);
+ this.selectRows.delete(row);
+ }
+ }
+ })
+ }
+ },
+
handleClose() {
this.form = {roles: [{id: ''}]};
this.btnAddRole = false;
diff --git a/frontend/src/business/components/settings/workspace/WorkspaceMember.vue b/frontend/src/business/components/settings/workspace/WorkspaceMember.vue
index e5e94eab81..7c65d2997d 100644
--- a/frontend/src/business/components/settings/workspace/WorkspaceMember.vue
+++ b/frontend/src/business/components/settings/workspace/WorkspaceMember.vue
@@ -208,8 +208,33 @@
})
}
this.total = data.itemCount;
+ this.$nextTick(function(){
+ this.checkTableRowIsSelect();
+ });
})
+ },
+ checkTableRowIsSelect(){
+ //如果默认全选的话,则选中应该选中的行
+ if(this.condition.selectAll){
+ let unSelectIds = this.condition.unSelectIds;
+ this.tableData.forEach(row=>{
+ if(unSelectIds.indexOf(row.id)<0){
+ this.$refs.userTable.toggleRowSelection(row,true);
+ //默认全选,需要把选中对行添加到selectRows中。不然会影响到勾选函数统计
+ if (!this.selectRows.has(row)) {
+ this.$set(row, "showMore", true);
+ this.selectRows.add(row);
+ }
+ }else{
+ //不勾选的行,也要判断是否被加入了selectRow中。加入了的话就去除。
+ if (this.selectRows.has(row)) {
+ this.$set(row, "showMore", false);
+ this.selectRows.delete(row);
+ }
+ }
+ })
+ }
},
buildPagePath(path) {
return path + "/" + this.currentPage + "/" + this.pageSize;
diff --git a/frontend/src/business/components/track/case/TestCase.vue b/frontend/src/business/components/track/case/TestCase.vue
index 88d25907b2..ed2bab1a28 100644
--- a/frontend/src/business/components/track/case/TestCase.vue
+++ b/frontend/src/business/components/track/case/TestCase.vue
@@ -285,6 +285,7 @@ export default {
}
},
nodeChange(node, nodeIds, pNodes) {
+ this.activeName = "default";
this.selectNodeIds = nodeIds;
this.selectNode = node;
this.selectParentNodes = pNodes;
@@ -323,11 +324,23 @@ export default {
showTestCaseDetail(testCase) {
this.testCaseReadOnly = true;
},
- refresh() {
+ refresh(data) {
this.selectNodeIds = [];
this.selectParentNodes = [];
this.selectNode = {};
this.refreshTable();
+ this.setTable(data);
+
+ },
+ setTable(data) {
+ console.log(data)
+ for (let index in this.tabs) {
+ let tab = this.tabs[index];
+ if (tab.name === this.activeName) {
+ tab.label = data.name;
+ break;
+ }
+ }
},
refreshAll() {
this.$refs.nodeTree.list();
diff --git a/frontend/src/business/components/track/case/components/TestCaseEdit.vue b/frontend/src/business/components/track/case/components/TestCaseEdit.vue
index ae9176622d..5ed25a3951 100644
--- a/frontend/src/business/components/track/case/components/TestCaseEdit.vue
+++ b/frontend/src/business/components/track/case/components/TestCaseEdit.vue
@@ -35,20 +35,8 @@
-
-
-
-
+
@@ -292,7 +280,7 @@ import MsDialogFooter from '../../../common/components/MsDialogFooter'
import {getCurrentUser, handleCtrlSEvent, listenGoBack, removeGoBackListener} from "@/common/js/utils";
import {Message} from "element-ui";
import TestCaseAttachment from "@/business/components/track/case/components/TestCaseAttachment";
-import {buildNodePath} from "../../../api/definition/model/NodeTree";
+import {buildNodePath,buildTree} from "../../../api/definition/model/NodeTree";
import CaseComment from "@/business/components/track/case/components/CaseComment";
import MsInputTag from "@/business/components/api/automation/scenario/MsInputTag";
import MsPreviousNextButton from "../../../common/components/MsPreviousNextButton";
@@ -301,12 +289,13 @@ import TestCaseComment from "@/business/components/track/case/components/TestCas
import ReviewCommentItem from "@/business/components/track/review/commom/ReviewCommentItem";
import {API_STATUS, REVIEW_STATUS, TEST} from "@/business/components/api/definition/model/JsonData";
import MsTableButton from "@/business/components/common/components/MsTableButton";
+import MsSelectTree from "../../../common/select-tree/SelectTree";
export default {
name: "TestCaseEdit",
components: {
MsTableButton,
-
+ MsSelectTree,
ReviewCommentItem,
TestCaseComment, MsPreviousNextButton, MsInputTag, CaseComment, MsDialogFooter, TestCaseAttachment
},
@@ -320,12 +309,13 @@ export default {
sysList: [],//一级选择框的数据
options: REVIEW_STATUS,
statuOptions: API_STATUS,
- comments: [],
+ comments: [],
result: {},
dialogFormVisible: false,
form: {
name: '',
- module: '',
+ module: 'root',
+ nodePath:'',
maintainer: getCurrentUser().id,
priority: 'P0',
type: '',
@@ -380,6 +370,11 @@ export default {
testCases: [],
index: 0,
showInputTag: true,
+ tableType:"",
+ moduleObj: {
+ id: 'id',
+ label: 'name',
+ },
};
},
props: {
@@ -411,6 +406,7 @@ export default {
this.getSelectOptions();
if (this.type === 'edit' || this.type === 'copy') {
this.open(this.currentTestCaseInfo)
+ this.getComments(this.currentTestCaseInfo)
}
// Cascader 级联选择器: 点击文本就让它自动点击前面的input就可以触发选择。
setInterval(function () {
@@ -420,6 +416,10 @@ export default {
};
});
}, 1000);
+ if(this.selectNode && this.selectNode.data){
+ this.form.module = this.selectNode.data.id;
+ this.form.nodePath = this.selectNode.data.path;
+ }
},
watch: {
treeNodes() {
@@ -432,8 +432,13 @@ export default {
created() {
this.loadOptions();
this.addListener(); // 添加 ctrl s 监听
+
},
methods: {
+ setModule(id,data) {
+ this.form.module = id;
+ this.form.nodePath = data.path;
+ },
clearInput() {
//this.$refs['cascade'].panel.clearCheckedNodes()
},
@@ -468,7 +473,6 @@ export default {
}
return new Promise((resolve, reject) => {
this.$get(url).then(res => {
- console.log(res.data.data)
const data = res.data.data.map(item => ({
value: item.id,
label: item.name,
@@ -632,8 +636,11 @@ export default {
})
},
async setFormData(testCase) {
- //testCase.tags = JSON.parse(testCase.tags);
- testCase.selected = JSON.parse(testCase.testId);
+ try {
+ testCase.selected = JSON.parse(testCase.testId);
+ } catch (error) {
+ testCase.selected = testCase.testId
+ }
let tmp = {};
Object.assign(tmp, testCase);
tmp.steps = JSON.parse(testCase.steps);
@@ -642,12 +649,10 @@ export default {
}
tmp.tags = JSON.parse(tmp.tags);
Object.assign(this.form, tmp);
- console.log(this.form.selected)
this.form.module = testCase.nodeId;
this.getFileMetaData(testCase);
- /* testCase.selected = JSON.parse(testCase.testId);
- this.form.selected= testCase.selected*/
await this.loadOptions(this.sysList)
+
},
setTestCaseExtInfo(testCase) {
this.testCase = {};
@@ -712,11 +717,6 @@ export default {
this.dialogFormVisible = false;
},
saveCase() {
- /*
- document.getElementById("inputDelay").focus();
- */
-
- // 保存前在input框自动失焦,以免保存失败
this.$refs['caseFrom'].validate((valid) => {
if (valid) {
let param = this.buildParam();
@@ -724,7 +724,10 @@ export default {
let option = this.getOption(param);
this.result = this.$request(option, (response) => {
this.$success(this.$t('commons.save_success'));
- if (this.operationType == 'add' && this.isCreateContinue) {
+ this.operationType="edit"
+ this.form.id=response.id;
+ this.$emit("refreshTestCase",)
+ /*if (this.operationType == 'add' && this.isCreateContinue) {
this.form.name = '';
this.form.prerequisite = '';
this.form.steps = [{
@@ -738,9 +741,10 @@ export default {
this.tableData = [];
this.$emit("refresh");
return;
- }
- this.dialogFormVisible = false;
- this.$emit("refresh");
+ }*/
+ this.tableType='edit';
+ this.$emit("refresh",this.form);
+ this.form.id=response.data
if (this.type === 'add' || this.type === 'copy') {
param.id = response.data;
this.$emit("caseCreate", param);
@@ -760,11 +764,6 @@ export default {
Object.assign(param, this.form);
param.steps = JSON.stringify(this.form.steps);
param.nodeId = this.form.module;
- this.moduleOptions.forEach(item => {
- if (this.form.module === item.id) {
- param.nodePath = item.path;
- }
- });
if (this.projectId) {
param.projectId = this.projectId;
}
@@ -779,11 +778,15 @@ export default {
return param;
},
getOption(param) {
- let formData = new FormData();
- let type = this.type
- if (this.type === 'copy') {
+ let type={}
+ if(this.tableType==='edit'){
+ type='edit'
+ }else if(this.type === 'copy'){
type = 'add'
+ }else{
+ type=this.type
}
+ let formData = new FormData();
let url = '/test/case/' + type;
this.uploadList.forEach(f => {
formData.append("file", f);
@@ -833,11 +836,16 @@ export default {
this.getTestOptions()
},
getModuleOptions() {
- let moduleOptions = [];
- this.treeNodes.forEach(node => {
- buildNodePath(node, {path: ''}, moduleOptions);
+ this.moduleOptions = [];
+ this.moduleOptions.unshift({
+ "id": "root",
+ "name": this.$t('commons.module_title'),
+ "level": 0,
+ "children": this.treeNodes,
+ });
+ this.moduleOptions.forEach(node => {
+ buildTree(node, {path: ''});
});
- this.moduleOptions = moduleOptions;
},
getMaintainerOptions() {
let workspaceId = localStorage.getItem(WORKSPACE_ID);
@@ -915,7 +923,7 @@ export default {
}
if (this.tableData.filter(f => f.name === file.name).length > 0) {
- this.$error(this.$t('load_test.delete_file'));
+ this.$error(this.$t('load_test.delete_file') + ', name: ' + file.name);
return false;
}
diff --git a/frontend/src/business/components/track/case/components/TestCaseImport.vue b/frontend/src/business/components/track/case/components/TestCaseImport.vue
index a82195348f..1410afc46f 100644
--- a/frontend/src/business/components/track/case/components/TestCaseImport.vue
+++ b/frontend/src/business/components/track/case/components/TestCaseImport.vue
@@ -126,7 +126,8 @@
fileList: [],
errList: [],
xmindErrList: [],
- isLoading: false
+ isLoading: false,
+ isUpdated: false
}
},
methods: {
@@ -180,6 +181,12 @@
this.fileList = [];
this.errList = [];
this.xmindErrList = [];
+
+ //通过excel导入更新过数据的话就刷新页面
+ if (this.isUpdated === true){
+ this.$emit("refreshAll");
+ this.isUpdated = false;
+ }
},
downloadTemplate() {
this.$fileDownload('/test/case/export/template');
@@ -207,6 +214,7 @@
this.$emit("refreshAll");
} else {
this.errList = res.errList;
+ this.isUpdated = res.isUpdated;
}
this.fileList = [];
}, erro => {
diff --git a/frontend/src/business/components/track/case/components/TestCaseList.vue b/frontend/src/business/components/track/case/components/TestCaseList.vue
index b17b65da5e..6d6a77b7e8 100644
--- a/frontend/src/business/components/track/case/components/TestCaseList.vue
+++ b/frontend/src/business/components/track/case/components/TestCaseList.vue
@@ -161,7 +161,7 @@ import {
_handleSelect,
_handleSelectAll,
_sort, buildBatchParam, getLabel,
- getSelectDataCounts, getSystemLabel, initCondition,
+ getSelectDataCounts, initCondition,
setUnSelectIds,
toggleAllSelection
} from "@/common/js/tableUtils";
@@ -303,25 +303,18 @@ export default {
},
created: function () {
this.$emit('setCondition', this.condition);
- if (this.trashEnable) {
- this.condition.filters = {status: ["Trash"]};
- } else {
- this.condition.filters = {status: ["Prepare", "Pass", "UnPass"]};
- }
+ this.condition.filters = {reviewStatus: ["Prepare", "Pass", "UnPass"]};
this.initTableData();
- getSystemLabel(this, this.type)
+
},
activated() {
- if (this.trashEnable) {
- this.condition.filters = {status: ["Trash"]};
- } else {
- this.condition.filters = {status: ["Prepare", "Pass", "UnPass"]};
- }
+ this.condition.filters = {reviewStatus: ["Prepare", "Pass", "UnPass"]};
this.initTableData();
},
watch: {
selectNodeIds() {
this.currentPage = 1;
+ initCondition(this.condition,false);
this.initTableData();
},
condition() {
@@ -330,7 +323,6 @@ export default {
},
methods: {
customHeader() {
- getLabel(this, TEST_CASE_LIST);
this.$refs.headerCustom.open(this.tableLabel)
},
getSelectDataRange() {
@@ -341,7 +333,8 @@ export default {
initTableData() {
this.condition.planId = "";
this.condition.nodeIds = [];
- initCondition(this.condition);
+ //initCondition(this.condition);
+ initCondition(this.condition,this.condition.selectAll);
this.selectDataCounts = 0;
if (this.planId) {
// param.planId = this.planId;
@@ -352,6 +345,7 @@ export default {
this.condition.nodeIds = this.selectNodeIds;
}
getLabel(this, TEST_CASE_LIST);
+
this.getData();
},
getData() {
@@ -372,15 +366,15 @@ export default {
case 'coverage':
this.condition.caseCoverage = 'coverage';
break;
- /* case 'Prepare':
- this.condition.filters.status = [this.selectDataRange];
+ case 'Prepare':
+ this.condition.filters.reviewStatus = [this.selectDataRange];
break;
case 'Pass':
- this.condition.filters.status = [this.selectDataRange];
+ this.condition.filters.reviewStatus = [this.selectDataRange];
break;
case 'UnPass':
- this.condition.filters.status = [this.selectDataRange];
- break;*/
+ this.condition.filters.reviewStatus = [this.selectDataRange];
+ break;
}
if (this.projectId) {
this.condition.projectId = this.projectId;
@@ -399,12 +393,41 @@ export default {
item.tags = JSON.parse(item.tags);
})
if (this.$refs.table) {
- this.$refs.table.doLayout()
+ setTimeout(() => {
+ this.$refs.table.doLayout();
+ this.result.loading = false;
+ }, 500)
}
+ this.$nextTick(function(){
+ this.checkTableRowIsSelect();
+ })
});
}
},
+ checkTableRowIsSelect(){
+ //如果默认全选的话,则选中应该选中的行
+ if(this.condition.selectAll){
+ let unSelectIds = this.condition.unSelectIds;
+ this.tableData.forEach(row=>{
+ if(unSelectIds.indexOf(row.id)<0){
+ this.$refs.table.toggleRowSelection(row,true);
+
+ //默认全选,需要把选中对行添加到selectRows中。不然会影响到勾选函数统计
+ if (!this.selectRows.has(row)) {
+ this.$set(row, "showMore", true);
+ this.selectRows.add(row);
+ }
+ }else{
+ //不勾选的行,也要判断是否被加入了selectRow中。加入了的话就去除。
+ if (this.selectRows.has(row)) {
+ this.$set(row, "showMore", false);
+ this.selectRows.delete(row);
+ }
+ }
+ })
+ }
+ },
search() {
this.initTableData();
},
diff --git a/frontend/src/business/components/track/common/NodeTree.vue b/frontend/src/business/components/track/common/NodeTree.vue
index 80a9ea0aba..656b412984 100644
--- a/frontend/src/business/components/track/common/NodeTree.vue
+++ b/frontend/src/business/components/track/common/NodeTree.vue
@@ -92,7 +92,7 @@ export default {
allLabel: {
type: String,
default() {
- return this.$t("commons.all_label.case");
+ return this.$t('commons.module_title');
}
},
nameLimit: {
diff --git a/frontend/src/business/components/track/common/TestCaseNodeTree.vue b/frontend/src/business/components/track/common/TestCaseNodeTree.vue
index 44907cc490..64c1186200 100644
--- a/frontend/src/business/components/track/common/TestCaseNodeTree.vue
+++ b/frontend/src/business/components/track/common/TestCaseNodeTree.vue
@@ -14,22 +14,9 @@
@refresh="list"
ref="nodeTree">
-
-
-
-
-
- {{ $t('test_track.case.create') }}
- {{ $t('api_test.api_import.label') }}
- {{ $t('api_test.export_config') }}
-
-
-
-
-
+
@@ -49,10 +36,11 @@ import NodeEdit from "./NodeEdit";
import MsNodeTree from "./NodeTree";
import TestCaseCreate from "@/business/components/track/case/components/TestCaseCreate";
import TestCaseImport from "@/business/components/track/case/components/TestCaseImport";
+import MsSearchBar from "@/business/components/common/components/search/MsSearchBar";
export default {
name: "TestCaseNodeTree",
- components: {TestCaseImport, TestCaseCreate, MsNodeTree, NodeEdit},
+ components: {MsSearchBar, TestCaseImport, TestCaseCreate, MsNodeTree, NodeEdit},
data() {
return {
defaultProps: {
@@ -65,6 +53,20 @@ export default {
filterText: "",
trashEnable: false
},
+ operators: [
+ {
+ label: this.$t('test_track.case.create'),
+ callback: this.addTestCase
+ },
+ {
+ label: this.$t('api_test.api_import.label'),
+ callback: this.handleImport
+ },
+ {
+ label: this.$t('api_test.export_config'),
+ callback: () => {this.$emit('exportTestCase')}
+ }
+ ]
};
},
props: {
@@ -109,24 +111,6 @@ export default {
refreshAll() {
this.$emit('refreshAll');
},
- handleCommand(e) {
- switch (e) {
- case "add-testcase":
- this.addTestCase();
- break;
- case "import":
- if (!this.projectId) {
- this.$warning(this.$t('commons.check_project_tip'));
- return;
- }
- this.$refs.testCaseImport.open();
- break;
- case "export":
- this.$emit('exportTestCase')
- break;
-
- }
- },
list() {
if (this.projectId) {
this.result = this.$get("/case/node/list/" + this.projectId, response => {
@@ -156,6 +140,13 @@ export default {
this.list();
});
},
+ handleImport() {
+ if (!this.projectId) {
+ this.$warning(this.$t('commons.check_project_tip'));
+ return;
+ }
+ this.$refs.testCaseImport.open();
+ },
remove(nodeIds) {
this.$post("/case/node/delete", nodeIds, () => {
this.list();
diff --git a/frontend/src/business/components/track/plan/components/TestPlanList.vue b/frontend/src/business/components/track/plan/components/TestPlanList.vue
index 7cf1aa7162..d6ae00e882 100644
--- a/frontend/src/business/components/track/plan/components/TestPlanList.vue
+++ b/frontend/src/business/components/track/plan/components/TestPlanList.vue
@@ -225,7 +225,7 @@ import MsDeleteConfirm from "../../../common/components/MsDeleteConfirm";
import {TEST_PLAN_CONFIGS} from "../../../common/components/search/search-components";
import {LIST_CHANGE, TrackEvent} from "@/business/components/common/head/ListEvent";
import MsScheduleMaintain from "@/business/components/api/automation/schedule/ScheduleMaintain"
-import {_filter, _sort, getLabel, getSystemLabel} from "@/common/js/tableUtils";
+import {_filter, _sort, getLabel} from "@/common/js/tableUtils";
import {TEST_PLAN_LIST} from "@/common/js/constants";
import {Test_Plan_List} from "@/business/components/common/model/JsonData";
import HeaderCustom from "@/business/components/common/head/HeaderCustom";
@@ -291,11 +291,9 @@ export default {
}
this.isTestManagerOrTestUser = checkoutTestManagerOrTestUser();
this.initTableData();
- getSystemLabel(this, this.type)
},
methods: {
inite() {
- getLabel(this, TEST_PLAN_LIST);
this.initTableData()
},
calPassRate(scope) {
@@ -303,7 +301,6 @@ export default {
return Number.parseInt(passRate, 10);
},
customHeader() {
- getLabel(this, TEST_PLAN_LIST);
this.$refs.headerCustom.open(this.tableLabel)
},
initTableData() {
diff --git a/frontend/src/business/components/track/plan/view/comonents/api/TestPlanApiCaseList.vue b/frontend/src/business/components/track/plan/view/comonents/api/TestPlanApiCaseList.vue
index 4de7dd0303..3ad46ae991 100644
--- a/frontend/src/business/components/track/plan/view/comonents/api/TestPlanApiCaseList.vue
+++ b/frontend/src/business/components/track/plan/view/comonents/api/TestPlanApiCaseList.vue
@@ -104,7 +104,7 @@
-
+
@@ -161,7 +161,7 @@ import TestPlanApiCaseResult from "./TestPlanApiCaseResult";
import TestPlan from "../../../../../api/definition/components/jmeter/components/test-plan";
import ThreadGroup from "../../../../../api/definition/components/jmeter/components/thread-group";
import {TEST_PLAN_API_CASE, WORKSPACE_ID} from "@/common/js/constants";
-import {_filter, _sort, getLabel, getSystemLabel} from "@/common/js/tableUtils";
+import {_filter, _sort, getLabel} from "@/common/js/tableUtils";
import HeaderCustom from "@/business/components/common/head/HeaderCustom";
import {Test_Plan_Api_Case} from "@/business/components/common/model/JsonData";
import HeaderLabelOperate from "@/business/components/common/head/HeaderLabelOperate";
@@ -268,7 +268,6 @@ export default {
created: function () {
this.getMaintainerOptions();
this.initTable();
- getSystemLabel(this, this.type)
},
activated() {
@@ -304,8 +303,6 @@ export default {
},
methods: {
customHeader() {
- getLabel(this, TEST_PLAN_API_CASE);
-
this.$refs.headerCustom.open(this.tableLabel)
},
getMaintainerOptions() {
@@ -524,6 +521,9 @@ export default {
});
},
autoCheckStatus() { // 检查执行结果,自动更新计划状态
+ if (!this.planId) {
+ return;
+ }
this.$post('/test/plan/autoCheck/' + this.planId, (response) => {
});
},
diff --git a/frontend/src/business/components/track/plan/view/comonents/api/TestPlanApiScenarioList.vue b/frontend/src/business/components/track/plan/view/comonents/api/TestPlanApiScenarioList.vue
index f997aba38f..e223cdaefa 100644
--- a/frontend/src/business/components/track/plan/view/comonents/api/TestPlanApiScenarioList.vue
+++ b/frontend/src/business/components/track/plan/view/comonents/api/TestPlanApiScenarioList.vue
@@ -109,7 +109,7 @@ import MsTableMoreBtn from "../../../../../api/automation/scenario/TableMoreBtn"
import MsScenarioExtendButtons from "@/business/components/api/automation/scenario/ScenarioExtendBtns";
import MsTestPlanList from "../../../../../api/automation/scenario/testplan/TestPlanList";
import TestPlanScenarioListHeader from "./TestPlanScenarioListHeader";
-import {_handleSelect, _handleSelectAll, getLabel, getSystemLabel} from "../../../../../../../common/js/tableUtils";
+import {_handleSelect, _handleSelectAll, getLabel} from "../../../../../../../common/js/tableUtils";
import MsTableOperatorButton from "../../../../../common/components/MsTableOperatorButton";
import HeaderCustom from "@/business/components/common/head/HeaderCustom";
import {TEST_CASE_LIST, TEST_PLAN_SCENARIO_CASE} from "@/common/js/constants";
@@ -188,7 +188,6 @@ export default {
},
created() {
this.search();
- getSystemLabel(this, this.type)
},
watch: {
@@ -201,8 +200,6 @@ export default {
},
methods: {
customHeader() {
- getLabel(this, TEST_PLAN_SCENARIO_CASE);
-
this.$refs.headerCustom.open(this.tableLabel)
},
search() {
diff --git a/frontend/src/business/components/track/plan/view/comonents/functional/FunctionalTestCaseList.vue b/frontend/src/business/components/track/plan/view/comonents/functional/FunctionalTestCaseList.vue
index b3e25ac688..0404e4db21 100644
--- a/frontend/src/business/components/track/plan/view/comonents/functional/FunctionalTestCaseList.vue
+++ b/frontend/src/business/components/track/plan/view/comonents/functional/FunctionalTestCaseList.vue
@@ -296,7 +296,7 @@ import BatchEdit from "../../../../case/components/BatchEdit";
import ClassicEditor from "@ckeditor/ckeditor5-build-classic";
import {hub} from "@/business/components/track/plan/event-bus";
import MsTag from "@/business/components/common/components/MsTag";
-import {_filter, _sort, getLabel, getSystemLabel} from "@/common/js/tableUtils";
+import {_filter, _sort, getLabel} from "@/common/js/tableUtils";
import HeaderCustom from "@/business/components/common/head/HeaderCustom";
import {Test_Plan_Function_Test_Case} from "@/business/components/common/model/JsonData";
import HeaderLabelOperate from "@/business/components/common/head/HeaderLabelOperate";
@@ -424,12 +424,8 @@ export default {
beforeDestroy() {
hub.$off("openFailureTestCase");
},
- created() {
- getSystemLabel(this, this.type)
- },
methods: {
customHeader() {
- getLabel(this, TEST_PLAN_FUNCTION_TEST_CASE);
this.$refs.headerCustom.open(this.tableLabel)
},
@@ -477,13 +473,19 @@ export default {
}
this.selectRows.clear();
if (this.$refs.table) {
- this.$refs.table.doLayout()
+ setTimeout(() => {
+ this.$refs.table.doLayout();
+ this.result.loading = false;
+ }, 500)
}
});
}
getLabel(this, TEST_PLAN_FUNCTION_TEST_CASE);
},
autoCheckStatus() {
+ if (!this.planId) {
+ return;
+ }
this.$post('/test/plan/autoCheck/' + this.planId, (response) => {
});
},
diff --git a/frontend/src/business/components/track/plan/view/comonents/load/TestPlanLoadCaseList.vue b/frontend/src/business/components/track/plan/view/comonents/load/TestPlanLoadCaseList.vue
index a6ecaf0e0b..d292a02dd6 100644
--- a/frontend/src/business/components/track/plan/view/comonents/load/TestPlanLoadCaseList.vue
+++ b/frontend/src/business/components/track/plan/view/comonents/load/TestPlanLoadCaseList.vue
@@ -100,7 +100,7 @@
-
+
@@ -131,7 +131,7 @@ import MsTablePagination from "@/business/components/common/pagination/TablePagi
import MsPerformanceTestStatus from "@/business/components/performance/test/PerformanceTestStatus";
import MsTableOperatorButton from "@/business/components/common/components/MsTableOperatorButton";
import LoadCaseReport from "@/business/components/track/plan/view/comonents/load/LoadCaseReport";
-import {_filter, _sort, getLabel, getSystemLabel} from "@/common/js/tableUtils";
+import {_filter, _sort, getLabel} from "@/common/js/tableUtils";
import HeaderCustom from "@/business/components/common/head/HeaderCustom";
import {TEST_CASE_LIST, TEST_PLAN_LOAD_CASE} from "@/common/js/constants";
import {Test_Plan_Load_Case, Track_Test_Case} from "@/business/components/common/model/JsonData";
@@ -198,7 +198,7 @@ export default {
created() {
this.initTable();
this.refreshStatus();
- getSystemLabel(this, this.type)
+
},
watch: {
@@ -211,7 +211,6 @@ export default {
},
methods: {
customHeader() {
- getLabel(this, TEST_PLAN_LOAD_CASE);
this.$refs.headerCustom.open(this.tableLabel)
},
initTable() {
@@ -251,6 +250,9 @@ export default {
},
autoCheckStatus() {
+ if (!this.planId) {
+ return;
+ }
this.$post('/test/plan/autoCheck/' + this.planId, (response) => {
});
},
diff --git a/frontend/src/business/components/track/review/components/TestCaseReviewList.vue b/frontend/src/business/components/track/review/components/TestCaseReviewList.vue
index 4fb47c4b4a..9ebc55dc1b 100644
--- a/frontend/src/business/components/track/review/components/TestCaseReviewList.vue
+++ b/frontend/src/business/components/track/review/components/TestCaseReviewList.vue
@@ -122,7 +122,7 @@ import {
checkoutTestManagerOrTestUser,
getCurrentWorkspaceId
} from "../../../../../common/js/utils";
-import {_filter, _sort, getLabel, getSystemLabel} from "@/common/js/tableUtils";
+import {_filter, _sort, getLabel} from "@/common/js/tableUtils";
import PlanStatusTableItem from "../../common/tableItems/plan/PlanStatusTableItem";
import {Test_Case_Review} from "@/business/components/common/model/JsonData";
import {TEST_CASE_LIST, TEST_CASE_REVIEW_LIST} from "@/common/js/constants";
@@ -173,7 +173,6 @@ export default {
},
created() {
this.isTestManagerOrTestUser = checkoutTestManagerOrTestUser();
- getSystemLabel(this, this.type)
this.initTableData();
},
computed: {
@@ -183,7 +182,6 @@ export default {
},
methods: {
customHeader() {
- getLabel(this, TEST_CASE_REVIEW_LIST);
this.$refs.headerCustom.open(this.tableLabel)
},
diff --git a/frontend/src/business/components/track/review/view/components/TestReviewTestCaseList.vue b/frontend/src/business/components/track/review/view/components/TestReviewTestCaseList.vue
index 93d56b4f63..b369020f08 100644
--- a/frontend/src/business/components/track/review/view/components/TestReviewTestCaseList.vue
+++ b/frontend/src/business/components/track/review/view/components/TestReviewTestCaseList.vue
@@ -202,7 +202,7 @@ import {
} from "../../../../../../common/js/constants";
import TestReviewTestCaseEdit from "./TestReviewTestCaseEdit";
import ReviewStatus from "@/business/components/track/case/components/ReviewStatus";
-import {_filter, _sort, getLabel, getSystemLabel} from "@/common/js/tableUtils";
+import {_filter, _sort, getLabel} from "@/common/js/tableUtils";
import HeaderCustom from "@/business/components/common/head/HeaderCustom";
import {Test_Case_Review_Case_List, Track_Test_Case} from "@/business/components/common/model/JsonData";
import HeaderLabelOperate from "@/business/components/common/head/HeaderLabelOperate";
@@ -296,12 +296,8 @@ export default {
this.refreshTableAndReview();
this.isTestManagerOrTestUser = checkoutTestManagerOrTestUser();
},
- created() {
- getSystemLabel(this, this.type)
- },
methods: {
customHeader() {
- getLabel(this, TEST_CASE_REVIEW_CASE_LIST);
this.$refs.headerCustom.open(this.tableLabel)
},
initTableData() {
diff --git a/frontend/src/common/js/tableUtils.js b/frontend/src/common/js/tableUtils.js
index 1980090164..4d5c536279 100644
--- a/frontend/src/common/js/tableUtils.js
+++ b/frontend/src/common/js/tableUtils.js
@@ -43,7 +43,6 @@ export function setUnSelectIds(tableData, condition, selectRows) {
condition.unSelectIds = allIDs.filter(function (val) {
return ids.indexOf(val) === -1
});
-
}
export function getSelectDataCounts(condition, total, selectRows) {
@@ -102,9 +101,11 @@ export function _sort(column, condition) {
}
}
-export function initCondition(condition) {
- condition.selectAll = false;
- condition.unSelectIds = [];
+export function initCondition(condition,isSelectAll) {
+ if(!isSelectAll){
+ condition.selectAll = false;
+ condition.unSelectIds = [];
+ }
}
export function getLabel(vueObj, type) {
@@ -114,15 +115,14 @@ export function getLabel(vueObj, type) {
vueObj.result = vueObj.$post('/system/header/info', param, response => {
if (response.data != null) {
vueObj.tableLabel = eval(response.data.props);
- }
- })
-}
-export function getSystemLabel(vueObj, type) {
- let param = {}
- param.type=type
- vueObj.result = vueObj.$post('/system/system/header',param, response => {
- if (response.data != null) {
- vueObj.tableLabel = eval(response.data.props);
+ }else{
+ let param = {}
+ param.type=type
+ vueObj.result = vueObj.$post('/system/system/header',param, response => {
+ if (response.data != null) {
+ vueObj.tableLabel = eval(response.data.props);
+ }
+ })
}
})
}
diff --git a/frontend/src/i18n/en-US.js b/frontend/src/i18n/en-US.js
index a563e26c77..94837b728c 100644
--- a/frontend/src/i18n/en-US.js
+++ b/frontend/src/i18n/en-US.js
@@ -5,6 +5,7 @@ export default {
pass_rate: 'Pass rate',
execution_times: 'Execution times',
cover: 'Cover',
+ module_title: 'Default module',
not_cover: 'Not Cover',
import: 'Import',
import_success: 'Import success',
@@ -145,6 +146,7 @@ export default {
auth_redirect_tip: 'Jump to the authentication source page for authentication',
tag_tip: "Enter Enter to Add Label",
node_name_tip: "The name cannot contain'\\'",
+ more_operator: "More operator",
table: {
select_tip: "Item {0} data is selected"
},
@@ -280,7 +282,7 @@ export default {
none: 'None Organization',
select: 'Select Organization',
service_integration: 'Service integration',
- defect_manage: 'Defect management platform',
+ defect_manage: 'Project management platform',
message_settings: 'Message settings',
message: {
jenkins_task_notification: 'Jenkins task notification',
@@ -541,7 +543,10 @@ export default {
threadgroup_at_least_one: 'At least one ThreadGroup is enabled',
load_api_automation_jmx: 'Import API automation scenario',
project_file_exist: "The file already exists in the project, please import it directly",
- project_file_update_type_error: 'Updated file types must be consistent'
+ project_file_update_type_error: 'Updated file types must be consistent',
+ report: {
+ diff: "Compare"
+ },
},
api_test: {
creator: "Creator",
diff --git a/frontend/src/i18n/zh-CN.js b/frontend/src/i18n/zh-CN.js
index 8c5bcc9afc..251d71ac48 100644
--- a/frontend/src/i18n/zh-CN.js
+++ b/frontend/src/i18n/zh-CN.js
@@ -5,6 +5,7 @@ export default {
pass_rate: '通过率',
execution_times: '执行次数',
cover: '覆盖',
+ module_title: '默认模块',
not_cover: '不覆盖',
import: '导入',
import_success: '导入成功',
@@ -146,6 +147,7 @@ export default {
auth_redirect_tip: '即将跳转到认证源页面进行认证',
tag_tip: "输入回车添加标签",
node_name_tip: "名称不能包含'\\'",
+ more_operator: "更多操作",
table: {
select_tip: "已选中 {0} 条数据"
},
@@ -281,7 +283,7 @@ export default {
select: '选择组织',
delete_warning: '删除该组织将同步删除该组织下所有相关工作空间和相关工作空间下的所有项目,以及项目中的所有用例、接口测试、性能测试等,确定要删除吗?',
service_integration: '服务集成',
- defect_manage: '缺陷管理平台',
+ defect_manage: '项目管理平台',
message_settings: '消息设置',
message: {
jenkins_task_notification: 'Jenkins接口调用任务通知',
@@ -438,7 +440,7 @@ export default {
export: '导出',
export_to_ms_format: '导出 MeterSphere 格式',
export_to_swagger3_format: '导出 Swagger3.0 格式',
- compare: '比较',
+ compare: '报告对比',
generation_error: '报告生成错误, 无法查看, 请检查日志详情!',
being_generated: '报告正在生成中...',
delete_confirm: '确认删除报告: ',
@@ -540,7 +542,10 @@ export default {
threadgroup_at_least_one: '至少启用一个线程组',
load_api_automation_jmx: '引用接口自动化场景',
project_file_exist: "项目中已存在该文件,请直接引用",
- project_file_update_type_error: '更新的文件类型必须一致'
+ report: {
+ diff: "对比"
+ },
+ project_file_update_type_error: '更新的文件类型必须一致',
},
api_test: {
creator: "创建人",
@@ -1193,7 +1198,7 @@ export default {
batch_delete_case: '批量删除',
batch_unlink: '批量取消关联',
project_name: '所属项目',
- status: '评审状态',
+ status: '评审结果',
status_prepare: '未评审',
status_pass: '通过',
status_un_pass: '未通过',
diff --git a/frontend/src/i18n/zh-TW.js b/frontend/src/i18n/zh-TW.js
index 61aaa62a43..e9f8dddcd4 100644
--- a/frontend/src/i18n/zh-TW.js
+++ b/frontend/src/i18n/zh-TW.js
@@ -5,6 +5,7 @@ export default {
pass_rate: '通過率',
execution_times: '執行次數',
cover: '覆蓋',
+ module_title: '默認模塊',
not_cover: '不覆蓋',
import: '導入',
import_success: '導入成功',
@@ -146,6 +147,7 @@ export default {
auth_redirect_tip: '即將跳轉到認證源頁面進行認證',
tag_tip: "輸入回車添加標簽",
node_name_tip: "名稱不能包含'\\'",
+ more_operator: "更多操作",
table: {
select_tip: "已选中 {0} 条数据"
},
@@ -281,7 +283,7 @@ export default {
select: '選擇組織',
delete_warning: '刪除該組織將同步刪除該組織下所有相關工作空間和相關工作空間下的所有項目,以及項目中的所有用例、接口測試、性能測試等,確定要刪除嗎?',
service_integration: '服務集成',
- defect_manage: '缺陷管理平臺',
+ defect_manage: '項目管理平臺',
message_settings: '消息設置',
message: {
jenkins_task_notification: 'Jenkins接口調用任務通知',
@@ -438,7 +440,7 @@ export default {
export: '導出',
export_to_ms_format: '導出 MeterSphere 格式',
export_to_swagger3_format: '導出 Swagger3.0 格式',
- compare: '比較',
+ compare: '報告比較',
generation_error: '報告生成錯誤, 無法查看, 請檢查日誌詳情!',
being_generated: '報告正在生成中...',
delete_confirm: '確認刪除報告: ',
@@ -540,7 +542,10 @@ export default {
threadgroup_at_least_one: '至少啟用一個線程組',
load_api_automation_jmx: '引用接口自動化場景',
project_file_exist: "項目中已存在該文件,請直接引用",
- project_file_update_type_error: '更新的文件類型必須一致'
+ project_file_update_type_error: '更新的文件類型必須一致',
+ report: {
+ diff: "對比"
+ },
},
api_test: {
creator: "創建人",