feat: 功能用例创建版本支持选择是否复制其他信息

This commit is contained in:
zhangdahai112 2022-01-15 23:13:12 +08:00 committed by zhangdahai112
parent e361c62c67
commit d82cf735ad
10 changed files with 259 additions and 21 deletions

View File

@ -423,4 +423,15 @@ public class TestCaseController {
public void deleteApiDefinition(@PathVariable String version, @PathVariable String refId) {
testCaseService.deleteTestCaseByVersion(refId, version);
}
/**
* 判断是否有其他信息
*
* @param caseId 用例 ID
* @return
*/
@GetMapping("hasOtherInfo/{caseId}")
public Boolean hasOtherInfo(@PathVariable String caseId) {
return testCaseService.hasOtherInfo(caseId);
}
}

View File

@ -13,9 +13,30 @@ import java.util.List;
public class EditTestCaseRequest extends TestCaseWithBLOBs {
private List<FileMetadata> updatedFileList;
private List<String> follows;
private OtherInfoConfig otherInfoConfig;
/**
* 复制测试用例后要进行复制的文件Id list
*/
private List<String> fileIds = new ArrayList<>();
private List<List<String>> selected = new ArrayList<>();
/**
* 创建新版本时 是否连带复制其他信息的配置类
*/
@Getter
@Setter
public static class OtherInfoConfig {
//是否复制备注
private boolean remark;
//是否复制关联测试
private boolean relateTest;
//是否复制关联需求
private boolean relateDemand;
//是否复制关联缺陷
private boolean relateIssue;
//是否复制附件
private boolean archive;
//是否复制依赖
private boolean dependency;
}
}

View File

