Browse Source

优化

master
陈裕财 3 years ago
parent
commit
3f66254f0d
  1. 107
      src/api/xm/core/xmTestAutoStep.js
  2. 3
      src/api/xm/core/xmTestCase.js
  3. 209
      src/views/xm/core/xmTestCase/XmTestCaseEdit.vue
  4. 1
      src/views/xm/core/xmTestCasedb/XmTestCasedbEdit.vue
  5. 273
      src/views/xm/core/xmTestPlanCase/XmTestPlanCaseEdit.vue
  6. 62
      src/views/xm/core/xmTestPlanCase/XmTestPlanCaseMng.vue

107
src/api/xm/core/xmTestAutoStep.js

@ -0,0 +1,107 @@
export const parseEnvVarValue=(valueTpl,env)=>{
if(!env){
return valueTpl
}
if(!valueTpl){
return valueTpl;
}else{
var reg = /\#\{(\w+)\}/g;
var value=valueTpl.replace(reg,function(){
var arg=arguments;
var key=arguments[1]
return env[key]
})
return value
}
}
export const autoStepToAxios=(autoStepObj,env)=>{
var axiosObj={url:autoStepObj.url,method:autoStepObj.method}
//参数处理
if(autoStepObj.method=='GET'){
var params={}
autoStepObj.params.forEach(k=>{
params[k.id]=parseEnvVarValue(k.value,env)
})
axiosObj.params=params
}else if(autoStepObj.method=='POST'){
var params={}
autoStepObj.params.forEach(k=>{
params[k.id]=parseEnvVarValue(k.value,env)
})
axiosObj.params=params
if(autoStepObj.bodyType=='json'){
axiosObj.data=autoStepObj.body
}else if(autoStepObj.bodyType=='xml'){
axiosObj.data=autoStepObj.body
}else if(autoStepObj.bodyType=='raw'){
axiosObj.data=autoStepObj.body
}else if(autoStepObj.bodyType=='form-data'){
var data={}
autoStepObj.body.forEach(k=>{
data[k.id]=parseEnvVarValue(k.value,env)
})
axiosObj.data=data;
}else if(autoStepObj.bodyType=='x-www-form-urlencoded'){
var data={}
autoStepObj.body.forEach(k=>{
data[k.id]=parseEnvVarValue(k.value,env)
})
axiosObj.data=data;
}
}
//header处理
if(autoStepObj.headers){
axiosObj.headers={}
autoStepObj.headers.forEach(k=>{
axiosObj.headers[k.id]=parseEnvVarValue(k.value,env)
})
}else {
axiosObj.headers={}
}
if(autoStepObj.authType=='bearer-token'){
axiosObj.headers['Authorization'] = 'Bearer '+parseEnvVarValue(autoStepObj.authData.bearerToken,env)
}else if(autoStepObj.authType=='basic-auth'){
var username=parseEnvVarValue(autoStepObj.authData.username,env)
var password=parseEnvVarValue(autoStepObj.authData.password,env)
var authorizationBasic = window.btoa(username + ':' + password);
axiosObj.headers['Authorization'] = 'Basic '+authorizationBasic
}
//cookie 处理
if(autoStepObj.cookies){
axiosObj.cookies={}
autoStepObj.cookies.forEach(k=>{
axiosObj.cookies[k.id]=parseEnvVarValue(k.value,env)
})
}
return axiosObj
}
export const initEnvVars=(casedbEnvJson,testPlanEnvJson)=>{
var casedbEnv={};
if(casedbEnvJson){
casedbEnv={}
var casedbEnvList=JSON.parse(casedbEnvJson)
casedbEnvList.forEach(k=>{
casedbEnv[k.id]=k.value
})
}
var testPlanEnv={};
if(testPlanEnvJson){
testPlanEnv={}
var testPlanEnvList=JSON.parse(testPlanEnvJson)
testPlanEnvList.forEach(k=>{
testPlanEnv[k.id]=k.value
})
}
Object.assign(casedbEnv,testPlanEnv)
return casedbEnv;
}

3
src/api/xm/core/xmTestCase.js

@ -43,4 +43,5 @@ export const initDicts = (that) => {
Object.assign(that.dicts,res.data.data)
});
}
};
};

