Merge remote-tracking branch 'origin/master'

This commit is contained in:
wenyann 2020-10-19 18:49:27 +08:00
commit f872fb6692
8 changed files with 91 additions and 60 deletions

View File

@ -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);
/**

View File

@ -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());

View File

@ -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());

View File

@ -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);
}
/**

View File

@ -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: [
{

View File

@ -125,6 +125,8 @@ export default {
this.isReadOnly = true;
}
this.getTest(this.$route.params.testId);
},
activated() {
this.listProjects();
},
mounted() {

View File

@ -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;
}
}
}

View File

@ -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) {