@ -62,6 +62,7 @@ import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionUtils;
import org.springframework.context.annotation.Lazy;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
@ -157,6 +158,9 @@ public class TestCaseService {
@Resource
private ProjectVersionService projectVersionService;
@Resource
@Lazy
private IssuesService issuesService;
@Resource
private ExtProjectVersionMapper extProjectVersionMapper;
private void setNode(TestCaseWithBLOBs testCase) {
@ -265,7 +269,7 @@ public class TestCaseService {
return testCaseMapper.selectByPrimaryKey(testCaseId);
}
public TestCaseWithBLOBs editTestCase(TestCaseWithBLOBs testCase) {
public TestCaseWithBLOBs editTestCase(EditTestCaseRequest testCase) {
checkTestCustomNum(testCase);
testCase.setUpdateTime(System.currentTimeMillis());
// 更新数据
@ -274,6 +278,18 @@ public class TestCaseService {
if (StringUtils.isNotBlank(testCase.getVersionId())) {
example.getOredCriteria().get(0).andVersionIdEqualTo(testCase.getVersionId());
}
createNewVersionOrNot(testCase, example);
testCaseMapper.updateByPrimaryKeySelective(testCase);
return testCaseMapper.selectByPrimaryKey(testCase.getId());
}
/**
* 根据前后端 verionId 判定是编辑旧数据还是创建新版本
*
* @param testCase
* @param example
*/
private void createNewVersionOrNot(EditTestCaseRequest testCase, TestCaseExample example) {
if (testCaseMapper.updateByExampleSelective(testCase, example) == 0) {
// 插入新版本的数据
TestCaseWithBLOBs oldTestCase = testCaseMapper.selectByPrimaryKey(testCase.getId());
@ -285,10 +301,70 @@ public class TestCaseService {
testCase.setCreateUser(SessionUtils.getUserId());
testCase.setOrder(oldTestCase.getOrder());
testCase.setRefId(oldTestCase.getRefId());
DealWithOtherInfo(testCase, oldTestCase);
testCaseMapper.insertSelective(testCase);
}
testCaseMapper.updateByPrimaryKeySelective(testCase);
return testCaseMapper.selectByPrimaryKey(testCase.getId());
}
/**
* 处理其他信息的复制问题
*
* @param testCase
* @param oldTestCase
*/
private void DealWithOtherInfo(EditTestCaseRequest testCase, TestCaseWithBLOBs oldTestCase) {
EditTestCaseRequest.OtherInfoConfig otherInfoConfig = testCase.getOtherInfoConfig();
if (otherInfoConfig != null) {
if (!otherInfoConfig.isRemark()) {
testCase.setRemark(null);
}
if (!otherInfoConfig.isRelateDemand()) {
testCase.setDemandId(null);
testCase.setDemandName(null);
}
if (otherInfoConfig.isRelateIssue()) {
List<IssuesDao> issuesDaos = issuesService.getIssues(oldTestCase.getId());
if (CollectionUtils.isNotEmpty(issuesDaos)) {
issuesDaos.forEach(issue -> {
TestCaseIssues t = new TestCaseIssues();
t.setId(UUID.randomUUID().toString());
t.setTestCaseId(testCase.getId());
t.setIssuesId(issue.getId());
testCaseIssuesMapper.insertSelective(t);
});
}
}
if (otherInfoConfig.isRelateTest()) {
List<TestCaseTestDao> testCaseTestDaos = getRelateTest(oldTestCase.getId());
if (CollectionUtils.isNotEmpty(testCaseTestDaos)) {
testCaseTestDaos.forEach(test -> {
test.setTestCaseId(testCase.getId());
testCaseTestMapper.insertSelective(test);
});
}
}
if (otherInfoConfig.isArchive()) {
List<FileMetadata> files = fileService.getFileMetadataByCaseId(oldTestCase.getId());
if (CollectionUtils.isNotEmpty(files)) {
files.forEach(file -> {
TestCaseFile testCaseFile = new TestCaseFile();
testCaseFile.setCaseId(testCase.getId());
testCaseFile.setFileId(file.getId());
testCaseFileMapper.insertSelective(testCaseFile);
});
}
}
if (otherInfoConfig.isDependency()) {
List<RelationshipEdgeDTO> preRelations = getRelationshipCase(testCase.getId(), "PRE");
List<RelationshipEdgeDTO> postRelations = getRelationshipCase(testCase.getId(), "POST");
if (CollectionUtils.isNotEmpty(preRelations)) {
preRelations.forEach(relation -> {
});
}
}
}
}
public TestCaseWithBLOBs checkTestCaseExist(TestCaseWithBLOBs testCase) {
@ -1649,7 +1725,9 @@ public class TestCaseService {
if (editCustomFieldsPriority(dbCase, item.getPriority())) {
item.setCustomFields(dbCase.getCustomFields());
}
editTestCase(item);
EditTestCaseRequest editRequest = new EditTestCaseRequest();
BeanUtils.copyBean(editRequest, item);
editTestCase(editRequest);
changeOrder(item, request.getProjectId());
} else {
item.setMaintainer(SessionUtils.getUserId());
@ -2329,4 +2407,16 @@ public class TestCaseService {
testCase.setRefId(refId);
return extTestCaseMapper.deletePublic(testCase);
}
public Boolean hasOtherInfo(String caseId) {
TestCaseWithBLOBs tc = getTestCase(caseId);
if (tc != null) {
if (StringUtils.isNotBlank(tc.getRemark()) || StringUtils.isNotBlank(tc.getDemandId()) || CollectionUtils.isNotEmpty(getRelateTest(caseId))
|| CollectionUtils.isNotEmpty(issuesService.getIssues(caseId)) || CollectionUtils.isNotEmpty(getRelationshipCase(caseId, "PRE")) || CollectionUtils.isNotEmpty(getRelationshipCase(caseId, "POST"))
|| CollectionUtils.isNotEmpty(fileService.getFileMetadataByCaseId(caseId))) {
return true;
}
}
return false;
}
}

@ -1 +1 @@
Subproject commit b35dfb7f4571ed9e9496ff67339b9118232b4bbd
Subproject commit ceffcd883aa519d3f7bfb2641337abaaae4c9295

View File

@ -23,6 +23,8 @@
ref="versionHistory"
:version-data="versionData"
:current-id="currentTestCaseInfo.id"
:is-test-case-version="true"
@confirmOtherInfo="confirmOtherInfo"
:current-project-id="currentProjectId"
@compare="compare" @checkout="checkout" @create="create" @del="del"/>
<el-dropdown split-button type="primary" class="ms-api-buttion" @click="handleCommand"
@ -139,7 +141,6 @@
@getComments="getComments" ref="testCaseComment"/>
</el-form>
</div>
<ms-change-history ref="changeHistory"/>
<el-dialog
@ -197,6 +198,7 @@ import MsChangeHistory from "../../../history/ChangeHistory";
import {getTestTemplate} from "@/network/custom-field-template";
import CustomFiledFormItem from "@/business/components/common/components/form/CustomFiledFormItem";
import TestCaseVersionDiff from "@/business/components/track/case/version/TestCaseVersionDiff";
import VersionCreateOtherInfoSelect from "@/business/components/track/case/components/VersionCreateOtherInfoSelect";
const requireComponent = require.context('@/business/components/xpack/', true, /\.vue$/);
const versionHistory = requireComponent.keys().length > 0 ? requireComponent("./version/VersionHistory.vue") : {};
@ -218,7 +220,8 @@ export default {
MsTestCaseStepRichText,
MsChangeHistory,
'MsVersionHistory': versionHistory.default,
TestCaseVersionDiff
TestCaseVersionDiff,
VersionCreateOtherInfoSelect,
},
data() {
return {
@ -311,6 +314,7 @@ export default {
dialogVisible: false,
oldData: null,
newData: null,
selectedOtherInfo: null,
currentProjectId: "" ,
};
},
@ -767,6 +771,11 @@ export default {
callback(this);
}
//
//
if (hasLicense()) {
this.getVersionHistory();
}
});
}
},
@ -790,6 +799,10 @@ export default {
param.type = 'functional';
buildCustomFields(this.form, param, this.testCaseTemplate);
this.parseOldFields(param);
//
if (this.selectedOtherInfo) {
param.otherInfoConfig = this.selectedOtherInfo;
}
return param;
},
parseOldFields(param) {
@ -944,12 +957,13 @@ export default {
}
}
},
getVersionHistory() {
getVersionHistory(param) {
this.$get('/test/case/versions/' + this.currentTestCaseInfo.id, response => {
for (let i = 0; i < response.data.length; i++) {
this.currentProjectId = response.data[i].projectId;
}
this.versionData = response.data;
this.$refs.versionHistory.cancelOtherInfo();
this.$refs.versionHistory.loading = false;
});
},
@ -988,10 +1002,16 @@ export default {
});
}
},
create(row) {
async create(row) {
//
this.form.versionId = row.id;
this.saveCase(this.getVersionHistory);
let hasOtherInfo = await this.hasOtherInfo();
if (hasOtherInfo) {
this.$refs.versionHistory.loading = false;
this.$refs.versionHistory.showOtherInfo();
} else {
this.saveCase();
}
},
del(row) {
let that = this;
@ -1011,7 +1031,19 @@ export default {
},
changeType(type) {
this.type = type;
},
hasOtherInfo() {
return new Promise((resolve) => {
this.$get("test/case/hasOtherInfo/" + this.form.id, (res) => {
resolve(res.data);
})
}
);
},
confirmOtherInfo(selectedOtherInfo) {
this.selectedOtherInfo = selectedOtherInfo;
this.saveCase();
},
}
}
</script>