209
src/views/xm/core/xmTestCase/XmTestCaseEdit.vue

@ -361,6 +361,8 @@
import util from '@/common/js/util';//
import config from "@/common/config"; //import
import { initDicts, addXmTestCase,editXmTestCase,editSomeFieldsXmTestCase } from '@/api/xm/core/xmTestCase';
import {autoStepToAxios,initAutoStep,calcAutoStep,initEnvVars} from '@/api/xm/core/XmTestAutoStep.js';//
import { mapGetters } from 'vuex'
import XmMenuSelect from '../xmMenu/XmMenuSelect'
import XmFuncSelect from '../xmFunc/XmFuncSelect'
@ -446,14 +448,16 @@ import JsonViewer from 'vue-json-viewer'
funcVisible:false,
activeTab:'1',
testCasedbVisible:false,
testRes:{},
resDataVisible:false,
paramsList:[{id:'',value:''}],//[{id:'',value:''}]
queryStr:'',
bodyList:[{id:'',value:''}],//[{id:'',value:''}]
bodyJson:'',
bodyXml:'',
cookieList:[{id:'',value:''}],//[{id:'',value:''}]
@ -466,15 +470,9 @@ import JsonViewer from 'vue-json-viewer'
basicAuth:{
username:'',
password:'',
},
expectResultSample:function(res){
//res={config:{},data:{} ,headers:{},status:200 }
if(res.status==200){
return true;
}else{
return false;
}
},
},
autoStep:{
url:'',
method:'GET',
@ -486,8 +484,7 @@ import JsonViewer from 'vue-json-viewer'
cookies:[],
expectResult:''
},
testRes:{},
resDataVisible:false,
}//end return
},//end data
methods: {
@ -556,190 +553,18 @@ import JsonViewer from 'vue-json-viewer'
deleteHeaderRow(row,index){
this.headerList.splice(index,1)
},
calcAutoStep(){
var autoStep={...this.autoStep}
autoStep.authData={}
//auth
if(this.autoStep.authType=='bearer-token'){
autoStep.authData.bearerToken=this.bearerToken.bearerToken
}else if(this.autoStep.authType=='basic-auth'){
autoStep.authData=this.basicAuth
}
//
autoStep.params=this.paramsList.filter(k=>k.id)
//body
if(this.autoStep.bodyType=='json'){
autoStep.body=this.bodyJson
}else if(this.autoStep.bodyType=='xml'){
autoStep.body=this.bodyXml
}else if(this.autoStep.bodyType=='raw'){
autoStep.body=this.bodyRaw
}else if(this.autoStep.bodyType=='form-data'){
autoStep.body=this.bodyList.filter(k=>k.id)
}else if(this.autoStep.bodyType=='x-www-form-urlencoded'){
autoStep.body=this.bodyList.filter(k=>k.id)
}else if(this.autoStep.bodyType=='x-www-form-urlencoded'){
autoStep.body=this.bodyList.filter(k=>k.id)
}else{
autoStep.body=null
}
//header
autoStep.headers=this.headerList.filter(k=>k.id)
autoStep.cookies=this.cookieList.filter(k=>k.id)
return autoStep;
},
initAutoStep(){
if(this.xmTestCase.autoStep){
this.autoStep=JSON.parse(this.xmTestCase.autoStep)
//
if(this.autoStep.params){
this.paramsList=this.autoStep.params
}
if(this.autoStep.headers){
this.headerList=this.autoStep.headers
}
if(this.autoStep.cookies){
this.cookieList=this.autoStep.cookies
}
if(this.autoStep.authType=='bearer-token'){
this.bearerToken=this.autoStep.authData
}
if(this.autoStep.authType=='basic-auth'){
this.basicAuth=this.autoStep.authData
}
if(this.autoStep.bodyType=='json'){
this.bodyJson=this.autoStep.body
}else if(this.autoStep.bodyType=='xml'){
this.bodyXml=this.autoStep.body
}else if(this.autoStep.bodyType=='raw'){
this.bodyRaw=this.autoStep.body
}else if(this.autoStep.bodyType=='form-data'){
this.bodyList=this.autoStep.body
}else if(this.autoStep.bodyType=='x-www-form-urlencoded'){
this.bodyList=this.autoStep.body
}
}else{
}
},
saveAutoStep(){
var autoStepObj=this.calcAutoStep();
var autoStepStr=JSON.stringify(autoStepObj)
this.editSomeFields(this.editForm,'autoStep',autoStepStr)
},
parseEnvVarValue(valueTpl,env){
if(!env){
return valueTpl
}
if(!valueTpl){
return valueTpl;
}else{
var reg = /\#\{(\w+)\}/g;
var value=valueTpl.replace(reg,function(){
var arg=arguments;
var key=arguments[1]
return env[key]
})
return value
}
},
autoStepToAxios(autoStepObj,env){
var axiosObj={url:autoStepObj.url,method:autoStepObj.method}
//
if(autoStepObj.method=='GET'){
var params={}
autoStepObj.params.forEach(k=>{
params[k.id]=this.parseEnvVarValue(k.value,env)
})
axiosObj.params=params
}else if(autoStepObj.method=='POST'){
var params={}
autoStepObj.params.forEach(k=>{
params[k.id]=this.parseEnvVarValue(k.value,env)
})
axiosObj.params=params
if(autoStepObj.bodyType=='json'){
axiosObj.data=autoStepObj.body
}else if(autoStepObj.bodyType=='xml'){
axiosObj.data=autoStepObj.body
}else if(autoStepObj.bodyType=='raw'){
axiosObj.data=autoStepObj.body
}else if(autoStepObj.bodyType=='form-data'){
var data={}
autoStepObj.body.forEach(k=>{
data[k.id]=this.parseEnvVarValue(k.value,env)
})
axiosObj.data=data;
}else if(autoStepObj.bodyType=='x-www-form-urlencoded'){
var data={}
autoStepObj.body.forEach(k=>{
data[k.id]=this.parseEnvVarValue(k.value,env)
})
axiosObj.data=data;
}
}
//header
if(autoStepObj.headers){
axiosObj.headers={}
autoStepObj.headers.forEach(k=>{
axiosObj.headers[k.id]=this.parseEnvVarValue(k.value,env)
})
}else {
axiosObj.headers={}
}
if(autoStepObj.authType=='bearer-token'){
axiosObj.headers['Authorization'] = 'Bearer '+this.parseEnvVarValue(autoStepObj.authData.bearerToken,env)
}else if(autoStepObj.authType=='basic-auth'){
var username=this.parseEnvVarValue(autoStepObj.authData.username,env)
var password=this.parseEnvVarValue(autoStepObj.authData.password,env)
var authorizationBasic = window.btoa(username + ':' + password);
axiosObj.headers['Authorization'] = 'Basic '+authorizationBasic
}
//cookie
if(autoStepObj.cookies){
axiosObj.cookies={}
autoStepObj.cookies.forEach(k=>{
axiosObj.cookies[k.id]=k.value
})
}
return axiosObj
var autoStep=calcAutoStep(this)
this.editSomeFields(this.editForm,'autoStep',JSON.stringify(autoStep));
},
sendMsgForTestSetting(){
var autoStepObj=this.calcAutoStep();
var autoStepObj=calcAutoStep(this);
if(!autoStepObj.url){
this.$notify({position:'bottom-left',showClose:true,message:'url不能为空',type: 'error'})
return;
}
var casedbEnv={};
if(this.xmTestCasedb && this.xmTestCasedb.envJson){
casedbEnv={}
var casedbEnvList=JSON.parse(this.xmTestCasedb.envJson)
casedbEnvList.forEach(k=>{
casedbEnv[k.id]=k.value
})
}
var testPlanEnv={};
if(this.xmTestPlan && this.xmTestPlan.envJson){
testPlanEnv={}
var testPlanEnvList=JSON.parse(this.xmTestPlan.envJson)
testPlanEnvList.forEach(k=>{
testPlanEnv[k.id]=k.value
})
}
Object.assign(casedbEnv,testPlanEnv)
var axiosObj=this.autoStepToAxios(autoStepObj,casedbEnv)
var env=initEnvVars(this.xmTestCasedb?this.xmTestCasedb.envJson:null,this.xmTestPlan ?this.xmTestPlan.envJson:null);
var axiosObj=autoStepToAxios(autoStepObj,env)
//axiosObj.headers['Access-Control-Allow-Origin']='*'
//axios.defaults.withCredentials = true // cookie
//axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'
@ -747,7 +572,7 @@ import JsonViewer from 'vue-json-viewer'
this.testRes=res
if(autoStepObj.expectResult){
var func=new Function('res','env',autoStepObj.expectResult)
var result=func(res,casedbEnv)
var result=func(res,env)
if(result==true){
this.$notify({position:'bottom-left',showClose:true,message:'成功',type: 'success'})
@ -792,7 +617,7 @@ import JsonViewer from 'vue-json-viewer'
this.editForm.id=null
}
this.initAutoStep();
initAutoStep(this,this.editForm.autoStep);
this.editFormBak={...this.editForm}
},
editSomeFields(row,fieldName,$event){

1
src/views/xm/core/xmTestCasedb/XmTestCasedbEdit.vue

@ -45,6 +45,7 @@
<script>
import util from '@/common/js/util';//
import config from "@/common/config"; //import
import { initDicts, addXmTestCasedb,editXmTestCasedb,editSomeFieldsXmTestCasedb } from '@/api/xm/core/xmTestCasedb';
import { mapGetters } from 'vuex'

273
src/views/xm/core/xmTestPlanCase/XmTestPlanCaseEdit.vue

@ -23,40 +23,47 @@
</el-form-item>
<el-form-item label="关联需求" prop="menuName">
{{editForm.menuName?editForm.menuName:'暂无关联需求'}} <el-button type="text" @click="menuFormVisible=true">查看需求</el-button>
</el-form-item>
<el-form-item label="测试方式" prop="testType">
<mdp-select-dict-tag placeholder="测试方式" clearable :dict="dicts['testType']" v-model="editForm.testType" effect="dark" @change="editSomeFields(editForm,'testType',$event)" :disabled="true"></mdp-select-dict-tag>
</el-form-item>
<el-form-item label="版本号" prop="verNum">
<el-input v-model="editForm.verNum" placeholder="版本号" :maxlength="50" @change="editSomeFields(editForm,'verNum',$event)"></el-input>
</el-form-item>
</el-col>
<el-col :span="18" class="border padding-left padding-right padding-top">
<el-form-item label="" prop="caseName" label-width="0px">
<el-row>
<span class="title-font-size">{{editForm.caseName}}</span>
</el-row>
<el-row class="label-font-color">
<span > 用例编号: {{editForm.caseId}} </span>
</el-row>
<el-row class="padding">
<el-col :span="6">
<mdp-select-user-xm label="执行人" userid-key="execUserid" username-key="execUsername" v-model="editForm" @change="editSomeFields(editForm,'execUserid',$event)"></mdp-select-user-xm>
</el-col>
<el-col :span="6">
<mdp-select-dict-x label="优先级" :dict="dicts['priority']" v-model="editForm.priority" @change="editSomeFields(editForm,'priority',$event)"></mdp-select-dict-x>
</el-col>
<el-col :span="6">
<mdp-select-dict-x label="执行结果" :dict="dicts['testStepTcode']" v-model="editForm.execStatus" :get-icon="getExecStatusIcon" @change="editSomeFields(editForm,'execStatus',$event)"></mdp-select-dict-x>
</el-col>
<el-col :span="6">
<el-button v-if="opType!='add'" style="margin-top:12px;float:right;" @click="$emit('next')" type="primary">下一条</el-button>
<el-row v-if="opType=='add'">
<el-button @click.native="handleCancel">取消</el-button>
<el-button v-loading="load.edit" type="primary" @click.native="saveSubmit" :disabled="load.edit==true">提交</el-button>
<el-form-item label="" prop="caseName" label-width="0px">
<el-row>
名称{{editForm.caseName}}<span class="label-font-color"> &nbsp;&nbsp; {{editForm.caseId}} </span>
</el-row>
<el-row v-if="editForm.testType=='1'" class="padding-bottom">
<div style="display:flex;">
<mdp-select-dict-tag label="请求方法" v-model="autoStep.method" :dict="dicts.autoTestMethod" :disabled="true"></mdp-select-dict-tag>
<span>{{ autoStep.url }}</span>
<el-button style="margin-left:10px;" type="primary" @click="sendMsgForTestSetting" title="执行用例">执行用例</el-button>
</div>
</el-row>
<el-row class="padding">
<el-col :span="6">
<mdp-select-user-xm label="执行人" userid-key="execUserid" username-key="execUsername" v-model="editForm" @change="editSomeFields(editForm,'execUserid',$event)"></mdp-select-user-xm>
</el-col>
<el-col :span="6">
<mdp-select-dict-x label="优先级" :dict="dicts['priority']" v-model="editForm.priority" @change="editSomeFields(editForm,'priority',$event)"></mdp-select-dict-x>
</el-col>
<el-col :span="6">
<mdp-select-dict-x label="执行结果" :dict="dicts['testStepTcode']" v-model="editForm.execStatus" :get-icon="getExecStatusIcon" @change="editSomeFields(editForm,'execStatus',$event)"></mdp-select-dict-x>
</el-col>
<el-col :span="6">
<el-button v-if="opType!='add'" style="margin-top:12px;float:right;" @click="$emit('next')" type="primary">下一条</el-button>
<el-row v-if="opType=='add'">
<el-button @click.native="handleCancel">取消</el-button>
<el-button v-loading="load.edit" type="primary" @click.native="saveSubmit" :disabled="load.edit==true">提交</el-button>
</el-row>
</el-col>
</el-row>
</el-col>
</el-row>
</el-form-item>
<el-tabs v-model="activateName" >
<el-tab-pane name="1" label="用例信息" >
@ -137,6 +144,118 @@
</el-row>
</el-row>
</el-tab-pane>
<el-tab-pane name="12" label="Params" v-if="editForm.testType=='1'">
<el-form-item label="查询参数" class="field">
{{queryStrCpd||'暂无'}}
</el-form-item>
<el-table
:data="autoStep.params"
style="width: 100%">
<el-table-column
prop="id"
label="参数名"
min-width="200">
</el-table-column>
<el-table-column
prop="value"
label="参数值"
min-width="250">
</el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane name="13" label="Body" v-if="editForm.testType=='1'">
<mdp-select-dict-x style="margin-bottom:10px;" class="padding" label="参数格式" v-model="autoStep.bodyType" :dict="dicts.autoTestBodyType" :disabled="true"></mdp-select-dict-x>
<el-input v-if="autoStep.bodyType=='json'" type="textarea" :rows="10" v-model="autoStep.body" readonly></el-input>
<el-input v-if="autoStep.bodyType=='xml'" type="textarea" :rows="10" v-model="autoStep.body" readonly></el-input>
<el-table v-if="autoStep.bodyType=='form-data'||autoStep.bodyType=='x-www-form-urlencoded'"
:data="autoStep.body"
style="width: 100%">
<el-table-column
prop="id"
label="参数名"
min-width="200">
</el-table-column>
<el-table-column
prop="value"
label="参数值"
min-width="250">
</el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane name="14" label="Cookie" v-if="editForm.testType=='1'">
<el-table
:data="autoStep.cookies"
style="width: 100%">
<el-table-column
prop="id"
label="参数名"
min-width="200">
</el-table-column>
<el-table-column
prop="value"
label="参数值"
min-width="250">
</el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane name="15" label="Header" v-if="editForm.testType=='1'">
<el-table
:data="autoStep.headers"
style="width: 100%">
<el-table-column
prop="id"
label="参数名"
min-width="200">
</el-table-column>
<el-table-column
prop="value"
label="参数值"
min-width="250">
</el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane name="16" label="Auth" v-if="editForm.testType=='1'">
<mdp-select-dict-x style="margin-bottom:10px;" class="padding" label="授权方式" v-model="autoStep.authType" :dict="dicts.autoTestAuthType" :disabled="true"></mdp-select-dict-x>
<el-row v-if="autoStep.authType=='basic-auth'">
<el-form-item label="username" class="field">
{{autoStep.authData.username}}
</el-form-item>
<el-form-item label="password" class="field">
{{autoStep.authData.password||'暂无'}}
</el-form-item>
</el-row>
<el-row v-if="autoStep.authType=='bearer-token'">
<el-form-item label="Bearer" class="field">
{{autoStep.authData.bearerToken}}
</el-form-item>
</el-row>
</el-tab-pane>
<el-tab-pane name="17" label="响应" v-if="editForm.testType=='1'">
<el-row class="padding">可使用的变量 res={config:{协议配置},data:{接口返回的业务数据对象} ,headers:{协议头,key-value型},status:状态码如200/201 }</el-row>
<el-row class="padding">可使用的变量 env={key1:value1,key2:value2,等等},env为测试库环境变量及测试计划的环境变量合并重复则以测试计划的为准可通过env['key1']获取值</el-row>
<el-form-item label="成功与失败的逻辑判断">
<el-input type="textarea" :rows="10" v-model="autoStep.expectResult" placeholder="成功与失败的判断" readonly></el-input>
</el-form-item>
<el-form-item label="例子">
if(res.status==200){<br/>
&nbsp;&nbsp;return true;<br/>
}else{<br/>
&nbsp;&nbsp;return false;<br/>
}<br/>
</el-form-item>
<el-form-item label="响应数据预览" >
<el-row> <el-checkbox v-model="resDataVisible">显示响应数据</el-checkbox></el-row>
<json-viewer v-if="resDataVisible==true" :value="testRes" copyable theme="my-awesome-json-theme"></json-viewer>
</el-form-item>
</el-tab-pane>
<el-tab-pane name="3" label="缺陷">
<xm-question-mng v-if="activateName=='3'" :xm-test-plan-case="editForm" :xm-product="{id:editForm.productId,productName:editForm.productName}" :sel-project="{id:editForm.projectId,name:editForm.projectName}"></xm-question-mng>
</el-tab-pane>
@ -173,6 +292,8 @@
import util from '@/common/js/util';//
import config from "@/common/config"; //import
import { initDicts, addXmTestPlanCase,editXmTestPlanCase,editSomeFieldsXmTestPlanCase } from '@/api/xm/core/xmTestPlanCase';
import {autoStepToAxios,initEnvVars} from '@/api/xm/core/XmTestAutoStep.js';//
import { mapGetters } from 'vuex'
import TestStepResult from './TestStepResult.vue';
import MyInput from '@/components/MDinput/index';
@ -180,19 +301,25 @@ import TestStepResult from './TestStepResult.vue';
import XmQuestionMng from '@/views/xm/core/xmQuestion/XmQuestionMng';//
import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//
import XmQuestionAdd from '../xmQuestion/XmQuestionEdit';//
import axios from 'axios'//访
import JsonViewer from 'vue-json-viewer'
export default {
name:'xmTestPlanCaseEdit',
components: {
TestStepResult,MyInput,XmMenuEdit:()=>import('../xmMenu/XmMenuEdit.vue'),XmQuestionMng,XmQuestionAdd,MdpSelectUserXm,
'xm-workload-record':()=>import("../xmWorkload/XmWorkloadRecord"),
JsonViewer,
},
computed: {
...mapGetters([ 'userInfo' ]),
queryStrCpd(){
return this.autoStep.params.filter(k=>k.id).map(k=>k.id+'='+k.value).join("&")
}
},
props:['xmTestPlanCase','visible','opType'],
props:['xmTestPlanCase','visible','opType','xmTestCasedb','xmTestPlan'],
watch: {
'xmTestPlanCase':function( xmTestPlanCase ) {
@ -229,6 +356,35 @@ import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修
next:false,
activateName:'1',
addBugVisible:false,
testRes:{},
resDataVisible:false,
autoStep:{
url:'',
method:'GET',
authType:'none',
authData:{
},
bodyType:'json',
params:[],
body:[],
cookies:[],
expectResult:''
},
autoStepInit:{
url:'',
method:'',
authType:'',
authData:{
},
bodyType:'',
params:[],
body:[],
cookies:[],
expectResult:''
}
}//end return
},//end data
methods: {
@ -268,6 +424,10 @@ import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修
}
});
},
initQueryStr(){
this.queryStr=this.autoStep.params.map(k=>k.id+'='+k.value).join("&")
},
initData: function(){
this.currOpType=this.opType
if(this.xmTestPlanCase){
@ -279,9 +439,66 @@ import MdpSelectUserXm from '@/views/xm/core/components/MdpSelectUserXm';//修
}else{
}
if(!this.editForm.autoStep){
this.autoStep={...this.autoStepInit}
}else{
this.autoStep=JSON.parse(this.editForm.autoStep)
}
this.editFormBak={...this.editForm}
},
sendMsgForTestSetting(){
this.activateName='17'
var autoStepObj=this.autoStep
if(!autoStepObj.url){
this.$notify({position:'bottom-left',showClose:true,message:'url不能为空',type: 'error'})
return;
}
var env=initEnvVars(this.xmTestCasedb?this.xmTestCasedb.envJson:null,this.xmTestPlan ?this.xmTestPlan.envJson:null);
var axiosObj=autoStepToAxios(autoStepObj,env)
//axiosObj.headers['Access-Control-Allow-Origin']='*'
//axios.defaults.withCredentials = true // cookie
//axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'
axios(axiosObj).then(res=>{
this.testRes=res
if(autoStepObj.expectResult){
var func=new Function('res','env',autoStepObj.expectResult)
var result=func(res,env)
if(result==true){
this.$notify({position:'bottom-left',showClose:true,message:'成功',type: 'success'})
}else{
this.$notify({position:'bottom-left',showClose:true,message:'失败',type: 'error'})
}
this.editSomeFields(this.editForm,'execStatus',result==true?"2":"4")
}else{
this.$notify({position:'bottom-left',showClose:true,message:'执行完毕',type: res.status==200?'success':'error'})
this.editSomeFields(this.editForm,'execStatus',res.status==200?"2":"4")
}
}).catch(res=>{
debugger;
var func=new Function('res','env',autoStepObj.expectResult)
var result=func(res,env)
if(result==true){
this.$notify({position:'bottom-left',showClose:true,message:'成功',type: 'success'})
this.editSomeFields(this.editForm,'execStatus', "2")
}else{
if(res.code=='401'){
this.$notify({position:'bottom-left',showClose:true,message:'未登录,可能是授权数据过期',type: 'error'})
}else{
this.$notify({position:'bottom-left',showClose:true,message:'失败',type: 'error'})
}
this.editSomeFields(this.editForm,'execStatus', "4")
}
})
},
saveAutoStep(){
this.$notify({position:'bottom-left',showClose:true,message:'当前执行用例不允许修改',type:'error'})
},
editSomeFields(row,fieldName,$event){
if(this.opType=='add'){
return;

62
src/views/xm/core/xmTestPlanCase/XmTestPlanCaseMng.vue

@ -9,12 +9,13 @@
<el-row>
<el-input v-model="filters.key" style="width: 15%;" placeholder="模糊查询" clearable></el-input>
<mdp-select-dict style="width:15%;" placeholder="用例状态" clearable :dict="dicts['testCaseStatus']" v-model="filters.caseStatus" effect="dark"></mdp-select-dict>
<mdp-select-dict placeholder="测试方式" style="width:15%;" clearable :dict="dicts['testType']" v-model="filters.execType" effect="dark"></mdp-select-dict>
<mdp-select-dict placeholder="测试方式" style="width:15%;" clearable :dict="dicts['testType']" v-model="filters.testType" effect="dark"></mdp-select-dict>
<mdp-select-dict style="width:15%;" placeholder="执行结果" clearable :dict="dicts['testStepTcode']" v-model="filters.execStatus" effect="dark"></mdp-select-dict>
<el-button v-loading="load.list" :disabled="load.list==true" @click="searchXmTestPlanCases" icon="el-icon-search">查询</el-button>
<span style="float:right;" v-if="!xmTestCase||!xmTestCase.id">
<el-button type="primary" @click="batchExec" icon="el-icon-video-play">批量执行</el-button>
<el-button type="primary" @click="showAdd" icon="el-icon-plus">将用例纳入计划</el-button>
<el-button type="danger" v-loading="load.del" @click="batchDel" :disabled="this.sels.length===0 || load.del==true" icon="el-icon-delete"></el-button>
</span>
@ -43,6 +44,11 @@
</template>
</el-table-column>
<template v-if="select!==true">
<el-table-column prop="testType" label="执行方式" width="120" >
<template slot-scope="scope">
<mdp-select-dict-tag @visible-change="selectVisible(scope.row,$event)" :dict="dicts['testType']" v-model="scope.row.testType" @change="editSomeFields(scope.row,'testType',$event)" :disabled="true"></mdp-select-dict-tag>
</template>
</el-table-column>
<el-table-column prop="execStatus" label="执行结果" width="120" show-overflow-tooltip>
<template slot-scope="scope">
<mdp-select-dict-tag @visible-change="selectVisible(scope.row,$event)" :dict="dicts['testStepTcode']" v-model="scope.row.execStatus" effect="dark" @change="editSomeFields(scope.row,'execStatus',$event)"></mdp-select-dict-tag>
@ -81,7 +87,7 @@
<el-row>
<!--编辑 XmTestPlanCase 测试计划与用例关系表界面-->
<el-dialog title="测试执行" :visible.sync="editFormVisible" fullscreen width="90%" top="20px" append-to-body :close-on-click-modal="false">
<xm-test-plan-case-edit op-type="edit" :xm-test-plan-case="editForm" :visible="editFormVisible" @cancel="editFormVisible=false" @submit="afterEditSubmit" @edit-fields="onEditFields" @next="nextEdit"></xm-test-plan-case-edit>
<xm-test-plan-case-edit op-type="edit" :xm-test-plan-case="editForm" :xm-test-casedb="xmTestCasedb" :xm-test-plan="xmTestPlan" :visible="editFormVisible" @cancel="editFormVisible=false" @submit="afterEditSubmit" @edit-fields="onEditFields" @next="nextEdit"></xm-test-plan-case-edit>
</el-dialog>
<!--新增 XmTestPlanCase 测试计划与用例关系表界面-->
@ -140,7 +146,7 @@ export default {
filters: {
key: '',
xmFunc:null,
execType:'',
testType:'',
caseStatus:'',
execStatus:''
},
@ -229,8 +235,8 @@ export default {
if(this.filters.execStatus){
params.execStatus=this.filters.execStatus
}
if(this.filters.execType){
params.execType=this.filters.execType
if(this.filters.testType){
params.testType=this.filters.testType
}
if(this.xmTestCasedb && this.xmTestCasedb.id){
params.casedbId=this.xmTestCasedb.id
@ -389,6 +395,52 @@ export default {
this.searchXmTestPlanCases();
})
} ,
batchExec(){
this.pageInfo.pageSize=500
this.pageInfo.count=false;
this.pageInfo.pageNum=1
let params = {
pageSize: this.pageInfo.pageSize,
pageNum: this.pageInfo.pageNum,
total: this.pageInfo.total,
count:this.pageInfo.count
};
if(this.xmTestPlan && this.xmTestPlan.id){
params.planId=this.xmTestPlan.id
}else{
this.$notify({ position:'bottom-left',showClose:true, message:'当前视图不允许批量执行,请选定测试计划后再试', type: 'error' });
return;
}
this.load.list = true;
listXmTestPlanCase(params).then((res) => {
var tips=res.data.tips;
if(tips.isOk){
this.pageInfo.total = res.data.total;
this.pageInfo.count=false;
this.xmTestPlanCases = res.data.data;
doBatchExec(this.xmTestPlanCases)
}else{
this.$notify({ position:'bottom-left',showClose:true, message: tips.msg, type: 'error' });
}
this.load.list = false;
}).catch( err => this.load.list = false );
},
doBatchExec(planCases){
if(!planCases||planCases.length==0){
this.$notify({ position:'bottom-left',showClose:true, message:'测试用例为0条,无须执行', type: 'error' });
return;
}
if(planCases.length>=this.pageInfo.pageSize){
this.$notify({ position:'bottom-left',showClose:true, message:'测试用例不能超过'+(this.pageInfo.pageSize-1)+'条', type: 'error' });
return;
}
this.doBatchExecVisible=true;
planCases.forEach(k=>{
})
},
onXmFuncRowClick(row){
this.filters.xmFunc=row
this.searchXmTestPlanCases();

Loading…
Cancel
Save