Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
f872fb6692
|
@ -20,8 +20,18 @@ public interface ExtTestCaseMapper {
|
|||
|
||||
TestCase getMaxNumByProjectId(@Param("projectId") String projectId);
|
||||
|
||||
/**
|
||||
* 获取不在测试计划中的用例
|
||||
* @param request
|
||||
* @return
|
||||
*/
|
||||
List<TestCase> getTestCaseByNotInPlan(@Param("request") QueryTestCaseRequest request);
|
||||
|
||||
/**
|
||||
* 获取不在评审范围中的用例
|
||||
* @param request
|
||||
* @return
|
||||
*/
|
||||
List<TestCase> getTestCaseByNotInReview(@Param("request") QueryTestCaseRequest request);
|
||||
|
||||
/**
|
||||
|
|
|
@ -286,6 +286,7 @@ public class TestCaseService {
|
|||
testCaseNodeService.createNodes(xmindParser.getNodePaths(), projectId);
|
||||
}
|
||||
if (!xmindParser.getTestCase().isEmpty()) {
|
||||
Collections.reverse(xmindParser.getTestCase());
|
||||
this.saveImportData(xmindParser.getTestCase(), projectId);
|
||||
xmindParser.clear();
|
||||
}
|
||||
|
@ -335,6 +336,9 @@ public class TestCaseService {
|
|||
AtomicInteger num = new AtomicInteger();
|
||||
num.set(getNextNum(projectId) + testCases.size());
|
||||
testCases.forEach(testcase -> {
|
||||
testcase.setId(UUID.randomUUID().toString());
|
||||
testcase.setCreateTime(System.currentTimeMillis());
|
||||
testcase.setUpdateTime(System.currentTimeMillis());
|
||||
testcase.setNodeId(nodePathMap.get(testcase.getNodePath()));
|
||||
testcase.setSort(sort.getAndIncrement());
|
||||
testcase.setNum(num.decrementAndGet());
|
||||
|
|
|
@ -110,12 +110,6 @@ public class TestReviewTestCaseService {
|
|||
MSException.throwException("非此用例的评审人员!");
|
||||
}
|
||||
|
||||
TestCaseReview testCaseReview = testCaseReviewMapper.selectByPrimaryKey(reviewId);
|
||||
Long endTime = testCaseReview.getEndTime();
|
||||
if (System.currentTimeMillis() > endTime) {
|
||||
MSException.throwException("此用例评审已到截止时间!");
|
||||
}
|
||||
|
||||
// 记录测试用例评审状态变更
|
||||
testCaseReviewTestCase.setStatus(testCaseReviewTestCase.getStatus());
|
||||
testCaseReviewTestCase.setReviewer(SessionUtils.getUser().getId());
|
||||
|
|
|
@ -6,7 +6,6 @@ import com.google.common.collect.ImmutableMap;
|
|||
import io.metersphere.base.domain.TestCaseWithBLOBs;
|
||||
import io.metersphere.commons.constants.TestCaseConstants;
|
||||
import io.metersphere.commons.utils.BeanUtils;
|
||||
import io.metersphere.commons.utils.LogUtil;
|
||||
import io.metersphere.excel.domain.TestCaseExcelData;
|
||||
import io.metersphere.i18n.Translator;
|
||||
import io.metersphere.track.service.TestCaseService;
|
||||
|
@ -82,6 +81,7 @@ public class XmindCaseParser {
|
|||
}
|
||||
|
||||
private final Map<String, String> caseTypeMap = ImmutableMap.of("功能测试", "functional", "性能测试", "performance", "接口测试", "api");
|
||||
private final List<String> priorityList = Arrays.asList("P0", "P1", "P2", "P3");
|
||||
|
||||
/**
|
||||
* 验证模块的合规性
|
||||
|
@ -111,6 +111,14 @@ public class XmindCaseParser {
|
|||
*/
|
||||
private boolean validate(TestCaseWithBLOBs data) {
|
||||
String nodePath = data.getNodePath();
|
||||
if (!nodePath.startsWith("/")) {
|
||||
nodePath = "/" + nodePath;
|
||||
}
|
||||
if (nodePath.endsWith("/")) {
|
||||
nodePath = nodePath.substring(0, nodePath.length() - 1);
|
||||
}
|
||||
data.setNodePath(nodePath);
|
||||
|
||||
StringBuilder stringBuilder = new StringBuilder();
|
||||
|
||||
if (data.getName().length() > 50) {
|
||||
|
@ -141,17 +149,33 @@ public class XmindCaseParser {
|
|||
if (testCaseNames.contains(data.getName())) {
|
||||
boolean dbExist = testCaseService.exist(data);
|
||||
if (dbExist) {
|
||||
// db exist
|
||||
stringBuilder.append(Translator.get("test_case_already_exists_excel") + ":" + data.getName() + "; ");
|
||||
}
|
||||
|
||||
} else {
|
||||
testCaseNames.add(data.getName());
|
||||
}
|
||||
|
||||
// 用例等级和用例性质处理
|
||||
if (!priorityList.contains(data.getPriority())) {
|
||||
stringBuilder.append(data.getName() + ":" + Translator.get("test_case_priority") + Translator.get("incorrect_format") + "; ");
|
||||
}
|
||||
if (data.getType() == null) {
|
||||
stringBuilder.append(data.getName() + ":" + Translator.get("test_case_type") + Translator.get("incorrect_format") + "; ");
|
||||
}
|
||||
|
||||
|
||||
// 重复用例校验
|
||||
TestCaseExcelData compartData = new TestCaseExcelData();
|
||||
BeanUtils.copyBean(compartData, data);
|
||||
if (compartDatas.contains(compartData)) {
|
||||
stringBuilder.append(Translator.get("test_case_already_exists_excel") + ":" + compartData.getName() + "; ");
|
||||
}
|
||||
if (!StringUtils.isEmpty(stringBuilder.toString())) {
|
||||
process.append(stringBuilder.toString());
|
||||
return false;
|
||||
}
|
||||
compartDatas.add(compartData);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -162,7 +186,7 @@ public class XmindCaseParser {
|
|||
for (Attached item : attacheds) {
|
||||
if (isAvailable(item.getTitle(), TC_REGEX)) {
|
||||
item.setParent(parent);
|
||||
this.newTestCase(item.getTitle(), parent.getPath(), item.getChildren() != null ? item.getChildren().getAttached() : null);
|
||||
this.formatTestCase(item.getTitle(), parent.getPath(), item.getChildren() != null ? item.getChildren().getAttached() : null);
|
||||
} else {
|
||||
String nodePath = parent.getPath() + "/" + item.getTitle();
|
||||
item.setPath(nodePath);
|
||||
|
@ -207,27 +231,36 @@ public class XmindCaseParser {
|
|||
*/
|
||||
private String getSteps(List<Attached> attacheds) {
|
||||
JSONArray jsonArray = new JSONArray();
|
||||
for (int i = 0; i < attacheds.size(); i++) {
|
||||
if (!attacheds.isEmpty()) {
|
||||
for (int i = 0; i < attacheds.size(); i++) {
|
||||
// 保持插入顺序,判断用例是否有相同的steps
|
||||
JSONObject step = new JSONObject(true);
|
||||
step.put("num", i + 1);
|
||||
step.put("desc", attacheds.get(i).getTitle());
|
||||
if (attacheds.get(i).getChildren() != null && !attacheds.get(i).getChildren().getAttached().isEmpty()) {
|
||||
step.put("result", attacheds.get(i).getChildren().getAttached().get(0).getTitle());
|
||||
}
|
||||
jsonArray.add(step);
|
||||
}
|
||||
} else {
|
||||
// 保持插入顺序,判断用例是否有相同的steps
|
||||
JSONObject step = new JSONObject(true);
|
||||
step.put("num", i + 1);
|
||||
step.put("desc", attacheds.get(i).getTitle());
|
||||
if (attacheds.get(i).getChildren() != null && !attacheds.get(i).getChildren().getAttached().isEmpty()) {
|
||||
step.put("result", attacheds.get(i).getChildren().getAttached().get(0).getTitle());
|
||||
}
|
||||
step.put("num", 1);
|
||||
step.put("desc", "");
|
||||
step.put("result", "");
|
||||
jsonArray.add(step);
|
||||
}
|
||||
return jsonArray.toJSONString();
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化一个用例
|
||||
* 格式化一个用例
|
||||
*/
|
||||
private void newTestCase(String title, String nodePath, List<Attached> attacheds) {
|
||||
private void formatTestCase(String title, String nodePath, List<Attached> attacheds) {
|
||||
TestCaseWithBLOBs testCase = new TestCaseWithBLOBs();
|
||||
testCase.setProjectId(projectId);
|
||||
testCase.setMaintainer(maintainer);
|
||||
testCase.setPriority("P0");
|
||||
testCase.setPriority(priorityList.get(0));
|
||||
testCase.setMethod("manual");
|
||||
testCase.setType("functional");
|
||||
|
||||
|
@ -239,26 +272,21 @@ public class XmindCaseParser {
|
|||
}
|
||||
// 用例名称
|
||||
testCase.setName(this.replace(tcArr[1], TC_REGEX));
|
||||
|
||||
if (!nodePath.startsWith("/")) {
|
||||
nodePath = "/" + nodePath;
|
||||
}
|
||||
if (nodePath.endsWith("/")) {
|
||||
nodePath = nodePath.substring(0, nodePath.length() - 1);
|
||||
}
|
||||
testCase.setNodePath(nodePath);
|
||||
|
||||
// 用例等级和用例性质处理
|
||||
if (tcArr[0].indexOf("-") != -1) {
|
||||
String[] otArr = tcArr[0].split("-");
|
||||
for (String item : otArr) {
|
||||
if (item.toUpperCase().startsWith("P")) {
|
||||
for (String item : tcArr[0].split("-")) {
|
||||
if (isAvailable(item, TC_REGEX)) {
|
||||
continue;
|
||||
} else if (item.toUpperCase().startsWith("P")) {
|
||||
testCase.setPriority(item.toUpperCase());
|
||||
} else {
|
||||
Optional.ofNullable(caseTypeMap.get(item)).ifPresent(opt -> testCase.setType(opt));
|
||||
testCase.setType(caseTypeMap.get(item));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 测试步骤处理
|
||||
List<Attached> steps = new LinkedList<>();
|
||||
if (attacheds != null && !attacheds.isEmpty()) {
|
||||
|
@ -272,29 +300,12 @@ public class XmindCaseParser {
|
|||
}
|
||||
});
|
||||
}
|
||||
if (!steps.isEmpty()) {
|
||||
testCase.setSteps(this.getSteps(steps));
|
||||
} else {
|
||||
JSONArray jsonArray = new JSONArray();
|
||||
// 保持插入顺序,判断用例是否有相同的steps
|
||||
JSONObject step = new JSONObject(true);
|
||||
step.put("num", 1);
|
||||
step.put("desc", "");
|
||||
step.put("result", "");
|
||||
jsonArray.add(step);
|
||||
testCase.setSteps(jsonArray.toJSONString());
|
||||
}
|
||||
TestCaseExcelData compartData = new TestCaseExcelData();
|
||||
BeanUtils.copyBean(compartData, testCase);
|
||||
if (compartDatas.contains(compartData)) {
|
||||
process.append(Translator.get("test_case_already_exists_excel") + ":" + testCase.getName() + "; ");
|
||||
} else if (validate(testCase)) {
|
||||
testCase.setId(UUID.randomUUID().toString());
|
||||
testCase.setCreateTime(System.currentTimeMillis());
|
||||
testCase.setUpdateTime(System.currentTimeMillis());
|
||||
testCase.setSteps(this.getSteps(steps));
|
||||
|
||||
// 校验合规性
|
||||
if (validate(testCase)) {
|
||||
testCases.add(testCase);
|
||||
}
|
||||
compartDatas.add(compartData);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -124,7 +124,7 @@
|
|||
</template>
|
||||
|
||||
<script>
|
||||
import {Scenario, TCPRequest} from "@/business/components/api/test/model/ScenarioModel";
|
||||
import {Scenario, TCPConfig, TCPRequest} from "@/business/components/api/test/model/ScenarioModel";
|
||||
import MsApiAssertions from "@/business/components/api/test/components/assertion/ApiAssertions";
|
||||
import MsApiExtract from "@/business/components/api/test/components/extract/ApiExtract";
|
||||
import MsJsr233Processor from "@/business/components/api/test/components/processor/Jsr233Processor";
|
||||
|
@ -143,7 +143,7 @@ export default {
|
|||
data() {
|
||||
return {
|
||||
activeName: "assertions",
|
||||
classes: TCPRequest.CLASSES,
|
||||
classes: TCPConfig.CLASSES,
|
||||
rules: {
|
||||
server: [
|
||||
{
|
||||
|
|
|
@ -125,6 +125,8 @@ export default {
|
|||
this.isReadOnly = true;
|
||||
}
|
||||
this.getTest(this.$route.params.testId);
|
||||
},
|
||||
activated() {
|
||||
this.listProjects();
|
||||
},
|
||||
mounted() {
|
||||
|
|
|
@ -173,8 +173,9 @@ export default {
|
|||
this.$warning(this.$t('test_track.plan.input_plan_name'));
|
||||
return;
|
||||
}
|
||||
if (this.operationType === 'save') {
|
||||
this.compareTime(new Date().getTime(), this.form.endTime);
|
||||
|
||||
if (!this.compareTime(new Date().getTime(), this.form.endTime)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (this.operationType === 'edit') {
|
||||
|
@ -254,14 +255,17 @@ export default {
|
|||
}
|
||||
},
|
||||
endTimeChange(value) {
|
||||
this.form.endTime = this.form.endTime.getTime();
|
||||
this.compareTime(new Date().getTime(), value.getTime());
|
||||
if (value) {
|
||||
this.form.endTime = this.form.endTime.getTime();
|
||||
this.compareTime(new Date().getTime(), value.getTime());
|
||||
}
|
||||
},
|
||||
compareTime(ts1, ts2) {
|
||||
if (ts1 > ts2) {
|
||||
this.form.endTime = '';
|
||||
this.$warning("截止时间不能早于当前时间!");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -38,10 +38,12 @@
|
|||
@click="handleNext()"/>
|
||||
<el-divider direction="vertical"></el-divider>
|
||||
|
||||
<el-button type="success" size="mini" :disabled="isReadOnly" plain @click="saveCase('Pass')">
|
||||
<el-button type="success" size="mini"
|
||||
:disabled="isReadOnly" :plain="testCase.reviewStatus !== 'Pass'" @click="saveCase('Pass')">
|
||||
{{ $t('test_track.review.pass') }}
|
||||
</el-button>
|
||||
<el-button type="danger" size="mini" :disabled="isReadOnly" plain @click="saveCase('UnPass')">
|
||||
<el-button type="danger" size="mini"
|
||||
:disabled="isReadOnly" :plain="testCase.reviewStatus !== 'UnPass'" @click="saveCase('UnPass')">
|
||||
{{ $t('test_track.review.un_pass') }}
|
||||
</el-button>
|
||||
</el-col>
|
||||
|
@ -290,6 +292,10 @@ export default {
|
|||
this.$success(this.$t('commons.save_success'));
|
||||
this.updateTestCases(param);
|
||||
this.setReviewStatus(this.testCase.reviewId);
|
||||
// 修改当前用例的评审状态
|
||||
this.testCase.reviewStatus = status;
|
||||
// 修改当前用例在整个用例列表的状态
|
||||
this.testCases[this.index].reviewStatus = status;
|
||||
});
|
||||
},
|
||||
updateTestCases(param) {
|
||||
|
|
Loading…
Reference in New Issue