View File

@ -0,0 +1,82 @@
<template>
<div>
<el-form ref="form" :model="form" label-width="10px" label-position="left">
<el-row>
<el-col :span="24">
<el-form-item>
<span>{{ $t('test_track.case.sync_to_new_version') }}</span>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="6">
<el-form-item>
<el-checkbox v-model="form.remark">{{ $t('commons.remark') }}</el-checkbox>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item>
<el-checkbox v-model="form.relateTest">{{ $t('test_track.case.relate_test') }}</el-checkbox>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item>
<el-checkbox v-model="form.relateDemand">{{ $t('test_track.related_requirements') }}</el-checkbox>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item>
<el-checkbox v-model="form.relateIssue">{{ $t('test_track.case.relate_issue') }}</el-checkbox>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="6">
<el-form-item>
<el-checkbox v-model="form.dependency">{{ $t('commons.relationship.name') }}</el-checkbox>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item>
<el-checkbox v-model="form.archive">{{ $t('test_track.case.attachment') }}</el-checkbox>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-form-item style="float:right">
<el-button size="small" @click="$emit('cancelOtherInfo')">{{ $t('commons.cancel') }}</el-button>
<el-button type="primary" size="small" @click="confirmOtherInfo">{{ $t('commons.confirm') }}</el-button>
</el-form-item>
</el-row>
</el-form>
</div>
</template>
<script>
export default {
name: "VersionCreateOtherInfoSelect",
data() {
return {
form: {
remark: false,
relateTest: false,
relateDemand: false,
relateIssue: false,
archive: false,
dependency: false,
}
};
},
methods: {
confirmOtherInfo() {
this.$emit("confirmOtherInfo", this.form);
}
}
};
</script>
<style scoped>
</style>

@ -1 +1 @@
Subproject commit b6c673194c6d57ecb19ece5319716068cfc37aab
Subproject commit 0a7c20cc28e15d8036e9d29694ab284c6571af8b

View File

@ -2324,7 +2324,8 @@ export default {
all_case: "All Case",
},
reporter: 'Reporter',
lastmodify: 'Last Modify'
lastmodify: 'Last Modify',
sync_to_new_version: "Sync to latest version",
},
test_resource_pool: {
id: 'Resource Pool ID',

View File

@ -2031,7 +2031,8 @@ export default {
},
case_desc: "用例描述",
passing_rate:'用例通过率',
version: "版本"
version: "版本",
sync_to_new_version: "同步以下信息到新版本",
},
plan: {
test_plan: "测试计划",

View File

@ -2030,8 +2030,8 @@ export default {
export_tip: "請切換成接口列表勾選用例導出!"
},
case_desc: "用例描述",
passing_rate: '用例通過率'
passing_rate: '用例通過率',
sync_to_new_version: "同步以下信息到新版本",
},
plan: {
test_plan: "測試計劃",
@ -2328,7 +2328,7 @@ export default {
all_case: "所有用例",
},
reporter: '報告人',
lastmodify: '最後更改'
lastmodify: '最後更改',
},
test_resource_pool: {
id: "測試資源池ID",