feat(测试跟踪): 用例导出支持选择字段

--story=1008224 --user=陈建星 用例导出/导入支持自定义字段 https://www.tapd.cn/55049933/s/1225482
This commit is contained in:
chenjianxing 2022-08-18 12:00:20 +08:00 committed by f2c-ci-robot[bot]
parent fe2c26cf14
commit dee57844ae
35 changed files with 2583 additions and 1749 deletions

View File

@ -61,4 +61,8 @@ public enum TestCaseImportFiled {
} }
return tags; return tags;
} }
public boolean containsHead(String head) {
return filedLangMap.values().contains(head);
}
} }

View File

@ -0,0 +1,62 @@
package io.metersphere.excel.converter;
import io.metersphere.commons.constants.TestCaseCommentType;
import io.metersphere.commons.constants.TestPlanTestCaseStatus;
import io.metersphere.commons.constants.TestReviewCaseStatus;
import io.metersphere.commons.utils.CommonBeanFactory;
import io.metersphere.commons.utils.DateUtils;
import io.metersphere.i18n.Translator;
import io.metersphere.track.dto.TestCaseCommentDTO;
import io.metersphere.track.dto.TestCaseDTO;
import io.metersphere.track.service.TestCaseCommentService;
import org.apache.commons.lang3.StringUtils;
import java.util.HashMap;
import java.util.List;
public class TestCaseExportCommendConverter implements TestCaseExportConverter {
private HashMap<String, String> commendTypeMap = new HashMap<>();
private HashMap<String, String> planCaseStatusMap = new HashMap<>();
private HashMap<String, String> reviewCaseStatusMap = new HashMap<>();
public TestCaseExportCommendConverter() {
commendTypeMap.put(TestCaseCommentType.CASE.name(), "test_case_comment");
commendTypeMap.put(TestCaseCommentType.PLAN.name(), "test_case_plan_comment");
commendTypeMap.put(TestCaseCommentType.REVIEW.name(), "test_case_review_comment");
planCaseStatusMap.put(TestPlanTestCaseStatus.Pass.name(), "execute_pass");
planCaseStatusMap.put(TestPlanTestCaseStatus.Underway.name(), "test_case_status_prepare");
planCaseStatusMap.put(TestPlanTestCaseStatus.Blocking.name(), "plan_case_status_blocking");
planCaseStatusMap.put(TestPlanTestCaseStatus.Failure.name(), "test_case_status_error");
planCaseStatusMap.put(TestPlanTestCaseStatus.Skip.name(), "plan_case_status_skip");
reviewCaseStatusMap.put(TestReviewCaseStatus.Prepare.name(), "test_case_status_prepare");
reviewCaseStatusMap.put(TestReviewCaseStatus.Pass.name(), "execute_pass");
reviewCaseStatusMap.put(TestReviewCaseStatus.UnPass.name(), "execute_not_pass");
}
@Override
public String parse(TestCaseDTO testCase) {
TestCaseCommentService testCaseCommentService = CommonBeanFactory.getBean(TestCaseCommentService.class);
List<TestCaseCommentDTO> caseComments = testCaseCommentService.getCaseComments(testCase.getId());
StringBuilder result = new StringBuilder();
String template = Translator.get("test_case_comment_template");
caseComments.forEach(comment -> {
String authorName = comment.getAuthorName();
String type = getFromMapOfNullableWithTranslate(commendTypeMap, comment.getType());
String status = "";
if (StringUtils.equals(comment.getType(), TestCaseCommentType.PLAN.name())) {
status = getFromMapOfNullableWithTranslate(planCaseStatusMap, comment.getStatus());
status = "[".concat(status).concat("]");
} else if (StringUtils.equals(comment.getType(), TestCaseCommentType.REVIEW.name())) {
status = getFromMapOfNullableWithTranslate(reviewCaseStatusMap, comment.getStatus());
status = "[".concat(status).concat("]");
}
String updateTime = DateUtils.getTimeString(comment.getUpdateTime());
String description = comment.getDescription();
result.append(String.format(template, authorName, type, status, updateTime, description));
});
return result.toString();
}
}

View File

@ -0,0 +1,31 @@
package io.metersphere.excel.converter;
import io.metersphere.i18n.Translator;
import io.metersphere.track.dto.TestCaseDTO;
import org.apache.commons.lang3.StringUtils;
import java.util.Map;
/**
* 功能用例导出时解析其他字段对应的列
* @author jianxing
*/
public interface TestCaseExportConverter {
String parse(TestCaseDTO testCase);
default String getFromMapOfNullable(Map<String, String> map, String key) {
if (StringUtils.isNotBlank(key)) {
return map.get(key);
}
return "";
}
default String getFromMapOfNullableWithTranslate(Map<String, String> map, String key) {
String value = getFromMapOfNullable(map, key);
if (StringUtils.isNotBlank(value)) {
return Translator.get(value);
}
return value;
}
}

View File

@ -0,0 +1,51 @@
package io.metersphere.excel.converter;
import io.metersphere.commons.utils.LogUtil;
import io.metersphere.track.constants.TestCaseExportOtherField;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class TestCaseExportConverterFactory {
public static Map<String, TestCaseExportConverter> getConverters(List<String> keys) {
Map<String, TestCaseExportConverter> converterMapResult = new HashMap<>();
try {
HashMap<String, Class<? extends TestCaseExportConverter>> converterMap = getConverterMap();
for (String key : keys) {
Class<? extends TestCaseExportConverter> clazz = converterMap.get(key);
if (clazz != null) {
converterMapResult.put(key, clazz.getDeclaredConstructor().newInstance());
}
}
} catch (Exception e) {
LogUtil.error(e);
}
return converterMapResult;
}
public static TestCaseExportConverter getConverter(String key) {
try {
Class<? extends TestCaseExportConverter> clazz = getConverterMap().get(key);
if (clazz != null) {
return clazz.getDeclaredConstructor().newInstance();
}
} catch (Exception e) {
LogUtil.error(e);
}
return null;
}
private static HashMap<String, Class<? extends TestCaseExportConverter>> getConverterMap() {
return new HashMap<>() {{
put(TestCaseExportOtherField.VERSION.getValue(), TestCaseExportVersionConverter.class);
put(TestCaseExportOtherField.COMMEND.getValue(), TestCaseExportCommendConverter.class);
put(TestCaseExportOtherField.EXECUTE_RESULT.getValue(), TestCaseExportExecuteResultConverter.class);
put(TestCaseExportOtherField.REVIEW_RESULT.getValue(), TestCaseExportReviewResultConverter.class);
put(TestCaseExportOtherField.CREATOR.getValue(), TestCaseExportCreatorConverter.class);
put(TestCaseExportOtherField.CREATE_TIME.getValue(), TestCaseExportCreateTimeConverter.class);
put(TestCaseExportOtherField.UPDATE_TIME.getValue(), TestCaseExportUpdateTimeConverter.class);
}};
}
}

View File

@ -0,0 +1,12 @@
package io.metersphere.excel.converter;
import io.metersphere.commons.utils.DateUtils;
import io.metersphere.track.dto.TestCaseDTO;
public class TestCaseExportCreateTimeConverter implements TestCaseExportConverter {
@Override
public String parse(TestCaseDTO testCase) {
return DateUtils.getTimeString(testCase.getCreateTime());
}
}

View File

@ -0,0 +1,27 @@
package io.metersphere.excel.converter;
import io.metersphere.base.domain.User;
import io.metersphere.commons.utils.CommonBeanFactory;
import io.metersphere.commons.utils.SessionUtils;
import io.metersphere.service.UserService;
import io.metersphere.track.dto.TestCaseDTO;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class TestCaseExportCreatorConverter implements TestCaseExportConverter {
private Map<String, String> userMap = new HashMap<>();
public TestCaseExportCreatorConverter() {
UserService userService = CommonBeanFactory.getBean(UserService.class);
List<User> memberOption = userService.getProjectMemberOption(SessionUtils.getCurrentProjectId());
memberOption.forEach(option -> userMap.put(option.getId(), option.getName()));
}
@Override
public String parse(TestCaseDTO testCase) {
return getFromMapOfNullable(userMap, testCase.getCreateUser());
}
}

View File

@ -0,0 +1,25 @@
package io.metersphere.excel.converter;
import io.metersphere.commons.constants.TestPlanTestCaseStatus;
import io.metersphere.track.dto.TestCaseDTO;
import java.util.HashMap;
import java.util.Map;
public class TestCaseExportExecuteResultConverter implements TestCaseExportConverter {
private Map<String, String> planCaseStatusMap = new HashMap<>();
public TestCaseExportExecuteResultConverter() {
planCaseStatusMap.put(TestPlanTestCaseStatus.Pass.name(), "execute_pass");
planCaseStatusMap.put(TestPlanTestCaseStatus.Underway.name(), "test_case_status_prepare");
planCaseStatusMap.put(TestPlanTestCaseStatus.Blocking.name(), "plan_case_status_blocking");
planCaseStatusMap.put(TestPlanTestCaseStatus.Failure.name(), "test_case_status_error");
planCaseStatusMap.put(TestPlanTestCaseStatus.Skip.name(), "plan_case_status_skip");
}
@Override
public String parse(TestCaseDTO testCase) {
return getFromMapOfNullableWithTranslate(planCaseStatusMap, testCase.getLastExecuteResult());
}
}

View File

@ -0,0 +1,23 @@
package io.metersphere.excel.converter;
import io.metersphere.commons.constants.TestReviewCaseStatus;
import io.metersphere.track.dto.TestCaseDTO;
import java.util.HashMap;
import java.util.Map;
public class TestCaseExportReviewResultConverter implements TestCaseExportConverter {
private Map<String, String> reviewCaseStatusMap = new HashMap<>();
public TestCaseExportReviewResultConverter() {
reviewCaseStatusMap.put(TestReviewCaseStatus.Prepare.name(), "test_case_status_prepare");
reviewCaseStatusMap.put(TestReviewCaseStatus.Pass.name(), "execute_pass");
reviewCaseStatusMap.put(TestReviewCaseStatus.UnPass.name(), "execute_not_pass");
}
@Override
public String parse(TestCaseDTO testCase) {
return getFromMapOfNullableWithTranslate(reviewCaseStatusMap, testCase.getReviewStatus());
}
}

View File

@ -0,0 +1,12 @@
package io.metersphere.excel.converter;
import io.metersphere.commons.utils.DateUtils;
import io.metersphere.track.dto.TestCaseDTO;
public class TestCaseExportUpdateTimeConverter implements TestCaseExportConverter {
@Override
public String parse(TestCaseDTO testCase) {
return DateUtils.getTimeString(testCase.getUpdateTime());
}
}

View File

@ -0,0 +1,27 @@
package io.metersphere.excel.converter;
import io.metersphere.commons.utils.CommonBeanFactory;
import io.metersphere.commons.utils.SessionUtils;
import io.metersphere.dto.ProjectVersionDTO;
import io.metersphere.service.ProjectVersionService;
import io.metersphere.track.dto.TestCaseDTO;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class TestCaseExportVersionConverter implements TestCaseExportConverter {
private Map<String, String> versionMap = new HashMap<>();
public TestCaseExportVersionConverter() {
ProjectVersionService projectVersionService = CommonBeanFactory.getBean(ProjectVersionService.class);
List<ProjectVersionDTO> projectVersions = projectVersionService.getProjectVersions(SessionUtils.getCurrentProjectId());
projectVersions.forEach(i -> versionMap.put(i.getId(), i.getName()));
}
@Override
public String parse(TestCaseDTO testCase) {
return getFromMapOfNullable(versionMap, testCase.getVersionId());
}
}

View File

@ -54,6 +54,8 @@ public class TestCaseExcelData {
List<String> mergeStepDesc; List<String> mergeStepDesc;
@ExcelIgnore @ExcelIgnore
List<String> mergeStepResult; List<String> mergeStepResult;
@ExcelIgnore
Map<String, String> otherFields;
public List<List<String>> getHead(boolean needNum, List<CustomFieldDao> customFields) { public List<List<String>> getHead(boolean needNum, List<CustomFieldDao> customFields) {
return new ArrayList<>(); return new ArrayList<>();

View File

@ -24,9 +24,9 @@ public class FunctionCaseMergeWriteHandler implements RowWriteHandler {
for (int i = 0; i < headList.size(); i++) { for (int i = 0; i < headList.size(); i++) {
List<String> list = headList.get(i); List<String> list = headList.get(i);
for (String head : list) { for (String head : list) {
if (TestCaseImportFiled.STEP_DESC.getFiledLangMap().values().contains(head)) { if (TestCaseImportFiled.STEP_DESC.containsHead(head)) {
stepDescRowIndex = i; stepDescRowIndex = i;
} else if (TestCaseImportFiled.STEP_RESULT.getFiledLangMap().values().contains(head)) { } else if (TestCaseImportFiled.STEP_RESULT.containsHead(head)) {
stepResultRowIndex = i; stepResultRowIndex = i;
} }
} }

View File

@ -1,37 +1,45 @@
package io.metersphere.excel.handler; package io.metersphere.excel.handler;
import com.alibaba.excel.util.BooleanUtils; import com.alibaba.excel.util.BooleanUtils;
import com.alibaba.excel.write.handler.RowWriteHandler;
import com.alibaba.excel.write.handler.context.RowWriteHandlerContext; import com.alibaba.excel.write.handler.context.RowWriteHandlerContext;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import com.alibaba.excel.write.style.row.AbstractRowHeightStyleStrategy;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import io.metersphere.excel.constants.TestCaseImportFiled;
import io.metersphere.i18n.Translator; import io.metersphere.i18n.Translator;
import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Comment; import org.apache.poi.ss.usermodel.Comment;
import org.apache.poi.ss.usermodel.Drawing; import org.apache.poi.ss.usermodel.Drawing;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor; import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFRichTextString; import org.apache.poi.xssf.usermodel.XSSFRichTextString;
import java.util.*; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/** /**
* @author song.tianyang * @author song.tianyang
* @Date 2021/5/7 2:17 下午 * @Date 2021/5/7 2:17 下午
* @Description * @Description
*/ */
public class FunctionCaseTemplateWriteHandler extends AbstractRowHeightStyleStrategy { public class FunctionCaseTemplateWriteHandler implements RowWriteHandler {
private boolean isNeedId; private boolean isNeedId;
Map<String, Integer> rowDispseIndexMap; Map<String, Integer> rowDisposeIndexMap;
Map<String, List<String>> caseLevelAndStatusValueMap; Map<String, List<String>> caseLevelAndStatusValueMap;
private Integer idIndex;
private Integer moduleIndex;
private Integer maintainerIndex;
private Integer priorityIndex;
private Integer tagIndex;
private Integer statusIndex;
private Integer stepModelIndex;
public FunctionCaseTemplateWriteHandler(boolean isNeedId, List<List<String>> headList, Map<String, List<String>> caseLevelAndStatusValueMap) { public FunctionCaseTemplateWriteHandler(boolean isNeedId, List<List<String>> headList, Map<String, List<String>> caseLevelAndStatusValueMap) {
this.isNeedId = isNeedId; this.isNeedId = isNeedId;
rowDispseIndexMap = this.buildFiledMap(headList); rowDisposeIndexMap = this.buildFiledMap(headList);
this.caseLevelAndStatusValueMap = caseLevelAndStatusValueMap; this.caseLevelAndStatusValueMap = caseLevelAndStatusValueMap;
} }
@ -41,20 +49,20 @@ public class FunctionCaseTemplateWriteHandler extends AbstractRowHeightStyleStra
int index = 0; int index = 0;
for (List<String> list : headList) { for (List<String> list : headList) {
for (String head : list) { for (String head : list) {
if (StringUtils.equalsAnyIgnoreCase(head, "id")) { if (TestCaseImportFiled.ID.containsHead(head)) {
returnMap.put("ID", index); idIndex = index;
} else if (StringUtils.equalsAnyIgnoreCase(head, "所属模块", "所屬模塊", "Module")) { } else if (TestCaseImportFiled.MODULE.containsHead(head)) {
returnMap.put("Module", index); moduleIndex = index;
} else if (StringUtils.equalsAnyIgnoreCase(head, "责任人(ID)", "維護人(ID)", "Maintainer(ID)")) { } else if (TestCaseImportFiled.MAINTAINER.containsHead(head)) {
returnMap.put("Maintainer", index); maintainerIndex = index;
} else if (StringUtils.equalsAnyIgnoreCase(head, "用例等级", "用例等級", "Priority")) { } else if (TestCaseImportFiled.PRIORITY.containsHead(head)) {
returnMap.put("Priority", index); priorityIndex = index;
} else if (StringUtils.equalsAnyIgnoreCase(head, "标签", "標簽", "Tag")) { } else if (TestCaseImportFiled.TAG.containsHead(head)) {
returnMap.put("Tag", index); tagIndex = index;
} else if (StringUtils.equalsAnyIgnoreCase(head, "用例状态", "用例狀態", "Case status")) { } else if (TestCaseImportFiled.STATUS.containsHead(head)) {
returnMap.put("Status", index); statusIndex = index;
} else if (StringUtils.equalsAnyIgnoreCase(head, "编辑模式", "編輯模式", "Edit Model")) { } else if (TestCaseImportFiled.STEP_MODEL.containsHead(head)) {
returnMap.put("StepModel", index); stepModelIndex = index;
} }
index++; index++;
} }
@ -62,14 +70,6 @@ public class FunctionCaseTemplateWriteHandler extends AbstractRowHeightStyleStra
return returnMap; return returnMap;
} }
@Override
public void beforeRowCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Integer rowIndex, Integer relativeRowIndex, Boolean isHead) {
}
@Override
public void afterRowCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer relativeRowIndex, Boolean isHead) {
}
@Override @Override
public void afterRowDispose(RowWriteHandlerContext context) { public void afterRowDispose(RowWriteHandlerContext context) {
@ -77,68 +77,43 @@ public class FunctionCaseTemplateWriteHandler extends AbstractRowHeightStyleStra
Sheet sheet = context.getWriteSheetHolder().getSheet(); Sheet sheet = context.getWriteSheetHolder().getSheet();
Drawing<?> drawingPatriarch = sheet.createDrawingPatriarch(); Drawing<?> drawingPatriarch = sheet.createDrawingPatriarch();
if (rowDispseIndexMap != null) { if (rowDisposeIndexMap != null) {
if (isNeedId) { if (isNeedId) {
Integer idIndex = rowDispseIndexMap.get("ID"); setComment(sheet, drawingPatriarch, idIndex, Translator.get("do_not_modify_header_order") + "" + Translator.get("id_required"));
if(idIndex != null){
Comment comment1 = drawingPatriarch.createCellComment(new XSSFClientAnchor(0, 0, 0, 0, idIndex, 0, idIndex + 3, 1));
comment1.setString(new XSSFRichTextString(Translator.get("do_not_modify_header_order")+""+Translator.get("id_required")));
sheet.getRow(0).getCell(1).setCellComment(comment1);
}
} }
for (Map.Entry<String, Integer> entry : rowDispseIndexMap.entrySet()) {
String coloum = entry.getKey();
Integer index = entry.getValue();
if(StringUtils.equalsAnyIgnoreCase(coloum,"Module")){ setComment(sheet, drawingPatriarch, moduleIndex, Translator.get("module_created_automatically"));
Comment comment = drawingPatriarch.createCellComment(new XSSFClientAnchor(0, 0, 0, 0, index, 0, index + 3 , 1)); setComment(sheet, drawingPatriarch, maintainerIndex, Translator.get("please_input_project_member"));
comment.setString(new XSSFRichTextString(Translator.get("module_created_automatically"))); setComment(sheet, drawingPatriarch, tagIndex, Translator.get("tag_tip_pattern"));
sheet.getRow(0).getCell(1).setCellComment(comment); setComment(sheet, drawingPatriarch, stepModelIndex, Translator.get("step_model_tip"));
}else if(StringUtils.equalsAnyIgnoreCase(coloum,"Maintainer")){
Comment comment = drawingPatriarch.createCellComment(new XSSFClientAnchor(0, 0, 0, 0, index, 0, index + 3, 1)); List<String> list = new ArrayList<>();
comment.setString(new XSSFRichTextString(Translator.get("please_input_project_member"))); if (caseLevelAndStatusValueMap != null && caseLevelAndStatusValueMap.containsKey("caseLevel")) {
sheet.getRow(0).getCell(1).setCellComment(comment); list = caseLevelAndStatusValueMap.get("caseLevel");
}else if(StringUtils.equalsAnyIgnoreCase(coloum,"Priority")){ }
Comment comment = drawingPatriarch.createCellComment(new XSSFClientAnchor(0, 0, 0, 0, index, 0, index + 3, 1)); if (CollectionUtils.isEmpty(list)) {
List<String> list = new ArrayList<>(); setComment(sheet, drawingPatriarch, priorityIndex, Translator.get("options") + "P0、P1、P2、P3");
if (caseLevelAndStatusValueMap != null && caseLevelAndStatusValueMap.containsKey("caseLevel")) { } else {
list = caseLevelAndStatusValueMap.get("caseLevel"); setComment(sheet, drawingPatriarch, priorityIndex, Translator.get("options") + JSONArray.toJSONString(list));
} }
if (CollectionUtils.isEmpty(list)) {
comment.setString(new XSSFRichTextString(Translator.get("options") + "P0、P1、P2、P3")); list.clear();
} else { if (caseLevelAndStatusValueMap != null && caseLevelAndStatusValueMap.containsKey("caseStatus")) {
comment.setString(new XSSFRichTextString(Translator.get("options") + JSONArray.toJSONString(list))); list = caseLevelAndStatusValueMap.get("caseStatus");
} }
sheet.getRow(0).getCell(1).setCellComment(comment); if (CollectionUtils.isNotEmpty(list)) {
}else if(StringUtils.equalsAnyIgnoreCase(coloum,"Tag")){ setComment(sheet, drawingPatriarch, statusIndex, Translator.get("options") + JSONArray.toJSONString(list));
Comment comment = drawingPatriarch.createCellComment(new XSSFClientAnchor(0, 0, 0, 0, index, 0, index + 3, 1));
comment.setString(new XSSFRichTextString(Translator.get("tag_tip_pattern")));
sheet.getRow(0).getCell(1).setCellComment(comment);
} else if (StringUtils.equalsAnyIgnoreCase(coloum, "Status")) {
List<String> list = new ArrayList<>();
if (caseLevelAndStatusValueMap != null && caseLevelAndStatusValueMap.containsKey("caseStatus")) {
list = caseLevelAndStatusValueMap.get("caseStatus");
}
if (!CollectionUtils.isEmpty(list)) {
Comment comment = drawingPatriarch.createCellComment(new XSSFClientAnchor(0, 0, 0, 0, index, 0, index + 3, 1));
comment.setString(new XSSFRichTextString(Translator.get("options") + JSONArray.toJSONString(list)));
sheet.getRow(0).getCell(1).setCellComment(comment);
}
} else if (StringUtils.equalsAnyIgnoreCase(coloum, "StepModel")) {
Comment comment = drawingPatriarch.createCellComment(new XSSFClientAnchor(0, 0, 0, 0, index, 0, index + 3, 1));
comment.setString(new XSSFRichTextString(Translator.get("step_model_tip")));
sheet.getRow(0).getCell(1).setCellComment(comment);
}
} }
} }
} }
} }
@Override private void setComment(Sheet sheet, Drawing<?> drawingPatriarch, Integer index, String text) {
protected void setHeadColumnHeight(Row row, int relativeRowIndex) { if (index == null) {
} return;
}
@Override Comment comment = drawingPatriarch.createCellComment(new XSSFClientAnchor(0, 0, 0, 0, index, 0, index + 3, 1));
protected void setContentColumnHeight(Row row, int relativeRowIndex) { comment.setString(new XSSFRichTextString(text));
sheet.getRow(0).getCell(1).setCellComment(comment);
} }
} }

View File

@ -0,0 +1,21 @@
package io.metersphere.track.constants;
public enum TestCaseExportOtherField {
VERSION("version"),
COMMEND("commend"),
EXECUTE_RESULT("executeResult"),
REVIEW_RESULT("reviewResult"),
CREATOR("creator"),
CREATE_TIME("createTime"),
UPDATE_TIME("updateTime");
private String value;
TestCaseExportOtherField(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}

View File

@ -287,7 +287,7 @@ public class TestCaseController {
@PostMapping("/export/testcase") @PostMapping("/export/testcase")
@RequiresPermissions(PermissionConstants.PROJECT_TRACK_CASE_READ_EXPORT) @RequiresPermissions(PermissionConstants.PROJECT_TRACK_CASE_READ_EXPORT)
@MsAuditLog(module = OperLogModule.TRACK_TEST_CASE, type = OperLogConstants.EXPORT, sourceId = "#request.id", title = "#request.name", project = "#request.projectId") @MsAuditLog(module = OperLogModule.TRACK_TEST_CASE, type = OperLogConstants.EXPORT, sourceId = "#request.id", title = "#request.name", project = "#request.projectId")
public void testCaseExport(HttpServletResponse response, @RequestBody TestCaseBatchRequest request) { public void testCaseExport(HttpServletResponse response, @RequestBody TestCaseExportRequest request) {
testCaseService.testCaseExport(response, request); testCaseService.testCaseExport(response, request);
} }

View File

@ -18,7 +18,6 @@ public class TestCaseDTO extends TestCaseWithBLOBs {
private String lastResultId; private String lastResultId;
private String projectName; private String projectName;
private String createName; private String createName;
private String lastExecuteResult;
private String versionName; private String versionName;
private List<CustomFieldDao> fields; private List<CustomFieldDao> fields;
private List<String> caseTags = new ArrayList<>(); private List<String> caseTags = new ArrayList<>();

View File

@ -0,0 +1,21 @@
package io.metersphere.track.request.testcase;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
@Getter
@Setter
public class TestCaseExportRequest extends TestCaseBatchRequest {
private List<TestCaseExportHeader> baseHeaders;
private List<TestCaseExportHeader> customHeaders;
private List<TestCaseExportHeader> otherHeaders;
@Getter
@Setter
public static class TestCaseExportHeader {
private String id;
private String name;
}
}

View File

@ -31,6 +31,8 @@ import io.metersphere.controller.request.ResetOrderRequest;
import io.metersphere.controller.request.member.QueryMemberRequest; import io.metersphere.controller.request.member.QueryMemberRequest;
import io.metersphere.dto.*; import io.metersphere.dto.*;
import io.metersphere.excel.constants.TestCaseImportFiled; import io.metersphere.excel.constants.TestCaseImportFiled;
import io.metersphere.excel.converter.TestCaseExportConverter;
import io.metersphere.excel.converter.TestCaseExportConverterFactory;
import io.metersphere.excel.domain.*; import io.metersphere.excel.domain.*;
import io.metersphere.excel.handler.FunctionCaseMergeWriteHandler; import io.metersphere.excel.handler.FunctionCaseMergeWriteHandler;
import io.metersphere.excel.handler.FunctionCaseTemplateWriteHandler; import io.metersphere.excel.handler.FunctionCaseTemplateWriteHandler;
@ -63,6 +65,7 @@ import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.session.ExecutorType; import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactory;
import org.jetbrains.annotations.NotNull;
import org.mybatis.spring.SqlSessionUtils; import org.mybatis.spring.SqlSessionUtils;
import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -1326,38 +1329,73 @@ public class TestCaseService {
return list; return list;
} }
public void testCaseExport(HttpServletResponse response, TestCaseExportRequest request) {
public void testCaseExport(HttpServletResponse response, TestCaseBatchRequest request) {
String projectId = request.getProjectId(); String projectId = request.getProjectId();
request.getCondition().setStatusIsNot(CommonConstants.TrashStatus); request.getCondition().setStatusIsNot(CommonConstants.TrashStatus);
List<TestCaseDTO> testCaseList = getExportData(request); List<TestCaseDTO> testCases = getExportData(request);
testCaseExport(response, projectId, testCaseList, true); List<List<String>> headList = getTestcaseExportHeads(request);
}
public void testCaseExport(HttpServletResponse response, String projectId, List<TestCaseDTO> testCaseList, boolean needIdCol) {
TestCaseExcelData testCaseExcelData = new TestCaseExcelDataFactory().getTestCaseExcelDataLocal();
Map<Integer, Integer> rowMergeInfo = new HashMap<>(); Map<Integer, Integer> rowMergeInfo = new HashMap<>();
TestCaseTemplateDao testCaseTemplate = testCaseTemplateService.getTemplate(projectId);
List<CustomFieldDao> customFields = Optional.ofNullable(testCaseTemplate.getCustomFields()).orElse(new ArrayList<>());
List<List<String>> headList = testCaseExcelData.getHead(needIdCol, customFields);
FunctionCaseMergeWriteHandler writeHandler = new FunctionCaseMergeWriteHandler(rowMergeInfo, headList); FunctionCaseMergeWriteHandler writeHandler = new FunctionCaseMergeWriteHandler(rowMergeInfo, headList);
boolean isUseCustomId = projectService.useCustomNum(projectId); boolean isUseCustomId = projectService.useCustomNum(projectId);
Map<String, List<String>> caseLevelAndStatusValueMap = testCaseTemplateService.getCaseLevelAndStatusMapByProjectId(projectId); Map<String, List<String>> caseLevelAndStatusValueMap = testCaseTemplateService.getCaseLevelAndStatusMapByProjectId(projectId);
FunctionCaseTemplateWriteHandler handler = new FunctionCaseTemplateWriteHandler(needIdCol, headList, caseLevelAndStatusValueMap); FunctionCaseTemplateWriteHandler handler = new FunctionCaseTemplateWriteHandler(true, headList, caseLevelAndStatusValueMap);
List<TestCaseExcelData> excelData = parseCaseData2ExcelData(testCaseList, rowMergeInfo, isUseCustomId); List<TestCaseExcelData> excelData = parseCaseData2ExcelData(testCases, rowMergeInfo, isUseCustomId, request.getOtherHeaders());
List<List<Object>> data = parseExcelData2List(headList, excelData); List<List<Object>> data = parseExcelData2List(headList, excelData);
new EasyExcelExporter(testCaseExcelData.getClass()) new EasyExcelExporter(new TestCaseExcelDataFactory().getTestCaseExcelDataLocal().getClass())
.exportByCustomWriteHandler(response, headList, data, Translator.get("test_case_import_template_name"), .exportByCustomWriteHandler(response, headList, data, Translator.get("test_case_import_template_name"),
Translator.get("test_case_import_template_sheet"), handler, writeHandler); Translator.get("test_case_import_template_sheet"), handler, writeHandler);
} }
@NotNull
private List<List<String>> getTestcaseExportHeads(TestCaseExportRequest request) {
List<List<String>> headList = new ArrayList<>() {{
addAll(request.getBaseHeaders()
.stream()
.map(item -> Arrays.asList(item.getName()))
.collect(Collectors.toList()));
addAll(request.getCustomHeaders()
.stream()
.map(item -> Arrays.asList(item.getName()))
.collect(Collectors.toList()));
addAll(request.getOtherHeaders()
.stream()
.map(item -> Arrays.asList(item.getName()))
.collect(Collectors.toList()));
}};
return headList;
}
public void testCaseTemplateExport(String projectId, String importType, HttpServletResponse response) { public void testCaseTemplateExport(String projectId, String importType, HttpServletResponse response) {
//导入更新 or 开启使用自定义ID时导出ID列 //导入更新 or 开启使用自定义ID时导出ID列
boolean needIdCol = projectService.useCustomNum(projectId) || StringUtils.equals(importType, FunctionCaseImportEnum.Update.name()); boolean needIdCol = projectService.useCustomNum(projectId) || StringUtils.equals(importType, FunctionCaseImportEnum.Update.name());
testCaseExport(response, projectId, generateExportData(projectId), needIdCol);
List<List<String>> heads = getExportTemplateHeads(projectId, needIdCol);
TestCaseExcelData testCaseExcelData = new TestCaseExcelDataFactory().getTestCaseExcelDataLocal();
Map<Integer, Integer> rowMergeInfo = new HashMap<>();
FunctionCaseMergeWriteHandler writeHandler = new FunctionCaseMergeWriteHandler(rowMergeInfo, heads);
boolean isUseCustomId = projectService.useCustomNum(projectId);
Map<String, List<String>> caseLevelAndStatusValueMap = testCaseTemplateService.getCaseLevelAndStatusMapByProjectId(projectId);
FunctionCaseTemplateWriteHandler handler = new FunctionCaseTemplateWriteHandler(needIdCol, heads, caseLevelAndStatusValueMap);
List<TestCaseExcelData> excelData = parseCaseData2ExcelData(generateExportData(projectId),
rowMergeInfo, isUseCustomId, null);
List<List<Object>> data = parseExcelData2List(heads, excelData);
new EasyExcelExporter(testCaseExcelData.getClass())
.exportByCustomWriteHandler(response, heads, data, Translator.get("test_case_import_template_name"),
Translator.get("test_case_import_template_sheet"), handler, writeHandler);
}
private List<List<String>> getExportTemplateHeads(String projectId, boolean needIdCol) {
TestCaseTemplateDao testCaseTemplate = testCaseTemplateService.getTemplate(projectId);
List<CustomFieldDao> customFields = Optional.ofNullable(testCaseTemplate.getCustomFields()).orElse(new ArrayList<>());
List<List<String>> heads = new TestCaseExcelDataFactory().getTestCaseExcelDataLocal().getHead(needIdCol, customFields);
return heads;
} }
@ -1419,27 +1457,33 @@ public class TestCaseService {
} }
} }
TestCaseImportFiled[] importFields = TestCaseImportFiled.values();
for (TestCaseExcelData model : data) { for (TestCaseExcelData model : data) {
List<Object> fields = new ArrayList<>(); List<Object> fields = new ArrayList<>();
Map<String, String> customDataMaps = Optional.ofNullable(model.getCustomDatas()).orElse(new HashMap<>()); Map<String, String> customDataMaps = Optional.ofNullable(model.getCustomDatas())
TestCaseImportFiled[] importFields = TestCaseImportFiled.values(); .orElse(new HashMap<>());
Map<String, String> otherFieldMaps = Optional.ofNullable(model.getOtherFields())
.orElse(new HashMap<>());
for (String head : headList) { for (String head : headList) {
boolean isSystemField = false; boolean isSystemField = false;
for (TestCaseImportFiled importFiled : importFields) { for (TestCaseImportFiled importFiled : importFields) {
if (importFiled.getFiledLangMap().values().contains(head)) { if (importFiled.containsHead(head)) {
fields.add(importFiled.parseExcelDataValue(model)); fields.add(importFiled.parseExcelDataValue(model));
isSystemField = true; isSystemField = true;
} }
} }
if (!isSystemField) { if (!isSystemField) {
String value = customDataMaps.get(head); String value = customDataMaps.get(head);
if (value == null) {
value = otherFieldMaps.get(head);
}
if (value == null) { if (value == null) {
value = ""; value = "";
} }
fields.add(value); fields.add(value);
} }
} }
result.add(fields); result.add(fields);
} }
@ -1467,8 +1511,8 @@ public class TestCaseService {
return testCaseList; return testCaseList;
} }
private List<TestCaseExcelData> parseCaseData2ExcelData(List<TestCaseDTO> testCaseList, private List<TestCaseExcelData> parseCaseData2ExcelData(List<TestCaseDTO> testCaseList, Map<Integer, Integer> rowMergeInfo,
Map<Integer, Integer> rowMergeInfo, Boolean isUseCustomId) { Boolean isUseCustomId, List<TestCaseExportRequest.TestCaseExportHeader> otherHeaders) {
if (CollectionUtils.isEmpty(testCaseList)) { if (CollectionUtils.isEmpty(testCaseList)) {
return new ArrayList<>(); return new ArrayList<>();
} }
@ -1491,41 +1535,18 @@ public class TestCaseService {
TestCaseDTO t = testCaseList.get(rowIndex); TestCaseDTO t = testCaseList.get(rowIndex);
List<String> stepDescList = new ArrayList<>(); List<String> stepDescList = new ArrayList<>();
List<String> stepResultList = new ArrayList<>(); List<String> stepResultList = new ArrayList<>();
TestCaseExcelData data = new TestCaseExcelData();
setExportSystemField(t, customNameMap, customSelectValueMap); setExportSystemField(t, customNameMap, customSelectValueMap);
TestCaseExcelData data = new TestCaseExcelData();
BeanUtils.copyBean(data, t); BeanUtils.copyBean(data, t);
if (isUseCustomId) { buildExportCustomNum(isUseCustomId, t, data);
data.setCustomNum(t.getCustomNum());
} else {
if (t.getNum() == null) {
data.setCustomNum("");
} else {
data.setCustomNum(String.valueOf(t.getNum()));
}
}
buildExportStep(t, stepDescList, stepResultList, data); buildExportStep(t, stepDescList, stepResultList, data);
buildExportCustomField(customSelectValueMap, customNameMap, t, data); buildExportCustomField(customSelectValueMap, customNameMap, t, data);
buildExportOtherField(data, t, otherHeaders);
if (CollectionUtils.isNotEmpty(stepDescList)) { if (CollectionUtils.isNotEmpty(stepDescList)) {
// 如果有多条步骤则添加多条数据之后合并单元格 // 如果有多条步骤则添加多条数据之后合并单元格
for (int i = 0; i < stepDescList.size(); i++) { buildExportMergeData(rowMergeInfo, list, stepDescList, stepResultList, data);
TestCaseExcelData excelData;
if (i == 0) {
// 第一行存全量元素
excelData = data;
if (stepDescList.size() > 1) {
// 保存合并单元格的下标和数量
rowMergeInfo.put(list.size() + 1, stepDescList.size());
}
} else {
// 之后的行只存步骤
excelData = new TestCaseExcelData();
}
excelData.setStepDesc(stepDescList.get(i));
excelData.setStepResult(stepResultList.get(i));
list.add(excelData);
}
} else { } else {
list.add(data); list.add(data);
} }
@ -1533,6 +1554,61 @@ public class TestCaseService {
return list; return list;
} }
private void buildExportOtherField(TestCaseExcelData data, TestCaseDTO t, List<TestCaseExportRequest.TestCaseExportHeader> otherHeaders) {
if (CollectionUtils.isEmpty(otherHeaders)) {
return;
}
List<String> keys = otherHeaders.stream()
.map(TestCaseExportRequest.TestCaseExportHeader::getId)
.collect(Collectors.toList());
Map<String, TestCaseExportConverter> converterMaps = TestCaseExportConverterFactory.getConverters(keys);
HashMap<String, String> otherFields = new HashMap<>();
otherHeaders.forEach(header -> {
TestCaseExportConverter converter = converterMaps.get(header.getId());
if (converter != null) {
otherFields.put(header.getName(), converter.parse(t));
} else {
otherFields.put(header.getName(), "");
}
});
data.setOtherFields(otherFields);
}
private void buildExportCustomNum(Boolean isUseCustomId, TestCaseDTO t, TestCaseExcelData data) {
if (isUseCustomId) {
data.setCustomNum(t.getCustomNum());
} else {
if (t.getNum() == null) {
data.setCustomNum("");
} else {
data.setCustomNum(String.valueOf(t.getNum()));
}
}
}
@NotNull
private void buildExportMergeData(Map<Integer, Integer> rowMergeInfo,
List<TestCaseExcelData> list, List<String> stepDescList,
List<String> stepResultList, TestCaseExcelData data) {
for (int i = 0; i < stepDescList.size(); i++) {
TestCaseExcelData excelData;
if (i == 0) {
// 第一行存全量元素
excelData = data;
if (stepDescList.size() > 1) {
// 保存合并单元格的下标和数量
rowMergeInfo.put(list.size() + 1, stepDescList.size());
}
} else {
// 之后的行只存步骤
excelData = new TestCaseExcelData();
}
excelData.setStepDesc(stepDescList.get(i));
excelData.setStepResult(stepResultList.get(i));
list.add(excelData);
}
}
private void buildExportCustomField(Map<String, Map<String, String>> customSelectValueMap, Map<String, String> customNameMap, TestCaseDTO t, TestCaseExcelData data) { private void buildExportCustomField(Map<String, Map<String, String>> customSelectValueMap, Map<String, String> customNameMap, TestCaseDTO t, TestCaseExcelData data) {
try { try {
List<CustomFieldResource> fields = customFieldTestCaseService.getByResourceId(t.getId()); List<CustomFieldResource> fields = customFieldTestCaseService.getByResourceId(t.getId());

View File

@ -318,6 +318,12 @@ create_user=Create user
test_case_status=Case status test_case_status=Case status
id_not_rightful=ID is not rightful id_not_rightful=ID is not rightful
project_reference_multiple_plateform=Projects point to multiple third-party platforms project_reference_multiple_plateform=Projects point to multiple third-party platforms
test_case_comment_template=[comment%s %s %s%s]\n%s\n
test_case_comment=Case
test_case_plan_comment=Execute
test_case_review_comment=Review
plan_case_status_blocking=Blocking
plan_case_status_skip=Skip
# mock # mock
mock_warning=No matching Mock expectation was found mock_warning=No matching Mock expectation was found
zentao_test_type_error=invalid Zentao request zentao_test_type_error=invalid Zentao request

View File

@ -317,6 +317,12 @@ create_user=创建人
test_case_status=用例状态 test_case_status=用例状态
id_not_rightful=ID 不合法 id_not_rightful=ID 不合法
project_reference_multiple_plateform=项目指向多个第三方平台 project_reference_multiple_plateform=项目指向多个第三方平台
test_case_comment_template=【评论:%s %s %s%s】\n%s\n
test_case_comment=用例
test_case_plan_comment=执行
test_case_review_comment=评审
plan_case_status_blocking=阻塞
plan_case_status_skip=跳过
# mock # mock
mock_warning=未找到匹配的Mock期望 mock_warning=未找到匹配的Mock期望
zentao_test_type_error=无效的 Zentao 请求 zentao_test_type_error=无效的 Zentao 请求

View File

@ -316,6 +316,12 @@ create_user=創建人
test_case_status=用例狀態 test_case_status=用例狀態
id_not_rightful=ID 不合法 id_not_rightful=ID 不合法
project_reference_multiple_plateform=項目指向多個第三方平臺 project_reference_multiple_plateform=項目指向多個第三方平臺
test_case_comment_template=【評論:%s %s %s%s】\n%s\n
test_case_comment=用例
test_case_plan_comment=執行
test_case_review_comment=評審
plan_case_status_blocking=阻塞
plan_case_status_skip=跳過
# mock # mock
mock_warning=未找到匹配的Mock期望 mock_warning=未找到匹配的Mock期望
zentao_test_type_error=請求方式錯誤 zentao_test_type_error=請求方式錯誤

View File

@ -107,6 +107,7 @@
:public-enable="false" :public-enable="false"
:current-version="currentVersion" :current-version="currentVersion"
:version-enable="versionEnable" :version-enable="versionEnable"
@closeExport="closeExport"
@refreshTable="refresh" @refreshTable="refresh"
@testCaseEdit="editTestCase" @testCaseEdit="editTestCase"
@testCaseCopy="copyTestCase" @testCaseCopy="copyTestCase"
@ -584,12 +585,15 @@ export default {
this.activeName = "default"; this.activeName = "default";
} }
}, },
exportTestCase(type) { exportTestCase(type, param) {
if (this.activeDom !== 'left') { if (this.activeDom !== 'left') {
this.$warning(this.$t('test_track.case.export.export_tip')); this.$warning(this.$t('test_track.case.export.export_tip'));
return; return;
} }
this.$refs.testCaseList.exportTestCase(type); this.$refs.testCaseList.exportTestCase(type, param);
},
closeExport() {
this.$refs.nodeTree.closeExport();
}, },
init(route) { init(route) {
let path = route.path; let path = route.path;

View File

@ -1,85 +0,0 @@
<template>
<el-dialog class="testcase-import" :title="$t('test_track.case.import.case_export')" :visible.sync="dialogVisible"
@close="close">
<el-row class="import-row" style="margin-left: 34px">
<el-radio v-model="exportType" label="excel">{{$t('commons.excelFile')}}</el-radio>
<el-radio v-model="exportType" label="xmind">{{$t('commons.xmindFile')}}</el-radio>
</el-row>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false">{{$t('commons.cancel')}}</el-button>
<el-button type="primary" @click="exportTestCase">{{$t('commons.export')}}</el-button>
</span>
</el-dialog>
</template>
<script>
import ElUploadList from "element-ui/packages/upload/src/upload-list";
import MsTableButton from '../../../../components/common/components/MsTableButton';
import {getCurrentProjectID, listenGoBack, removeGoBackListener} from "../../../../../common/js/utils";
import {TokenKey} from '../../../../../common/js/constants';
import axios from "axios";
export default {
name: "TestCaseImport",
components: {ElUploadList, MsTableButton},
data() {
return {
exportType:"excel",
dialogVisible: false,
projectId:"",
}
},
created() {
},
activated() {
},
methods: {
handleError(err, file, fileList) {
this.isLoading = false;
this.$error(err.message);
},
open() {
listenGoBack(this.close);
this.projectId = getCurrentProjectID();
this.dialogVisible = true;
},
close() {
removeGoBackListener(this.close);
this.dialogVisible = false;
},
exportTestCase(){
this.$emit('exportTestCase',this.exportType);
this.close();
}
}
}
</script>
<style>
</style>
<style scoped>
.download-template {
padding-top: 0px;
padding-bottom: 10px;
}
.import-row {
padding-top: 20px;
}
.testcase-import >>> .el-dialog {
width: 400px;
}
.testcase-import-img {
width: 614px;
height: 312px;
size: 200px;
}
</style>

View File

@ -222,7 +222,6 @@
import MsTableHeaderSelectPopover from "@/business/components/common/components/table/MsTableHeaderSelectPopover"; import MsTableHeaderSelectPopover from "@/business/components/common/components/table/MsTableHeaderSelectPopover";
import TestCaseImport from './import/TestCaseImport'; import TestCaseImport from './import/TestCaseImport';
import TestCaseExport from '../components/TestCaseExport';
import MsTablePagination from '../../../../components/common/pagination/TablePagination'; import MsTablePagination from '../../../../components/common/pagination/TablePagination';
import NodeBreadcrumb from '../../common/NodeBreadcrumb'; import NodeBreadcrumb from '../../common/NodeBreadcrumb';
import MsTableHeader from '../../../../components/common/components/MsTableHeader'; import MsTableHeader from '../../../../components/common/components/MsTableHeader';
@ -310,7 +309,6 @@ export default {
TypeTableItem, TypeTableItem,
PriorityTableItem, PriorityTableItem,
TestCaseImport, TestCaseImport,
TestCaseExport,
MsTablePagination, MsTablePagination,
NodeBreadcrumb, NodeBreadcrumb,
MsTableHeader, MsTableHeader,
@ -1016,12 +1014,13 @@ export default {
} }
this.$refs.testCaseImport.open(); this.$refs.testCaseImport.open();
}, },
exportTestCase(exportType) { exportTestCase(exportType, fieldParam) {
if (!this.projectId) { if (!this.projectId) {
this.$warning(this.$t('commons.check_project_tip')); this.$warning(this.$t('commons.check_project_tip'));
return; return;
} }
let param = buildBatchParam(this, this.$refs.table.selectIds);
Object.assign(param, fieldParam);
let config = {}; let config = {};
let fileNameSuffix = ""; let fileNameSuffix = "";
if (exportType === 'xmind') { if (exportType === 'xmind') {
@ -1029,7 +1028,7 @@ export default {
url: '/test/case/export/testcase/xmind', url: '/test/case/export/testcase/xmind',
method: 'post', method: 'post',
responseType: 'blob', responseType: 'blob',
data: buildBatchParam(this, this.$refs.table.selectIds) data: param
}; };
fileNameSuffix = ".xmind"; fileNameSuffix = ".xmind";
} else { } else {
@ -1037,7 +1036,7 @@ export default {
url: '/test/case/export/testcase', url: '/test/case/export/testcase',
method: 'post', method: 'post',
responseType: 'blob', responseType: 'blob',
data: buildBatchParam(this, this.$refs.table.selectIds) data: param
}; };
fileNameSuffix = ".xlsx"; fileNameSuffix = ".xlsx";
} }
@ -1056,8 +1055,10 @@ export default {
aTag.href = URL.createObjectURL(blob); aTag.href = URL.createObjectURL(blob);
aTag.click(); aTag.click();
URL.revokeObjectURL(aTag.href); URL.revokeObjectURL(aTag.href);
this.$emit('closeExport');
} else { } else {
navigator.msSaveBlob(blob, filename); navigator.msSaveBlob(blob, filename);
this.$emit('closeExport');
} }
}); });
}, },

View File

@ -0,0 +1,94 @@
<template>
<el-dialog class="testcase-import" :title="$t('test_track.case.import.case_export')" :visible.sync="dialogVisible"
@close="close">
<span class="format-title">
{{ $t('test_track.case.import.import_format') }}
</span>
<el-row class="import-row">
<el-col :span="12">
<el-radio v-model="exportType" label="excel">{{ $t('commons.excelFile') }}</el-radio>
</el-col>
<el-col :span="12">
<el-radio v-model="exportType" label="xmind">{{ $t('commons.xmindFile') }}</el-radio>
</el-col>
</el-row>
<test-case-export-field-select
v-if="exportType === 'excel'"
ref="testCaseExportFieldSelect"/>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false">{{ $t('commons.cancel') }}</el-button>
<el-button type="primary" @click="exportTestCase">{{ $t('commons.export') }}</el-button>
</span>
</el-dialog>
</template>
<script>
import ElUploadList from "element-ui/packages/upload/src/upload-list";
import MsTableButton from '../../../../common/components/MsTableButton';
import {getCurrentProjectID, listenGoBack, removeGoBackListener} from "../../../../../../common/js/utils";
import TestCaseExportFieldSelect from "@/business/components/track/case/components/export/TestCaseExportFieldSelect";
export default {
name: "TestCaseImport",
components: {TestCaseExportFieldSelect, ElUploadList, MsTableButton},
data() {
return {
exportType: "excel",
dialogVisible: false,
projectId: ""
}
},
activated() {
},
methods: {
handleError(err, file, fileList) {
this.isLoading = false;
this.$error(err.message);
},
open() {
listenGoBack(this.close);
this.projectId = getCurrentProjectID();
this.dialogVisible = true;
},
close() {
removeGoBackListener(this.close);
this.dialogVisible = false;
},
exportTestCase() {
let param = this.$refs.testCaseExportFieldSelect.getExportParam();
this.$emit('exportTestCase', this.exportType, param);
}
}
}
</script>
<style>
</style>
<style scoped>
.import-row {
padding-top: 20px;
}
.testcase-import >>> .el-dialog {
width: 600px;
}
.testcase-import >>> .el-dialog .el-dialog__title {
font-weight: bold;
}
.testcase-import >>> .el-dialog .el-dialog__body {
padding: 20px;
}
.format-title {
font-size: 16px;
font-weight: bold;
}
</style>

View File

@ -0,0 +1,46 @@
<template>
<div>
<el-row v-for="rowIndex in fieldRowCount" :key="rowIndex">
<span v-for="(item, index) in fields"
:key="item.id">
<el-col :span="6"
v-if="Math.floor(index / colCountEachRow) === rowIndex - 1">
<el-checkbox v-model="item.enable" @change="change">
{{ item.name }}
</el-checkbox>
</el-col>
</span>
</el-row>
</div>
</template>
<script>
export default {
name: "TestCaseExportFieldList",
props: ['fields'],
data() {
return {
colCountEachRow: 4
}
},
computed: {
fieldRowCount() {
if (!this.fields) {
return 0;
}
return Math.ceil(this.fields.length / this.colCountEachRow);
}
},
methods: {
change(value) {
this.$emit('enableChange', value);
}
}
}
</script>
<style scoped>
.el-row {
margin-bottom: 10px;
}
</style>

View File

@ -0,0 +1,236 @@
<template>
<div>
<div class="export-title"
@click="showSelect = !showSelect">
<span>
{{ $t('test_track.case.import.select_import_field') }}
</span>
<i class="el-icon-arrow-down"
v-if="showSelect"/>
<i class="el-icon-arrow-left"
v-if="!showSelect"/>
</div>
<el-divider/>
<div v-show="showSelect">
<el-checkbox class="select-all-checkbox"
v-model="selectAll" @change="handleSelectAllChange">
{{ $t('test_track.case.import.select_import_all_field') }}
</el-checkbox>
<test-case-export-field-select-item
type="EXPORT_BASE_FIELD"
:title="$t('test_track.case.import.base_field')"
:fields="baseFields"
@selectAllChange="handleItemSelectAllChange"
ref="baseSelectItem"/>
<test-case-export-field-select-item
type="EXPORT_CUSTOM_FIELD"
:title="$t('test_track.case.import.custom_field')"
:fields="customFields"
@selectAllChange="handleItemSelectAllChange"
ref="customSelectItem"/>
<test-case-export-field-select-item
type="EXPORT_OTHER_FIELD"
:title="$t('test_track.case.import.other_field')"
:fields="otherFields"
@selectAllChange="handleItemSelectAllChange"
ref="otherSelectItem"/>
<div class="other-field-tip">
{{ $t('test_track.case.import.other_field_tip') }}
</div>
</div>
</div>
</template>
<script>
import {getCurrentProjectID} from "@/common/js/utils";
import TestCaseExportFieldList from "@/business/components/track/case/components/export/TestCaseExportFieldList";
import {getTestTemplate} from "@/network/custom-field-template";
import TestCaseExportFieldSelectItem
from "@/business/components/track/case/components/export/TestCaseExportFieldSelectItem";
export default {
name: "TestCaseExportFieldSelect",
components: {TestCaseExportFieldSelectItem, TestCaseExportFieldList},
data() {
return {
selectAll: false,
showSelect: true,
baseFields: [
{
id: 'ID',
key: 'A',
name: 'ID',
enable: true
},
{
id: 'name',
key: 'B',
name: this.$t("test_track.case.name"),
enable: true
},
{
id: 'nodeId',
key: 'C',
name: this.$t("test_track.case.module"),
enable: true
},
{
id: 'prerequisite',
key: 'D',
name: this.$t("test_track.case.prerequisite"),
enable: true
},
{
id: 'remark',
key: 'E',
name: this.$t("commons.remark"),
enable: true
},
{
id: 'stepDesc',
key: 'F',
name: this.$t("test_track.case.step_describe"),
enable: true
},
{
id: 'stepResult',
key: 'G',
name: this.$t("test_track.case.expected_results"),
enable: true
},
{
id: 'stepModel',
key: 'H',
name: this.$t("test_track.case.step_model"),
enable: true
},
{
id: 'tags',
key: 'I',
name: this.$t("commons.tag"),
enable: true
},
],
customFields: [],
otherFields: [
{
id: 'version',
key: 'A',
name: this.$t("commons.version"),
enable: false
},
{
id: 'commend',
key: 'B',
name: this.$t("commons.comment"),
enable: false
},
{
id: 'executeResult',
key: 'C',
name: this.$t("test_track.plan.execute_result"),
enable: false
},
{
id: 'reviewResult',
key: 'D',
name: this.$t("test_track.review_view.execute_result"),
enable: false
},
{
id: 'creator',
key: 'E',
name: this.$t("commons.creator"),
enable: false
},
{
id: 'createTime',
key: 'F',
name: this.$t("commons.create_time"),
enable: false
},
{
id: 'updateTime',
key: 'G',
name: this.$t("commons.update_time"),
enable: false
},
]
}
},
computed: {
selectItems() {
return [this.$refs.baseSelectItem, this.$refs.customSelectItem, this.$refs.otherSelectItem];
}
},
created() {
this.projectId = getCurrentProjectID();
getTestTemplate()
.then((template) => {
template.customFields.forEach(item => {
item.enable = true;
});
this.customFields = template.customFields;
//
this.customFields.sort((a, b) => a.system && !b.system ? -1 : 1);
});
},
methods: {
getExportParam() {
return {
baseHeaders: this.selectItems[0].getExportParam(),
customHeaders: this.selectItems[1].getExportParam(),
otherHeaders: this.selectItems[2].getExportParam(),
}
},
handleSelectAllChange() {
this.selectItems.forEach(item => {
item.selectAllChange(this.selectAll);
});
},
handleItemSelectAllChange() {
let isSelectAll = true;
this.selectItems.forEach(item => {
if (!item.selectAll) {
isSelectAll = false;
}
});
this.selectAll = isSelectAll;
}
}
}
</script>
<style scoped>
.export-title {
font-size: 16px;
font-weight: bold;
margin: 20px 5px 15px 0px;
}
.export-title span:first-child {
margin-right: 5px;
}
.select-all-checkbox {
margin-top: 10px
}
.export-title {
cursor: pointer;
}
.other-field-tip {
margin-top: 30px;
font-size: 10px;
color: #9ea0a3;
}
</style>

View File

@ -0,0 +1,111 @@
<template>
<div>
<div class="field-title" v-if="fields && fields.length > 0">
<span>{{ title }}</span>
<el-checkbox
v-model="selectAll"
@change="selectAllChange"/>
</div>
<test-case-export-field-list
:fields="fields"
@enableChange="enableChange"
/>
</div>
</template>
<script>
import TestCaseExportFieldList from "@/business/components/track/case/components/export/TestCaseExportFieldList";
export default {
name: "TestCaseExportFieldSelectItem",
components: {TestCaseExportFieldList},
props: {
fields: Array,
title: String,
type: String
},
data() {
return {
selectAll: false,
}
},
watch: {
selectAll() {
this.$emit('selectAllChange', this.selectAll);
},
fields() {
this.checkEnable();
}
},
created() {
this.checkEnable();
},
methods: {
getExportParam() {
return this.fields.filter(item => item.enable);
},
enableChange(enable) {
this.persistenceValues();
if (enable) {
for (let head of this.fields) {
if (!head.enable) {
//
return;
}
}
}
//
this.selectAll = enable;
},
persistenceValues() {
//
let enableKeys = this.fields.filter(i => i.enable)
.map(i => i.key);
localStorage.setItem(this.type, JSON.stringify(enableKeys));
},
selectAllChange(value) {
this.selectAll = value;
this.fields.forEach(i => {
i.enable = value;
});
this.persistenceValues();
},
checkEnable() {
//
let enableKeys = localStorage.getItem(this.type);
if (enableKeys) {
enableKeys = JSON.parse(enableKeys);
}
let isSelectAll = true;
for (let field of this.fields) {
if (enableKeys) {
if (enableKeys.indexOf(field.key) > -1) {
field.enable = true;
} else {
field.enable = false;
}
}
if (!field.enable) {
isSelectAll = false;
}
}
this.selectAllChange(isSelectAll);
}
}
}
</script>
<style scoped>
.field-title {
margin-top: 20px;
margin-bottom: 10px;
font-size: 15px;
font-weight: bold;
}
.field-title span:first-child {
margin-right: 10px;
}
</style>

View File

@ -62,7 +62,7 @@ import NodeEdit from "../common/NodeEdit";
import MsNodeTree from "../common/NodeTree"; import MsNodeTree from "../common/NodeTree";
import TestCaseCreate from "@/business/components/track/case/components/TestCaseCreate"; import TestCaseCreate from "@/business/components/track/case/components/TestCaseCreate";
import TestCaseImport from "@/business/components/track/case/components/import/TestCaseImport"; import TestCaseImport from "@/business/components/track/case/components/import/TestCaseImport";
import TestCaseExport from "@/business/components/track/case/components/TestCaseExport"; import TestCaseExport from "@/business/components/track/case/components/export/TestCaseExport";
import MsSearchBar from "@/business/components/common/components/search/MsSearchBar"; import MsSearchBar from "@/business/components/common/components/search/MsSearchBar";
import {buildTree} from "../../api/definition/model/NodeTree"; import {buildTree} from "../../api/definition/model/NodeTree";
import {buildNodePath} from "@/business/components/api/definition/model/NodeTree"; import {buildNodePath} from "@/business/components/api/definition/model/NodeTree";
@ -244,8 +244,8 @@ export default {
} }
this.$refs.testCaseExport.open(); this.$refs.testCaseExport.open();
}, },
exportTestCase(type){ exportTestCase(type, param){
this.$emit('exportTestCase',type); this.$emit('exportTestCase', type, param);
}, },
remove(nodeIds) { remove(nodeIds) {
this.$post("/case/node/delete", nodeIds, () => { this.$post("/case/node/delete", nodeIds, () => {
@ -290,6 +290,9 @@ export default {
}, },
changeConfirm(isSave) { changeConfirm(isSave) {
this.$emit('importChangeConfirm', isSave); this.$emit('importChangeConfirm', isSave);
},
closeExport() {
this.$refs.testCaseExport.close();
} }
} }
}; };

View File

@ -1,3 +1,5 @@
import test_track from "./track/en-US";
export default { export default {
commons: { commons: {
project_permission: 'Please add the project permission first', project_permission: 'Please add the project permission first',
@ -93,6 +95,7 @@ export default {
input_password: 'Please enter password', input_password: 'Please enter password',
test: 'Test', test: 'Test',
create_time: 'Created Time', create_time: 'Created Time',
creator: 'Creator',
update_user_id: 'Updater ID', update_user_id: 'Updater ID',
update_time: 'Updated Time', update_time: 'Updated Time',
delete_time: 'Delete Time', delete_time: 'Delete Time',
@ -2063,511 +2066,7 @@ export default {
please_search: "Please Search", please_search: "Please Search",
date: "Date" date: "Date"
}, },
test_track: { test_track,
sync_add_api_load: 'Synchronously add associated api and load tests',
next: 'Next',
total_size: 'Total {0}',
related_requirements: 'Related requirements',
please_related_requirements: 'Please select the requirements to associate',
please_select_the_test_to_associate: "Please select the test to associate",
person_responsible: "Person Responsible",
test_track: "Track",
confirm: "Confirm",
cancel: "Cancel",
planning_execution: "Planning&Execution",
project: "Project",
save: "Save",
return: "Return",
length_less_than: "The length less than",
recent_plan: "My recent plan",
recent_case: "My recent case",
recent_review: "My recent review",
pass_rate: "Pass Rate",
execution_result: ": Please select the execution result",
actual_result: ": The actual result is empty",
cancel_relevance_success: "Unlinked successfully",
switch_project: "Project",
functional_test_case: "Functional Case",
api_test_case: "Api Case",
ui_test_case: "UI Case",
performance_test_case: "Performance Case",
scenario_test_case: "Scenario Case",
ui_scenario_test_case: "UI Scenario Case",
report_statistics: "Report Statistics",
sort: 'Sort',
demand: {
id: 'Demand ID',
name: 'Demand Name',
batch_relate: 'Bulk Association Requirements',
relate_is_null_warn: 'The associated requirement cannot be empty!',
relate_name_is_null_warn: 'Requirement name cannot be empty!',
third_platform_demand: "Third platform demand",
other_demand: "Other demand"
},
step_model: 'Step Model',
automatic_status_update: "Automatic Status Update",
case: {
list: "List",
minder: "Minder",
step_info: "Step Info",
other_info: "Other Info",
step_describe: "Step Describe",
step_describe_tip: "Applicable to every step of the test scenario, there are clear test steps, expected results",
text_describe: "Text Describe",
text_describe_tip: "For simple test scenarios, there are no clear test steps",
change_type: "Change Type",
minder_create_tip: "failed, unable to create its parent module in minder",
minder_issue_delete_tip: "Successfully cancel the defect association",
check_select: "Please check the case",
export_all_cases: 'Are you sure you want to export all use cases?',
minder_tem_node_tip: "Cannot create case {0} under the temporary node",
minder_is_module_tip: "{0} is a module and cannot be modified as a use ca",
minder_not_module_tip: "Module {0}, cannot be created under a non-module node",
minder_all_module_tip: 'All case are virtual modules. Please create use cases in other modules',
minder_save_confirm_title: 'Please save the minder',
minder_save_confirm_tip: 'The minder is not saved. Are you sure to save?',
minder_import_save_confirm_tip: 'Will the minder be refreshed after successful import and confirm to save minder?',
input_test_case: 'Please enter the associated case name',
test_name: 'TestName',
other: '--Other--',
test_case: "Case",
move: "Move case",
case_list: "Test case list",
create_case: "Create case",
edit_case: "Edit case",
view_case: "Test case",
no_project: "There is no project in this workspace, please create the project first",
priority: "Priority",
type: "Type",
method: "Method",
auto: "Auto",
manual: "Manual",
create: "Create test case",
case_type: "Case Type",
name: "Test Case Name",
module: "Module",
project: 'Project',
maintainer: "Maintainer",
steps: "Steps",
number: "Number",
prerequisite: "Prerequisite",
step_desc: "Case step",
expected_results: "Expected results",
input_name: "Please enter name",
input_module: "Please select module",
input_maintainer: "Please select maintainer",
input_priority: "Please select priority",
input_type: "Please select type",
input_method: "Please select method",
input_prerequisite: "Please select prerequisite",
input_demand_name: "Please input demand id or name",
delete_confirm: "Confirm delete test case",
delete: "Delete case",
save_create_continue: "Save and create continue",
save_add_public: "Save and add public",
please_create_project: "No project available, please create the project first",
create_module_first: "Please create module first",
relate_test: "Relate test",
relate_issue: "Relate Issue",
demand_name_id: "Demand ID/Name",
please_select_relate_test: "Please select the test to associate",
relate_test_not_find: 'The associated test does not exist, please check the test case',
other_relate_test_not_find: 'Associated test name, please go to the third party platform to execute',
batch_handle: 'Batch processing (select {0} items)',
batch_update: 'Update the attributes of {0} cases',
select_catalog: 'Please select use case catalog',
updated_attr_value: 'The updated attribute value',
batch_operate: 'Batch operation',
please_select_attr: 'Please select attributes',
please_select_attr_value: 'Please select the value corresponding to the attribute',
batch_edit_case: 'Batch editing',
batch_move_case: 'Batch move',
batch_copy: 'Batch copy',
batch_add_public: 'Batch add public',
batch_link_demand: 'Bulk Association Requirements',
public_warning: 'The public library configuration is not enabled',
generate_dependencies: 'Generate dependencies',
generate_dependencies_warning: 'For a better experience, it is recommended to check the data below 100',
batch_delete_case: 'Batch delete',
batch_unlink: 'Batch Unlink',
unlink: 'Unlink',
project_name: "Project",
status: 'Review Status',
status_prepare: 'Prepare',
status_running: 'Underway',
status_finished: 'Completed',
status_pass: 'Pass',
status_un_pass: 'UnPass',
cancel_relevance_project: "Disassociating the project will also cancel the associated test cases under the project",
img_loading_fail: "Image failed to load",
pdf_loading_fail: "PDF loading failed",
upload_tip: "file size limit[0-500MB]",
add_attachment: "Add",
attachment: "Attachment",
upload_time: "Upload Time",
total: "Total Case",
node_id: "Node ID",
node_path: "Node Path",
match_rule: "Test Case Match Rule",
import: {
import: "Import test case",
case_import: "Import test case",
case_export: "Export test case",
download_template: "Download template",
click_upload: "Upload",
upload_limit: "Only XLS/XLSX/XMIND files can be uploaded, and no more than 100M",
upload_xmind_format: "Upload files can only be .xmind format",
upload_xmind: "Only xmind files can be uploaded, and no more than 800",
upload_limit_count: "Only one file can be uploaded at a time",
upload_limit_format: "Upload files can only be XLS, XLSX format!",
upload_limit_size: "Upload file size cannot exceed 100MB!",
upload_limit_other_size: "Upload file size cannot exceed",
success: "Import success",
importing: "Importing...",
excel_title: "Excel ",
xmind_title: "Xmind",
import_desc: "Import instructions",
import_file: "upload files",
ignore_error: "Ignore errors ",
continue_upload: "Upload continue",
import_create: "Import Create",
import_update: "Import Update",
import_tip1: "The ID is required when the \"Test Case Custom ID\" switch is turned on in the project settings",
import_tip2: "ID is required when importing and updating",
import_file_tips: "Please upload the file first!",
},
export: {
export: "Export cases",
export_tip: "Switch to Case List and check Use Case Export"
},
case_desc: "Case Desc",
passing_rate: 'Case Pass Rate',
exists_multiple_prerequisite_node: "Exists multiple precondition node",
exists_multiple_remark_node: "Exists multiple remark node",
},
plan: {
test_plan: "Plan",
test_plan_id: 'Plan ID',
create_plan: "Create test plan",
edit_plan: "Edit test plan",
plan_name: "Name",
plan_project: "Project",
related_project: "Related Project",
related_tip: "After linking the project, you can add test cases under the linking project to the test plan list",
plan_stage: "Stage",
follow_people: "Follow",
plan_status: "Status",
smoke_test: "Smoke test",
functional_test: "Functional test",
integration_testing: "Integration test",
system_test: "System test",
regression_test: "Regression test",
version_validation: "Version validation",
plan_principal: "Principal",
input_plan_name: "Please input plan name",
input_plan_principal: "Please select principal",
input_plan_project: "Please select project",
input_related_project: "Please Related project",
input_plan_stage: "Please select stage",
plan_status_prepare: "Not started",
plan_status_running: "Starting",
plan_status_finished: "Finished",
plan_status_completed: "Completed",
plan_status_archived: "Archived",
plan_status_trash: "Trashed",
planned_start_time: "Start Time",
planned_end_time: "End Time",
actual_start_time: "Actual Start Time",
actual_end_time: "Actual End Time",
plan_delete_confirm: "All use cases under this plan will be deleted,confirm delete test plan: ",
plan_delete_tip: "The test plan is under way, please confirm and delete it!",
plan_delete: "Delete test plan",
api_case: "Api case",
scenario_case: "Scenario case",
execute_result: "Execute Result",
execute_time: 'Execute Time',
is_api_case_executing: "Api Case Executing",
is_scenario_executing: 'Scenario Executing',
is_performance_executing: 'Performance Executing',
test_plan_test_case_count: "Track Case Count",
test_plan_api_case_count: "Api Case Count",
test_plan_api_scenario_count: "Scenario Case Count",
test_plan_ui_scenario_count: "Ui Scenario Case Count",
test_plan_load_case_count: "Load Case Count",
test_plan_component_case_count: "Component Case Count",
data_name: "Data Name",
test_plan_batch_switch: "batch on/off scheduled tasks",
batch_update_schedule_enable: 'update the scheduled task status of {0} test plans',
batch_update_schedule_enable_alert: 'note: only test plans with scheduled tasks can be updated',
next_run_time: 'next running time',
schedule_enabled: 'enabled',
check_schedule_enabled: 'the data you checked has detected {0} scheduled tasks that can be modified',
no_check_schedule_enabled: 'the data you checked does not detect a scheduled task',
load_case: {
case: "Load Case",
execution_status: "Execution status",
report: "report",
view_report: "View report",
unlink_in_bulk: "Unlink in bulk",
batch_exec_cases: "Batch execution use cases",
exec: "Executing....",
error: "Use case execution error, please debug this use case separately!",
report_not_found: "Report does not exist",
content_empty: "Content empty",
}
},
review: {
test_review: "Review",
create_review: "Create Review",
edit_review: "Edit Review",
review_name: "Name",
reviewer: "Reviewer",
review_project: "Project",
review_creator: "Creator",
review_follow_people: "Follow",
review_status: "Status",
related_project: "Related Project",
related_tip: "After the project is associated, you can add test cases under the associated project to the review list",
end_time: "EndTime",
delete: "Delete",
input_review_name: "Please enter the name of the review",
input_review_project: "Please select the project",
input_reviewer: "Please select reviewer",
no_link_case: "No associated use cases!",
prepare: "Prepare",
pass: "Pass",
un_pass: "UnPass",
comment: "Comment",
my_review: "My Review",
my_create: "My Create",
reviewed_by_me: "Review By Me",
creator: "Creator",
done: "Commented use cases",
result_distribution: "Result Distribution",
deadline_cannot_early_tips: "Deadline cannot be earlier than current time",
},
comment: {
no_comment: "No Comment",
send_comment: "Post a comment (Ctrl + Enter to send)",
send: "Confirm",
description_is_null: "Comment content cannot be empty!",
send_success: "Comment successful!",
},
review_view: {
review: "Review",
all_case: "All case",
start_review: "Start Review",
relevance_case: "Relevance Case",
last_page: "It's the end",
execute_result: "Result",
cannot_edit: "Cannot edit this comment",
cannot_delete: "Cannot delete this comment",
submit_description: "please submit comments first",
},
module: {
id: 'Module ID',
search: "Search module",
rename: "Rename",
add_submodule: "Add submodule",
add_module: "Add module",
name: "Name",
delete_confirm: "Confirm delete module:",
delete_all_resource: "and all submodules and test cases under the module",
delete_batch_confirm: "Steps to confirm batch deletion of selected scenarios",
module: "Module",
title: "Title",
describe: "Describe",
status: "Status",
current_owner: "Current Owner",
creation_time: "Creation time",
project_name: "Project"
},
home: {
recent_test: "Recent Test",
my_plan: "My Plan",
test_rate: "Test Rate",
tested_case: "Tested Case",
review_progress: "Review Progress",
case_count: "Statistics of the number of use cases",
relevance_case: "Related Case",
case_maintenance: "Use case person responsible distribution",
bug_count: "Statistics of remaining defects",
case_review: "Use case review",
review_rate: "Reviewed",
coverage: "Coverage",
function_case_count: "Functional Case Count",
relevance_case_count: "Related Case Count",
serial_number: "Index",
test_plan_name: "Plan Name",
case_size: "Case Count",
bug_size: "Bug Count",
passing_rate: "Pass Rate",
percentage: "Percentage"
},
plan_view: {
plan: "Plan",
relevance_test_case: "Relevance case",
cancel_all_relevance: "Unlink all",
executor: "Executor",
executor_match_rule: "Executor Match Rule",
execute_result: "Result",
pass: "Pass",
not_pass: "UnPass",
failure: "Failure",
blocking: "Blocking",
stop: "Stop",
skip: "Skip",
actual_result: "Actual result",
step_result: "Step result",
my_case: "My case",
all_case: "All case",
pre_case: "The last case",
next_case: "The next case",
change_execution_results: "Change results",
change_executor: "Change executor",
select_executor: "Select executor",
select_execute_result: "Select execute result",
cancel_relevance: "Cancel relevance",
confirm_cancel_relevance: "Confirm cancel relevance",
select_manipulate: "Select the data you want to manipulate",
select_template: "Select template",
step: "Step",
submit_issues: "Commit issues",
operate_step: "Operate step",
edit_component: "Edit component",
component: "component",
base_info: "Base info",
mock_info: "Mock service",
test_result: "Test result",
result_distribution: "Result distribution",
custom_component: "Custom",
create_report: "Create report",
defect_list: "Defect list",
view_report: "View report",
component_library: "Component library",
component_library_tip: "Drag and drop the component from the component library, add to the right, preview the report effect, only one can be added per system component.",
delete_component_tip: "Please reserve at least one component",
input_template_name: "Input template name",
template_special_characters: 'Template name does not support special characters',
case_count: "Case count",
issues_count: "Issues count",
result_statistics: "Result statistics",
result_statistics_chart: "Result statistics chart",
create_template: "Create template",
report_template: "Report template",
test_detail: "Test detail",
failure_case: "Failure case",
export_report: "Export Report",
share_report: "Share Report",
no_case_relevance: "No related use cases",
automatically_update_status: "Auto update status",
allow_associated_repetitive_cases: "Repetitive Case",
automatically_update_status_tip: "When the interface or performance use case associated with the functional use case is executed in the test plan, the status of the functional use case is automatically updated",
allow_associated_repetitive_cases_tip: "Whether to allow the same use case to be associated multiple times in the same test plan",
performance_case_count: "Performance Case Count",
running: "Running",
please_choose_test_case: "please select a test case",
execute_tip: "The step execution result contains a Failed result, and the use case cannot be marked as Passed!"
},
issue: {
issue: "Issue",
issue_management: "Issue",
platform_status: "Platform Status",
issue_resource: "Issue Source",
create_issue: "Create Issue",
add_issue: "Add Issue",
issue_list: "Issue List",
search_name: "Search for title",
platform_tip: "Integrated defect management platform in the system setting-workspace-service integration can submit defects to the designated defect management platform",
input_title: "Please enter title",
id: "Issue ID",
title: "Issue Title",
description: "Issue Describe",
status: "Issue Status",
platform: "Platform",
issue_project: "Project",
operate: "Operate",
close: "Close",
delete: "Delete",
title_description_required: "Title and description are required",
close_success: "Closed successfully",
delete_warning: "The cancellation will affect the statistics related to the test plan. Confirm whether to confirm or not",
preview: "Preview",
status_new: 'new',
status_resolved: 'resolved',
status_closed: 'closed',
status_active: 'active',
status_delete: 'delete',
status_in_progress: 'in_progress',
status_rejected: 'rejected',
status_upcoming: 'upcoming',
status_reopened: 'reopened',
please_choose_current_owner: "Please choose current owner",
tapd_current_owner: "Tapd Current Owner",
zentao_bug_build: "Zentao Impact version",
zentao_bug_assigned: "Zentao handler",
third_party_integrated: "Third-party Platform",
use_third_party: "Enable Jira Issue Template",
update_third_party_bugs: "Update the defects of third-party platforms",
sync_bugs: "Synchronization Issue",
sync_complete: "Synchronization complete",
issue_sync_tip: "The current project is synchronizing defects, please wait!",
save_before_open_comment: "Please save issue before comment",
delete_tip: "Confirm Delete Issue",
check_id_exist: "Check",
save_project_first: "Please save the project first",
tapd_status_new: "New",
tapd_status_in_progress: "Acceptance/Processing",
tapd_status_reopened: "Opened",
tapd_status_rejected: "Refused",
tapd_status_verified: "Authenticated",
tapd_status_closed: "Closed",
tapd_status_resolved: "Resolved",
please_choose_platform_status: "Please select platform status",
},
report: {
name: "Test Plan Report",
list: {
name: "name",
test_plan: "Test plan",
creator: "Creator",
create_time: "Create Time",
trigger_mode: "Trigger Mode",
run_time: "run time(s)",
pass_rate: "pass rate",
status: "Status",
operation: "Operation",
},
trigger_mode: {
manual: "Manual",
automation: "Automation",
},
overview: "Overview",
testing_time: "Testing time",
total_number_tests: "Total",
exacutive_rate: "Exacutive rate",
exacutive_rate_tip: "Use cases executed/all use cases * 100%",
passing_rate: "Passing rate",
passing_rate_tip: "Execute passed use cases/all use cases * 100%",
content: "Content",
report_summary: "Summary",
analysis_functional: "Analysis Functional",
analysis_api: "Analysis Api",
analysis_ui: "Analysis Ui",
analysis_load: "Analysis Performance",
valid_for_24_hours: "Valid for 24 hours",
configuration: "Config",
share: "Share",
template_configuration: "Template configuration",
test_result: "Test Result",
fail_case: "Fail Case",
issue_list: "Issue List",
all_case: "All Case",
},
reporter: 'Reporter',
lastmodify: 'Last Modify',
sync_to_new_version: "Copy to latest version",
},
test_resource_pool: { test_resource_pool: {
id: 'Resource Pool ID', id: 'Resource Pool ID',
type: 'type', type: 'type',

View File

@ -0,0 +1,512 @@
export default {
sync_add_api_load: 'Synchronously add associated api and load tests',
next: 'Next',
total_size: 'Total {0}',
related_requirements: 'Related requirements',
please_related_requirements: 'Please select the requirements to associate',
please_select_the_test_to_associate: "Please select the test to associate",
person_responsible: "Person Responsible",
test_track: "Track",
confirm: "Confirm",
cancel: "Cancel",
planning_execution: "Planning&Execution",
project: "Project",
save: "Save",
return: "Return",
length_less_than: "The length less than",
recent_plan: "My recent plan",
recent_case: "My recent case",
recent_review: "My recent review",
pass_rate: "Pass Rate",
execution_result: ": Please select the execution result",
actual_result: ": The actual result is empty",
cancel_relevance_success: "Unlinked successfully",
switch_project: "Project",
functional_test_case: "Functional Case",
api_test_case: "Api Case",
ui_test_case: "UI Case",
performance_test_case: "Performance Case",
scenario_test_case: "Scenario Case",
ui_scenario_test_case: "UI Scenario Case",
report_statistics: "Report Statistics",
sort: 'Sort',
demand: {
id: 'Demand ID',
name: 'Demand Name',
batch_relate: 'Bulk Association Requirements',
relate_is_null_warn: 'The associated requirement cannot be empty!',
relate_name_is_null_warn: 'Requirement name cannot be empty!',
third_platform_demand: "Third platform demand",
other_demand: "Other demand"
},
step_model: 'Step Model',
automatic_status_update: "Automatic Status Update",
case: {
list: "List",
minder: "Minder",
step_info: "Step Info",
other_info: "Other Info",
step_describe: "Step Describe",
step_describe_tip: "Applicable to every step of the test scenario, there are clear test steps, expected results",
text_describe: "Text Describe",
text_describe_tip: "For simple test scenarios, there are no clear test steps",
change_type: "Change Type",
minder_create_tip: "failed, unable to create its parent module in minder",
minder_issue_delete_tip: "Successfully cancel the defect association",
check_select: "Please check the case",
export_all_cases: 'Are you sure you want to export all use cases?',
minder_tem_node_tip: "Cannot create case {0} under the temporary node",
minder_is_module_tip: "{0} is a module and cannot be modified as a use ca",
minder_not_module_tip: "Module {0}, cannot be created under a non-module node",
minder_all_module_tip: 'All case are virtual modules. Please create use cases in other modules',
minder_save_confirm_title: 'Please save the minder',
minder_save_confirm_tip: 'The minder is not saved. Are you sure to save?',
minder_import_save_confirm_tip: 'Will the minder be refreshed after successful import and confirm to save minder?',
input_test_case: 'Please enter the associated case name',
test_name: 'TestName',
other: '--Other--',
test_case: "Case",
move: "Move case",
case_list: "Test case list",
create_case: "Create case",
edit_case: "Edit case",
view_case: "Test case",
no_project: "There is no project in this workspace, please create the project first",
priority: "Priority",
type: "Type",
method: "Method",
auto: "Auto",
manual: "Manual",
create: "Create test case",
case_type: "Case Type",
name: "Test Case Name",
module: "Module",
project: 'Project',
maintainer: "Maintainer",
steps: "Steps",
number: "Number",
prerequisite: "Prerequisite",
step_desc: "Case step",
expected_results: "Expected results",
input_name: "Please enter name",
input_module: "Please select module",
input_maintainer: "Please select maintainer",
input_priority: "Please select priority",
input_type: "Please select type",
input_method: "Please select method",
input_prerequisite: "Please select prerequisite",
input_demand_name: "Please input demand id or name",
delete_confirm: "Confirm delete test case",
delete: "Delete case",
save_create_continue: "Save and create continue",
save_add_public: "Save and add public",
please_create_project: "No project available, please create the project first",
create_module_first: "Please create module first",
relate_test: "Relate test",
relate_issue: "Relate Issue",
demand_name_id: "Demand ID/Name",
please_select_relate_test: "Please select the test to associate",
relate_test_not_find: 'The associated test does not exist, please check the test case',
other_relate_test_not_find: 'Associated test name, please go to the third party platform to execute',
batch_handle: 'Batch processing (select {0} items)',
batch_update: 'Update the attributes of {0} cases',
select_catalog: 'Please select use case catalog',
updated_attr_value: 'The updated attribute value',
batch_operate: 'Batch operation',
please_select_attr: 'Please select attributes',
please_select_attr_value: 'Please select the value corresponding to the attribute',
batch_edit_case: 'Batch editing',
batch_move_case: 'Batch move',
batch_copy: 'Batch copy',
batch_add_public: 'Batch add public',
batch_link_demand: 'Bulk Association Requirements',
public_warning: 'The public library configuration is not enabled',
generate_dependencies: 'Generate dependencies',
generate_dependencies_warning: 'For a better experience, it is recommended to check the data below 100',
batch_delete_case: 'Batch delete',
batch_unlink: 'Batch Unlink',
unlink: 'Unlink',
project_name: "Project",
status: 'Review Status',
status_prepare: 'Prepare',
status_running: 'Underway',
status_finished: 'Completed',
status_pass: 'Pass',
status_un_pass: 'UnPass',
cancel_relevance_project: "Disassociating the project will also cancel the associated test cases under the project",
img_loading_fail: "Image failed to load",
pdf_loading_fail: "PDF loading failed",
upload_tip: "file size limit[0-500MB]",
add_attachment: "Add",
attachment: "Attachment",
upload_time: "Upload Time",
total: "Total Case",
node_id: "Node ID",
node_path: "Node Path",
match_rule: "Test Case Match Rule",
import: {
import: "Import test case",
case_import: "Import test case",
case_export: "Export test case",
download_template: "Download template",
click_upload: "Upload",
upload_limit: "Only XLS/XLSX/XMIND files can be uploaded, and no more than 100M",
upload_xmind_format: "Upload files can only be .xmind format",
upload_xmind: "Only xmind files can be uploaded, and no more than 800",
upload_limit_count: "Only one file can be uploaded at a time",
upload_limit_format: "Upload files can only be XLS, XLSX format!",
upload_limit_size: "Upload file size cannot exceed 100MB!",
upload_limit_other_size: "Upload file size cannot exceed",
success: "Import success",
importing: "Importing...",
excel_title: "Excel ",
xmind_title: "Xmind",
import_desc: "Import instructions",
import_file: "upload files",
ignore_error: "Ignore errors ",
continue_upload: "Upload continue",
import_create: "Import Create",
import_update: "Import Update",
import_tip1: "The ID is required when the \"Test Case Custom ID\" switch is turned on in the project settings",
import_tip2: "ID is required when importing and updating",
import_file_tips: "Please upload the file first!",
import_format: "Import Format",
select_import_field: "Select Field",
select_import_all_field: "Select All",
base_field: "Base Field",
custom_field: "Custom Field",
other_field: "Other Field",
other_field_tip: "Note: For other fields, import is not supported after export",
},
export: {
export: "Export cases",
export_tip: "Switch to Case List and check Use Case Export"
},
case_desc: "Case Desc",
passing_rate: 'Case Pass Rate',
exists_multiple_prerequisite_node: "Exists multiple precondition node",
exists_multiple_remark_node: "Exists multiple remark node",
},
plan: {
test_plan: "Plan",
test_plan_id: 'Plan ID',
create_plan: "Create test plan",
edit_plan: "Edit test plan",
plan_name: "Name",
plan_project: "Project",
related_project: "Related Project",
related_tip: "After linking the project, you can add test cases under the linking project to the test plan list",
plan_stage: "Stage",
follow_people: "Follow",
plan_status: "Status",
smoke_test: "Smoke test",
functional_test: "Functional test",
integration_testing: "Integration test",
system_test: "System test",
regression_test: "Regression test",
version_validation: "Version validation",
plan_principal: "Principal",
input_plan_name: "Please input plan name",
input_plan_principal: "Please select principal",
input_plan_project: "Please select project",
input_related_project: "Please Related project",
input_plan_stage: "Please select stage",
plan_status_prepare: "Not started",
plan_status_running: "Starting",
plan_status_finished: "Finished",
plan_status_completed: "Completed",
plan_status_archived: "Archived",
plan_status_trash: "Trashed",
planned_start_time: "Start Time",
planned_end_time: "End Time",
actual_start_time: "Actual Start Time",
actual_end_time: "Actual End Time",
plan_delete_confirm: "All use cases under this plan will be deleted,confirm delete test plan: ",
plan_delete_tip: "The test plan is under way, please confirm and delete it!",
plan_delete: "Delete test plan",
api_case: "Api case",
scenario_case: "Scenario case",
execute_result: "Execute Result",
execute_time: 'Execute Time',
is_api_case_executing: "Api Case Executing",
is_scenario_executing: 'Scenario Executing',
is_performance_executing: 'Performance Executing',
test_plan_test_case_count: "Track Case Count",
test_plan_api_case_count: "Api Case Count",
test_plan_api_scenario_count: "Scenario Case Count",
test_plan_ui_scenario_count: "Ui Scenario Case Count",
test_plan_load_case_count: "Load Case Count",
test_plan_component_case_count: "Component Case Count",
data_name: "Data Name",
test_plan_batch_switch: "batch on/off scheduled tasks",
batch_update_schedule_enable: 'update the scheduled task status of {0} test plans',
batch_update_schedule_enable_alert: 'note: only test plans with scheduled tasks can be updated',
next_run_time: 'next running time',
schedule_enabled: 'enabled',
check_schedule_enabled: 'the data you checked has detected {0} scheduled tasks that can be modified',
no_check_schedule_enabled: 'the data you checked does not detect a scheduled task',
load_case: {
case: "Load Case",
execution_status: "Execution status",
report: "report",
view_report: "View report",
unlink_in_bulk: "Unlink in bulk",
batch_exec_cases: "Batch execution use cases",
exec: "Executing....",
error: "Use case execution error, please debug this use case separately!",
report_not_found: "Report does not exist",
content_empty: "Content empty",
}
},
review: {
test_review: "Review",
create_review: "Create Review",
edit_review: "Edit Review",
review_name: "Name",
reviewer: "Reviewer",
review_project: "Project",
review_creator: "Creator",
review_follow_people: "Follow",
review_status: "Status",
related_project: "Related Project",
related_tip: "After the project is associated, you can add test cases under the associated project to the review list",
end_time: "EndTime",
delete: "Delete",
input_review_name: "Please enter the name of the review",
input_review_project: "Please select the project",
input_reviewer: "Please select reviewer",
no_link_case: "No associated use cases!",
prepare: "Prepare",
pass: "Pass",
un_pass: "UnPass",
comment: "Comment",
my_review: "My Review",
my_create: "My Create",
reviewed_by_me: "Review By Me",
creator: "Creator",
done: "Commented use cases",
result_distribution: "Result Distribution",
deadline_cannot_early_tips: "Deadline cannot be earlier than current time",
},
comment: {
no_comment: "No Comment",
send_comment: "Post a comment (Ctrl + Enter to send)",
send: "Confirm",
description_is_null: "Comment content cannot be empty!",
send_success: "Comment successful!",
},
review_view: {
review: "Review",
all_case: "All case",
start_review: "Start Review",
relevance_case: "Relevance Case",
last_page: "It's the end",
execute_result: "Result",
cannot_edit: "Cannot edit this comment",
cannot_delete: "Cannot delete this comment",
submit_description: "please submit comments first",
},
module: {
id: 'Module ID',
search: "Search module",
rename: "Rename",
add_submodule: "Add submodule",
add_module: "Add module",
name: "Name",
delete_confirm: "Confirm delete module:",
delete_all_resource: "and all submodules and test cases under the module",
delete_batch_confirm: "Steps to confirm batch deletion of selected scenarios",
module: "Module",
title: "Title",
describe: "Describe",
status: "Status",
current_owner: "Current Owner",
creation_time: "Creation time",
project_name: "Project"
},
home: {
recent_test: "Recent Test",
my_plan: "My Plan",
test_rate: "Test Rate",
tested_case: "Tested Case",
review_progress: "Review Progress",
case_count: "Statistics of the number of use cases",
relevance_case: "Related Case",
case_maintenance: "Use case person responsible distribution",
bug_count: "Statistics of remaining defects",
case_review: "Use case review",
review_rate: "Reviewed",
coverage: "Coverage",
function_case_count: "Functional Case Count",
relevance_case_count: "Related Case Count",
serial_number: "Index",
test_plan_name: "Plan Name",
case_size: "Case Count",
bug_size: "Bug Count",
passing_rate: "Pass Rate",
percentage: "Percentage"
},
plan_view: {
plan: "Plan",
relevance_test_case: "Relevance case",
cancel_all_relevance: "Unlink all",
executor: "Executor",
executor_match_rule: "Executor Match Rule",
execute_result: "Result",
pass: "Pass",
not_pass: "UnPass",
failure: "Failure",
blocking: "Blocking",
stop: "Stop",
skip: "Skip",
actual_result: "Actual result",
step_result: "Step result",
my_case: "My case",
all_case: "All case",
pre_case: "The last case",
next_case: "The next case",
change_execution_results: "Change results",
change_executor: "Change executor",
select_executor: "Select executor",
select_execute_result: "Select execute result",
cancel_relevance: "Cancel relevance",
confirm_cancel_relevance: "Confirm cancel relevance",
select_manipulate: "Select the data you want to manipulate",
select_template: "Select template",
step: "Step",
submit_issues: "Commit issues",
operate_step: "Operate step",
edit_component: "Edit component",
component: "component",
base_info: "Base info",
mock_info: "Mock service",
test_result: "Test result",
result_distribution: "Result distribution",
custom_component: "Custom",
create_report: "Create report",
defect_list: "Defect list",
view_report: "View report",
component_library: "Component library",
component_library_tip: "Drag and drop the component from the component library, add to the right, preview the report effect, only one can be added per system component.",
delete_component_tip: "Please reserve at least one component",
input_template_name: "Input template name",
template_special_characters: 'Template name does not support special characters',
case_count: "Case count",
issues_count: "Issues count",
result_statistics: "Result statistics",
result_statistics_chart: "Result statistics chart",
create_template: "Create template",
report_template: "Report template",
test_detail: "Test detail",
failure_case: "Failure case",
export_report: "Export Report",
share_report: "Share Report",
no_case_relevance: "No related use cases",
automatically_update_status: "Auto update status",
allow_associated_repetitive_cases: "Repetitive Case",
automatically_update_status_tip: "When the interface or performance use case associated with the functional use case is executed in the test plan, the status of the functional use case is automatically updated",
allow_associated_repetitive_cases_tip: "Whether to allow the same use case to be associated multiple times in the same test plan",
performance_case_count: "Performance Case Count",
running: "Running",
please_choose_test_case: "please select a test case",
execute_tip: "The step execution result contains a Failed result, and the use case cannot be marked as Passed!"
},
issue: {
issue: "Issue",
issue_management: "Issue",
platform_status: "Platform Status",
issue_resource: "Issue Source",
create_issue: "Create Issue",
add_issue: "Add Issue",
issue_list: "Issue List",
search_name: "Search for title",
platform_tip: "Integrated defect management platform in the system setting-workspace-service integration can submit defects to the designated defect management platform",
input_title: "Please enter title",
id: "Issue ID",
title: "Issue Title",
description: "Issue Describe",
status: "Issue Status",
platform: "Platform",
issue_project: "Project",
operate: "Operate",
close: "Close",
delete: "Delete",
title_description_required: "Title and description are required",
close_success: "Closed successfully",
delete_warning: "The cancellation will affect the statistics related to the test plan. Confirm whether to confirm or not",
preview: "Preview",
status_new: 'new',
status_resolved: 'resolved',
status_closed: 'closed',
status_active: 'active',
status_delete: 'delete',
status_in_progress: 'in_progress',
status_rejected: 'rejected',
status_upcoming: 'upcoming',
status_reopened: 'reopened',
please_choose_current_owner: "Please choose current owner",
tapd_current_owner: "Tapd Current Owner",
zentao_bug_build: "Zentao Impact version",
zentao_bug_assigned: "Zentao handler",
third_party_integrated: "Third-party Platform",
use_third_party: "Enable Jira Issue Template",
update_third_party_bugs: "Update the defects of third-party platforms",
sync_bugs: "Synchronization Issue",
sync_complete: "Synchronization complete",
issue_sync_tip: "The current project is synchronizing defects, please wait!",
save_before_open_comment: "Please save issue before comment",
delete_tip: "Confirm Delete Issue",
check_id_exist: "Check",
save_project_first: "Please save the project first",
tapd_status_new: "New",
tapd_status_in_progress: "Acceptance/Processing",
tapd_status_reopened: "Opened",
tapd_status_rejected: "Refused",
tapd_status_verified: "Authenticated",
tapd_status_closed: "Closed",
tapd_status_resolved: "Resolved",
please_choose_platform_status: "Please select platform status",
},
report: {
name: "Test Plan Report",
list: {
name: "name",
test_plan: "Test plan",
creator: "Creator",
create_time: "Create Time",
trigger_mode: "Trigger Mode",
run_time: "run time(s)",
pass_rate: "pass rate",
status: "Status",
operation: "Operation",
},
trigger_mode: {
manual: "Manual",
automation: "Automation",
},
overview: "Overview",
testing_time: "Testing time",
total_number_tests: "Total",
exacutive_rate: "Exacutive rate",
exacutive_rate_tip: "Use cases executed/all use cases * 100%",
passing_rate: "Passing rate",
passing_rate_tip: "Execute passed use cases/all use cases * 100%",
content: "Content",
report_summary: "Summary",
analysis_functional: "Analysis Functional",
analysis_api: "Analysis Api",
analysis_ui: "Analysis Ui",
analysis_load: "Analysis Performance",
valid_for_24_hours: "Valid for 24 hours",
configuration: "Config",
share: "Share",
template_configuration: "Template configuration",
test_result: "Test Result",
fail_case: "Fail Case",
issue_list: "Issue List",
all_case: "All Case",
},
reporter: 'Reporter',
lastmodify: 'Last Modify',
sync_to_new_version: "Copy to latest version"
};

View File

@ -0,0 +1,514 @@
export default {
sync_add_api_load: '同步添加关联的接口和性能测试',
next: '下一条',
total_size: '共 {0} 条',
related_requirements: '关联需求',
please_related_requirements: '请选择要关联的需求',
please_select_the_test_to_associate: "请选择需要关联的测试",
person_responsible: "责任人",
test_track: "测试跟踪",
planning_execution: "规划&执行",
confirm: "确 定",
cancel: "取 消",
project: "项目",
save: "保 存",
return: "返 回",
length_less_than: "长度必须小于",
recent_plan: "我最近的计划",
recent_case: "我最近的用例",
recent_review: "我最近的评审",
pass_rate: "通过率",
execution_result: ": 请选择执行结果",
actual_result: ": 实际结果为空",
cancel_relevance_success: "取消关联成功",
switch_project: "切换项目",
functional_test_case: "功能测试用例",
api_test_case: "接口测试用例",
ui_test_case: "UI 测试用例",
performance_test_case: "性能测试用例",
scenario_test_case: "场景测试用例",
ui_scenario_test_case: "UI 测试用例",
report_statistics: "报告统计",
sort: '种类',
automatic_status_update: "自动状态更新",
case: {
list: "列表",
minder: "脑图",
step_info: "步骤信息",
other_info: "其他信息",
step_describe: "步骤描述",
step_describe_tip: "适用于需要每一个步骤进行测试的场景,有明确的测试步骤、预期结果",
text_describe: "文本描述",
text_describe_tip: "使用于简单的测试场景,没有明确的测试步骤",
change_type: "更改类型",
minder_create_tip: "失败, 无法在脑图创建其父模块",
minder_tem_node_tip: "无法在临时节点{0}下创建用例",
minder_is_module_tip: "{0}是模块,不能修改为用例",
minder_not_module_tip: "模块{0},不能创建在非模块节点下",
minder_all_module_tip: "全部用例为虚拟模块,请在其他模块创建用例",
minder_issue_delete_tip: "取消缺陷关联成功",
minder_save_confirm_title: '请保存脑图',
minder_save_confirm_tip: '脑图未保存,确认保存脑图吗?',
minder_import_save_confirm_tip: '导入成功后会刷新脑图,确认保存脑图吗?',
check_select: "请勾选用例",
export_all_cases: '确定要导出全部用例吗?',
input_test_case: '请输入关联用例名称',
test_name: '测试名称',
other: "--其他--",
test_case: "功能用例",
move: "移动用例",
case_list: "用例列表",
create_case: "创建用例",
edit_case: "编辑用例",
view_case: "查看用例",
no_project: "该工作空间下无项目,请先创建项目",
priority: "用例等级",
type: "类型",
method: "测试方式",
auto: "自动",
manual: "手动",
create: "新建用例",
case_type: "用例类型",
name: "用例名称",
module: "所属模块",
project: '所属项目',
maintainer: "维护人",
steps: "执行步骤",
number: "编号",
prerequisite: "前置条件",
step_desc: "用例步骤",
step_model: "编辑模式",
expected_results: "预期结果",
input_name: "请输入名称",
input_module: "请选择模块",
input_maintainer: "请选择维护人",
input_priority: "请选择用例等级",
input_type: "请选择用例类型",
input_method: "请选择测试方式",
input_prerequisite: "请输入前置条件",
input_demand_name: "请输入需求ID或名称",
delete_confirm: "确认删除测试用例",
delete: "删除用例",
save_create_continue: "保存并继续创建",
save_add_public: "保存并添加到公共用例库",
please_create_project: "暂无项目,请先创建项目",
create_module_first: "请先新建模块",
relate_test: "关联测试",
relate_issue: "关联缺陷",
demand_name_id: "需求ID/名称",
please_select_relate_test: "请选择要关联的测试",
relate_test_not_find: '关联的测试不存在,请检查用例',
other_relate_test_not_find: '关联的测试名,请前往第三方平台执行',
batch_handle: '批量处理 (选中{0}项)',
batch_update: '更新{0}个用例的属性',
select_catalog: '请选择用例目录',
updated_attr_value: '更新后属性值为',
batch_operate: '批量操作',
please_select_attr: '请选择属性',
please_select_attr_value: '请选择属性对应的值',
batch_edit_case: '批量编辑',
batch_move_case: '批量移动',
batch_delete_case: '批量删除',
batch_copy: '批量复制',
batch_add_public: '批量添加到公共用例库',
batch_link_demand: '批量关联需求',
public_warning: '未开启公共用例库配置',
generate_dependencies: '生成依赖关系',
generate_dependencies_warning: '为了更好的体验,建议勾选一百条以下的数据',
batch_unlink: '批量取消关联',
unlink: '取消关联',
project_name: '所属项目',
status: '评审结果',
status_prepare: '未开始',
status_running: '进行中',
status_finished: '已完成',
cancel_relevance_project: "取消项目关联会同时取消该项目下已关联的测试用例",
img_loading_fail: "图片加载失败",
pdf_loading_fail: "PDF加载失败",
upload_tip: "文件大小限制[0-500MB]",
add_attachment: "添加",
attachment: "附件",
upload_time: "上传时间",
total: "用例总数",
node_id: "节点ID",
node_path: "节点路径",
match_rule: "测试用例匹配规则",
import: {
import: "导入用例",
case_import: "导入测试用例",
case_export: "导出测试用例",
download_template: "下载模版",
click_upload: "点击上传",
upload_limit: "只能上传xls/xlsx文件且不超过100M",
upload_xmind: "支持文件类型:.xmind一次至多导入800 条用例",
upload_xmind_format: "上传文件只能是 .xmind 格式",
upload_limit_other_size: "上传文件大小不能超过",
upload_limit_count: "一次只能上传一个文件",
upload_limit_format: "上传文件只能是 xls、xlsx格式!",
upload_limit_size: "上传文件大小不能超过 100MB!",
success: "导入成功!",
importing: "导入中...",
excel_title: "表格文件",
xmind_title: "思维导图",
import_desc: "导入说明",
import_file: "上传文件",
ignore_error: "忽略错误",
continue_upload: "继续上传",
import_create: "导入新建",
import_update: "导入更新",
import_tip1: "项目设置中“测试用例自定义ID” 开关开启时ID为必填项",
import_tip2: "导入更新时ID为必填项",
import_file_tips: "请先上传文件!",
import_format: "导入格式",
select_import_field: "选择导出字段",
select_import_all_field: "选择所有字段",
base_field: "基础字段",
custom_field: "自定义字段",
other_field: "其他字段",
other_field_tip: "注意:其他字段,导出后不支持导入",
},
export: {
export: "导出用例",
export_tip: "请切换成用例列表勾选用例导出!"
},
case_desc: "用例描述",
passing_rate: '用例通过率',
version: "版本",
sync_to_new_version: "复制以下信息到新版本",
exists_multiple_prerequisite_node: "下存在多个前置条件",
exists_multiple_remark_node: "下存在多个备注",
},
plan: {
test_plan: "测试计划",
test_plan_id: '测试计划Id',
create_plan: "创建测试计划",
edit_plan: "编辑测试计划",
plan_name: "计划名称",
plan_project: "所属项目",
related_project: "关联项目",
related_tip: "关联项目后可以添加关联项目下的测试用例到测试计划列表",
plan_stage: "测试阶段",
follow_people: "关注人",
plan_status: "状态",
smoke_test: "冒烟测试",
functional_test: "功能测试",
regression_test: "回归测试",
integration_testing: "集成测试",
system_test: "系统测试",
version_validation: "版本验证",
plan_principal: "责任人",
input_plan_name: "请输入测试计划名称",
input_plan_principal: "请选择负责人",
input_plan_project: "请选择所属项目",
input_related_project: "请选择关联项目",
input_plan_stage: "请选择测试阶段",
plan_status_prepare: "未开始",
plan_status_running: "进行中",
plan_status_finished: "已结束",
plan_status_completed: "已完成",
plan_status_archived: "已归档",
plan_status_trash: "废弃",
planned_start_time: "计划开始",
planned_end_time: "计划结束",
actual_start_time: "实际开始",
actual_end_time: "实际结束",
plan_delete_confirm: "将删除该测试计划下所有用例,确认删除测试计划: ",
plan_delete_tip: "该测试计划正在进行中,请确认再删除!",
plan_delete: "删除计划",
api_case: "接口测试用例",
scenario_case: "场景测试用例",
execute_result: "执行结果",
execute_time: '执行时间',
is_api_case_executing: "是否执行接口用例",
is_scenario_executing: '是否执行场景',
is_performance_executing: '是否执行性能',
test_plan_test_case_count: "功能用例数",
test_plan_api_case_count: "接口用例数",
test_plan_api_scenario_count: "场景用例数",
test_plan_ui_scenario_count: "UI 场景用例数",
test_plan_load_case_count: "性能用例数",
test_plan_component_case_count: "步骤用例数",
data_name: "数据名称",
test_plan_batch_switch: "批量开/关定时任务",
batch_update_schedule_enable: '更新{0}个测试计划的定时任务状态为',
batch_update_schedule_enable_alert: '注意:只能更新已设置了定时任务的测试计划',
next_run_time: '下次运行时间',
schedule_enabled: '已开启',
check_schedule_enabled: '您勾选的数据检测到有{0}条定时任务可以修改',
no_check_schedule_enabled: '您勾选的数据没有检测到定时任务',
load_case: {
case: "性能用例",
execution_status: "执行状态",
report: "报告",
view_report: "查看报告",
unlink_in_bulk: "批量取消关联",
batch_exec_cases: "批量执行用例",
exec: "正在执行....",
error: "用例执行错误,请单独调试该用例!",
report_not_found: "报告不存在",
content_empty: "内容为空",
}
},
demand: {
id: '需求ID',
name: '需求名称',
batch_relate: '批量关联需求',
relate_is_null_warn: '关联需求不能为空!',
relate_name_is_null_warn: '需求名称不能为空!',
third_platform_demand: "三方平台需求",
other_demand: "其他需求"
},
step_model: '步骤模型',
review: {
test_review: "用例评审",
create_review: "创建用例评审",
edit_review: "编辑用例评审",
review_name: "评审名称",
reviewer: "评审人",
review_project: "所属项目",
related_project: "关联项目",
related_tip: "关联项目后可以添加关联项目下的测试用例到评审列表",
review_creator: "发起人",
review_follow_people: "关注人",
review_status: "状态",
end_time: "截止时间",
delete: "删除评审",
input_review_name: "请输入评审名称",
input_review_project: "请选择所属项目",
input_reviewer: "请选择评审人",
no_link_case: "没有关联用例!",
pass: "通过",
un_pass: "未通过",
prepare: '未评审',
comment: "评论",
my_review: "我的评审",
my_create: "我创建的评审",
reviewed_by_me: "待我评审",
creator: "创建人",
done: "已评用例",
result_distribution: "结果分布",
deadline_cannot_early_tips: "截止时间不能早于当前时间!",
},
comment: {
no_comment: "暂无评论",
send_comment: "发表评论Ctrl+Enter发送",
send: "确定",
description_is_null: "评论内容不能为空!",
send_success: "评论成功!",
cannot_edit: "无法编辑此评论!",
cannot_delete: "无法删除此评论!",
submit_description: "请先提交评论!",
},
review_view: {
review: "评审",
all_case: "全部用例",
start_review: "开始评审",
relevance_case: "关联用例",
last_page: "已经到底了!",
execute_result: "评审结果",
},
module: {
id: '模块ID',
search: "搜索模块",
rename: "重命名",
add_submodule: "添加子模块",
add_module: "添加模块",
name: "模块名称",
delete_confirm: "确认删除模块: ",
delete_batch_confirm: "确认批量删除勾选的场景步骤?",
delete_all_resource: "以及模块下所有子模块和测试用例",
module: "模块",
title: "标题",
status: "状态",
describe: "描述",
current_owner: "处理人",
creation_time: "创建时间",
project_name: "所属项目"
},
home: {
recent_test: "最近测试",
my_plan: "我的计划",
test_rate: "测试进度",
tested_case: "已测用例",
review_progress: "评审进度",
case_count: "用例数量统计",
relevance_case: "关联用例数量统计",
case_maintenance: "用例责任人分布",
bug_count: "遗留缺陷统计",
case_review: "用例评审",
review_rate: "评审率",
coverage: "覆盖率",
function_case_count: "功能用例数",
relevance_case_count: "关联用例数",
serial_number: "序号",
test_plan_name: "测试计划名称",
case_size: "用例数",
bug_size: "缺陷数",
passing_rate: "通过率",
percentage: "占比"
},
plan_view: {
plan: "计划",
relevance_test_case: "关联测试用例",
cancel_all_relevance: "取消全部关联",
executor: "执行人",
executor_match_rule: "执行者匹配规则",
execute_result: "执行结果",
pass: "通过",
not_pass: "不通过",
failure: "失败",
blocking: "阻塞",
stop: "停止",
skip: "跳过",
actual_result: "实际结果",
step_result: "步骤执行结果",
my_case: "我的用例",
all_case: "全部用例",
pre_case: "上一条用例",
next_case: "下一条用例",
change_execution_results: "更改执行结果",
change_executor: "更改执行人",
select_executor: "请选择执行人",
select_execute_result: "选择执行结果",
cancel_relevance: "取消用例关联",
confirm_cancel_relevance: "确认取消关联",
select_manipulate: "请选择需要操作的数据",
select_template: "选择模版",
step: "步骤",
submit_issues: "提缺陷",
operate_step: "操作步骤",
edit_component: "编辑组件",
component: "组件",
base_info: "基础信息",
mock_info: "Mock服务",
test_result: "测试结果",
result_distribution: "测试结果分布",
custom_component: "自定义模块",
defect_list: "缺陷列表",
create_report: "创建测试报告",
view_report: "查看测试报告",
component_library: "组件库",
component_library_tip: "拖拽组件库中组件,添加至右侧,预览报告效果,每个系统组件只能添加一个。",
delete_component_tip: "请至少保留一个组件",
input_template_name: "输入模版名称",
template_special_characters: '模版名称不支持特殊字符',
case_count: "用例数",
issues_count: "缺陷数",
result_statistics: "测试结果统计",
result_statistics_chart: "测试结果统计图",
create_template: "新建模版",
report_template: "测试报告模版",
test_detail: "测试详情",
failure_case: "失败用例",
export_report: "导出报告",
share_report: "分享报告",
no_case_relevance: "没有关联用例",
automatically_update_status: "自动更新状态",
automatically_update_status_tip: "当功能用例关联的接口或性能用例在测试计划执行后,自动更新功能用例的状态",
allow_associated_repetitive_cases: "允许关联重复用例",
allow_associated_repetitive_cases_tip: "是否允许同一个测试计划中多次关联相同用例",
performance_case_count: "性能测试用例数",
running: "运行中",
please_choose_test_case: "请选择测试用例!",
execute_tip: "步骤执行结果中含有 失败 结果,无法标记该用例为 通过 状态!"
},
issue: {
issue: "缺陷",
issue_management: "缺陷管理",
platform_status: "平台状态",
issue_resource: "缺陷来源",
create_issue: "创建缺陷",
add_issue: "添加缺陷",
issue_list: "缺陷列表",
search_name: "根据标题搜索",
platform_tip: "在系统设置-工作空间-服务集成中集成缺陷管理平台可以提交缺陷到指定缺陷管理平台",
input_title: "请输入标题",
id: "缺陷ID",
title: "缺陷标题",
description: "缺陷描述",
status: "缺陷状态",
issue_project: "所属项目",
platform: "平台",
operate: "操作",
close: "关闭缺陷",
delete: "删除缺陷",
title_description_required: "标题和描述必填",
close_success: "关闭成功",
delete_warning: "解除会影响测试计划相关统计,是否确认",
preview: "预览",
status_new: '新建',
status_resolved: '已解决',
status_closed: '已关闭',
status_active: '激活',
status_delete: '删除',
status_in_progress: '接受/处理',
status_rejected: '拒绝',
status_upcoming: '待办',
status_reopened: '重新打开',
please_choose_current_owner: "请选择处理人",
tapd_current_owner: "Tapd 处理人",
zentao_bug_build: "禅道 影响版本",
zentao_bug_assigned: "禅道 处理人",
third_party_integrated: "集成第三方平台",
use_third_party: "使用 Jira 缺陷模板",
update_third_party_bugs: "更新第三方平台的缺陷",
sync_bugs: "同步缺陷",
sync_complete: "同步完成",
issue_sync_tip: "当前项目正在同步缺陷, 请稍等!",
save_before_open_comment: "请先保存缺陷再添加评论",
delete_tip: "确认删除缺陷:",
check_id_exist: "检查",
save_project_first: "请先保存项目",
tapd_status_new: "新",
tapd_status_in_progress: "接受/处理",
tapd_status_reopened: "重新打开",
tapd_status_rejected: "已拒绝",
tapd_status_verified: "已验证",
tapd_status_closed: "已关闭",
tapd_status_resolved: "已解决",
please_choose_platform_status: "请选择平台状态"
},
report: {
name: "测试计划报告",
list: {
name: "名称",
test_plan: "测试计划名称",
creator: "创建人",
create_time: "创建时间",
trigger_mode: "触发方式",
run_time: "运行耗时(s)",
pass_rate: "成功率",
status: "状态",
operation: "操作",
},
trigger_mode: {
manual: "手动触发",
automation: "自动触发",
},
overview: "概览",
testing_time: "测试时间",
total_number_tests: "测试总数",
exacutive_rate: "执行率",
exacutive_rate_tip: "执行过的用例/所有用例 * 100%",
passing_rate: "通过率",
passing_rate_tip: "执行通过用例/所有用例 * 100%",
content: "目录",
report_summary: "报告总结",
analysis_functional: "功能用例统计分析",
analysis_api: "接口用例统计分析",
analysis_ui: "UI 用例统计分析",
analysis_load: "性能用例统计分析",
valid_for_24_hours: "24小时有效",
configuration: "配置",
share: "分享",
template_configuration: "模板配置",
test_result: "测试结果",
fail_case: "失败用例",
issue_list: "缺陷列表",
all_case: "所有用例",
},
reporter: '报告人',
lastmodify: '最后更改'
};

View File

@ -0,0 +1,514 @@
export default {
sync_add_api_load: '同步添加關聯的接口和性能測試',
next: '下一條',
total_size: '共 {0} 條',
related_requirements: '關聯需求',
please_related_requirements: '請選擇要關聯的需求',
please_select_the_test_to_associate: "請選擇需要關聯的測試",
person_responsible: "責任人",
test_track: "測試跟蹤",
planning_execution: "規劃&執行",
confirm: "確 定",
cancel: "取 消",
project: "項目",
save: "保 存",
return: "返 回",
length_less_than: "長度必須小於",
recent_plan: "我最近的計劃",
recent_case: "我最近的用例",
recent_review: "我最近的評審",
pass_rate: "通過率",
execution_result: ": 請選擇執行結果",
actual_result: ": 實際結果為空",
cancel_relevance_success: "取消關聯成功",
switch_project: "切換項目",
functional_test_case: "功能測試用例",
api_test_case: "接口測試用例",
ui_test_case: "UI 測試用例",
performance_test_case: "性能測試用例",
scenario_test_case: "場景測試用例",
ui_scenario_test_case: "UI 測試用例",
report_statistics: "報告統計",
sort: '種類',
automatic_status_update: "自動狀態更新",
case: {
list: "列錶",
minder: "腦圖",
step_info: "步驟信息",
other_info: "其他信息",
step_describe: "步驟描述",
step_describe_tip: "適用於需要每一個步驟進行測試的場景,有明確的測試步驟、預期結果",
text_describe: "文本描述",
text_describe_tip: "使用於簡單的測試場景,沒有明確的測試步驟",
change_type: "更改類型",
minder_create_tip: "失敗, 無法在腦圖創建其父模塊",
minder_tem_node_tip: "無法在臨時節點{0}下創建用例",
minder_is_module_tip: "{0}是模塊,不能修改為用例",
minder_not_module_tip: "模塊{0},不能創建在非模塊節點下",
minder_all_module_tip: "全部用例為虛擬模塊,請在其他模塊創建用例",
minder_issue_delete_tip: "取消缺陷關聯成功",
minder_save_confirm_title: '請保存腦圖',
minder_save_confirm_tip: '腦圖未保存,確認保存腦圖嗎?',
minder_import_save_confirm_tip: '導入成功後會刷新腦圖,確認保存腦圖嗎?',
check_select: "請勾選用例",
export_all_cases: '確定要導出全部用例嗎?',
input_test_case: '請輸入關聯用例名稱',
test_name: '測試名稱',
other: "--其他--",
test_case: "功能用例",
move: "移動用例",
case_list: "用例列錶",
create_case: "創建用例",
edit_case: "編輯用例",
view_case: "查看用例",
no_project: "該工作空間下無項目,請先創建項目",
priority: "用例等級",
type: "類型",
method: "測試方式",
auto: "自動",
manual: "手動",
create: "新建用例",
case_type: "用例類型",
name: "用例名稱",
module: "所屬模塊",
project: '所屬項目',
maintainer: "維護人",
steps: "執行步驟",
number: "編號",
prerequisite: "前置條件",
step_desc: "用例步驟",
step_model: "編輯模式",
expected_results: "預期結果",
input_name: "請輸入名稱",
input_module: "請選擇模塊",
input_maintainer: "請選擇維護人",
input_priority: "請選擇用例等級",
input_type: "請選擇用例類型",
input_method: "請選擇測試方式",
input_prerequisite: "請輸入前置條件",
input_demand_name: "請輸入需求ID或名稱",
delete_confirm: "確認刪除測試用例",
delete: "刪除用例",
save_create_continue: "保存併繼續創建",
save_add_public: "保存併添加到公共用例庫",
please_create_project: "暫無項目,請先創建項目",
create_module_first: "請先新建模塊",
relate_test: "關聯測試",
relate_issue: "關聯缺陷",
demand_name_id: "需求ID/名稱",
please_select_relate_test: "請選擇要關聯的測試",
relate_test_not_find: '關聯的測試不存在,請檢查用例',
other_relate_test_not_find: '關聯的測試名,請前往第三方平臺執行',
batch_handle: '批量處理 (選中{0}項)',
batch_update: '更新{0}個用例的屬性',
select_catalog: '請選擇用例目錄',
updated_attr_value: '更新後屬性值為',
batch_operate: '批量操作',
please_select_attr: '請選擇屬性',
please_select_attr_value: '請選擇屬性對應的值',
batch_edit_case: '批量編輯',
batch_move_case: '批量移動',
batch_delete_case: '批量刪除',
batch_copy: '批量復制',
batch_add_public: '批量添加到公共用例庫',
batch_link_demand: '批量關聯需求',
public_warning: '未開啟公共用例庫配置',
generate_dependencies: '生成依賴關繫',
generate_dependencies_warning: '為了更好的體驗,建議勾選一百條以下的數據',
batch_unlink: '批量取消關聯',
unlink: '取消關聯',
project_name: '所屬項目',
status: '評審結果',
status_prepare: '未開始',
status_running: '進行中',
status_finished: '已完成',
cancel_relevance_project: "取消項目關聯會同時取消該項目下已關聯的測試用例",
img_loading_fail: "圖片加載失敗",
pdf_loading_fail: "PDF加載失敗",
upload_tip: "文件大小限制[0-500MB]",
add_attachment: "添加",
attachment: "附件",
upload_time: "上傳時間",
total: "用例總數",
node_id: "節點ID",
node_path: "節點路徑",
match_rule: "測試用例匹配規則",
import: {
import: "導入用例",
case_import: "導入測試用例",
case_export: "導出測試用例",
download_template: "下載模版",
click_upload: "點擊上傳",
upload_limit: "只能上傳xls/xlsx文件且不超過100M",
upload_xmind: "支持文件類型:.xmind一次至多導入800 條用例",
upload_xmind_format: "上傳文件只能是 .xmind 格式",
upload_limit_other_size: "上傳文件大小不能超過",
upload_limit_count: "一次只能上傳一個文件",
upload_limit_format: "上傳文件只能是 xls、xlsx格式!",
upload_limit_size: "上傳文件大小不能超過 100MB!",
success: "導入成功!",
importing: "導入中...",
excel_title: "錶格文件",
xmind_title: "思維導圖",
import_desc: "導入說明",
import_file: "上傳文件",
ignore_error: "忽略錯誤",
continue_upload: "繼續上傳",
import_create: "導入新建",
import_update: "導入更新",
import_tip1: "項目設置中“測試用例自定義ID” 開關開啟時ID為必填項",
import_tip2: "導入更新時ID為必填項",
import_file_tips: "請先上傳文件!",
import_format: "導入格式",
select_import_field: "選擇導出字段",
select_import_all_field: "選擇所有字段",
base_field: "基礎字段",
custom_field: "自定義字段",
other_field: "其他字段",
other_field_tip: "註意:其他字段,導出後不支持導入",
},
export: {
export: "導出用例",
export_tip: "請切換成用例列錶勾選用例導出!"
},
case_desc: "用例描述",
passing_rate: '用例通過率',
version: "版本",
sync_to_new_version: "復制以下信息到新版本",
exists_multiple_prerequisite_node: "下存在多個前置條件",
exists_multiple_remark_node: "下存在多個備註",
},
plan: {
test_plan: "測試計劃",
test_plan_id: '測試計劃Id',
create_plan: "創建測試計劃",
edit_plan: "編輯測試計劃",
plan_name: "計劃名稱",
plan_project: "所屬項目",
related_project: "關聯項目",
related_tip: "關聯項目後可以添加關聯項目下的測試用例到測試計劃列錶",
plan_stage: "測試階段",
follow_people: "關註人",
plan_status: "狀態",
smoke_test: "冒煙測試",
functional_test: "功能測試",
regression_test: "回歸測試",
integration_testing: "集成測試",
system_test: "繫統測試",
version_validation: "版本驗證",
plan_principal: "責任人",
input_plan_name: "請輸入測試計劃名稱",
input_plan_principal: "請選擇負責人",
input_plan_project: "請選擇所屬項目",
input_related_project: "請選擇關聯項目",
input_plan_stage: "請選擇測試階段",
plan_status_prepare: "未開始",
plan_status_running: "進行中",
plan_status_finished: "已結束",
plan_status_completed: "已完成",
plan_status_archived: "已歸檔",
plan_status_trash: "廢棄",
planned_start_time: "計劃開始",
planned_end_time: "計劃結束",
actual_start_time: "實際開始",
actual_end_time: "實際結束",
plan_delete_confirm: "將刪除該測試計劃下所有用例,確認刪除測試計劃: ",
plan_delete_tip: "該測試計劃正在進行中,請確認再刪除!",
plan_delete: "刪除計劃",
api_case: "接口測試用例",
scenario_case: "場景測試用例",
execute_result: "執行結果",
execute_time: '執行時間',
is_api_case_executing: "是否執行接口用例",
is_scenario_executing: '是否執行場景',
is_performance_executing: '是否執行性能',
test_plan_test_case_count: "功能用例數",
test_plan_api_case_count: "接口用例數",
test_plan_api_scenario_count: "場景用例數",
test_plan_ui_scenario_count: "UI 場景用例數",
test_plan_load_case_count: "性能用例數",
test_plan_component_case_count: "步驟用例數",
data_name: "數據名稱",
test_plan_batch_switch: "批量開/關定時任務",
batch_update_schedule_enable: '更新{0}個測試計劃的定時任務狀態為',
batch_update_schedule_enable_alert: '註意:只能更新已設置了定時任務的測試計劃',
next_run_time: '下次運行時間',
schedule_enabled: '已開啟',
check_schedule_enabled: '您勾選的數據檢測到有{0}條定時任務可以修改',
no_check_schedule_enabled: '您勾選的數據沒有檢測到定時任務',
load_case: {
case: "性能用例",
execution_status: "執行狀態",
report: "報告",
view_report: "查看報告",
unlink_in_bulk: "批量取消關聯",
batch_exec_cases: "批量執行用例",
exec: "正在執行....",
error: "用例執行錯誤,請單獨調試該用例!",
report_not_found: "報告不存在",
content_empty: "內容為空",
}
},
demand: {
id: '需求ID',
name: '需求名稱',
batch_relate: '批量關聯需求',
relate_is_null_warn: '關聯需求不能為空!',
relate_name_is_null_warn: '需求名稱不能為空!',
third_platform_demand: "三方平臺需求",
other_demand: "其他需求"
},
step_model: '步驟模型',
review: {
test_review: "用例評審",
create_review: "創建用例評審",
edit_review: "編輯用例評審",
review_name: "評審名稱",
reviewer: "評審人",
review_project: "所屬項目",
related_project: "關聯項目",
related_tip: "關聯項目後可以添加關聯項目下的測試用例到評審列錶",
review_creator: "發起人",
review_follow_people: "關註人",
review_status: "狀態",
end_time: "截止時間",
delete: "刪除評審",
input_review_name: "請輸入評審名稱",
input_review_project: "請選擇所屬項目",
input_reviewer: "請選擇評審人",
no_link_case: "沒有關聯用例!",
pass: "通過",
un_pass: "未通過",
prepare: '未評審',
comment: "評論",
my_review: "我的評審",
my_create: "我創建的評審",
reviewed_by_me: "待我評審",
creator: "創建人",
done: "已評用例",
result_distribution: "結果分佈",
deadline_cannot_early_tips: "截止時間不能早於當前時間!",
},
comment: {
no_comment: "暫無評論",
send_comment: "發錶評論Ctrl+Enter發送",
send: "確定",
description_is_null: "評論內容不能為空!",
send_success: "評論成功!",
cannot_edit: "無法編輯此評論!",
cannot_delete: "無法刪除此評論!",
submit_description: "請先提交評論!",
},
review_view: {
review: "評審",
all_case: "全部用例",
start_review: "開始評審",
relevance_case: "關聯用例",
last_page: "已經到底了!",
execute_result: "評審結果",
},
module: {
id: '模塊ID',
search: "搜索模塊",
rename: "重命名",
add_submodule: "添加子模塊",
add_module: "添加模塊",
name: "模塊名稱",
delete_confirm: "確認刪除模塊: ",
delete_batch_confirm: "確認批量刪除勾選的場景步驟?",
delete_all_resource: "以及模塊下所有子模塊和測試用例",
module: "模塊",
title: "標題",
status: "狀態",
describe: "描述",
current_owner: "處理人",
creation_time: "創建時間",
project_name: "所屬項目"
},
home: {
recent_test: "最近測試",
my_plan: "我的計劃",
test_rate: "測試進度",
tested_case: "已測用例",
review_progress: "評審進度",
case_count: "用例數量統計",
relevance_case: "關聯用例數量統計",
case_maintenance: "用例責任人分佈",
bug_count: "遺留缺陷統計",
case_review: "用例評審",
review_rate: "評審率",
coverage: "覆蓋率",
function_case_count: "功能用例數",
relevance_case_count: "關聯用例數",
serial_number: "序號",
test_plan_name: "測試計劃名稱",
case_size: "用例數",
bug_size: "缺陷數",
passing_rate: "通過率",
percentage: "佔比"
},
plan_view: {
plan: "計劃",
relevance_test_case: "關聯測試用例",
cancel_all_relevance: "取消全部關聯",
executor: "執行人",
executor_match_rule: "執行者匹配規則",
execute_result: "執行結果",
pass: "通過",
not_pass: "不通過",
failure: "失敗",
blocking: "阻塞",
stop: "停止",
skip: "跳過",
actual_result: "實際結果",
step_result: "步驟執行結果",
my_case: "我的用例",
all_case: "全部用例",
pre_case: "上一條用例",
next_case: "下一條用例",
change_execution_results: "更改執行結果",
change_executor: "更改執行人",
select_executor: "請選擇執行人",
select_execute_result: "選擇執行結果",
cancel_relevance: "取消用例關聯",
confirm_cancel_relevance: "確認取消關聯",
select_manipulate: "請選擇需要操作的數據",
select_template: "選擇模版",
step: "步驟",
submit_issues: "提缺陷",
operate_step: "操作步驟",
edit_component: "編輯組件",
component: "組件",
base_info: "基礎信息",
mock_info: "Mock服務",
test_result: "測試結果",
result_distribution: "測試結果分佈",
custom_component: "自定義模塊",
defect_list: "缺陷列錶",
create_report: "創建測試報告",
view_report: "查看測試報告",
component_library: "組件庫",
component_library_tip: "拖拽組件庫中組件,添加至右側,預覽報告效果,每個繫統組件只能添加一個。",
delete_component_tip: "請至少保留一個組件",
input_template_name: "輸入模版名稱",
template_special_characters: '模版名稱不支持特殊字符',
case_count: "用例數",
issues_count: "缺陷數",
result_statistics: "測試結果統計",
result_statistics_chart: "測試結果統計圖",
create_template: "新建模版",
report_template: "測試報告模版",
test_detail: "測試詳情",
failure_case: "失敗用例",
export_report: "導出報告",
share_report: "分享報告",
no_case_relevance: "沒有關聯用例",
automatically_update_status: "自動更新狀態",
automatically_update_status_tip: "當功能用例關聯的接口或性能用例在測試計劃執行後,自動更新功能用例的狀態",
allow_associated_repetitive_cases: "允許關聯重復用例",
allow_associated_repetitive_cases_tip: "是否允許同一個測試計劃中多次關聯相同用例",
performance_case_count: "性能測試用例數",
running: "運行中",
please_choose_test_case: "請選擇測試用例!",
execute_tip: "步驟執行結果中含有 失敗 結果,無法標記該用例為 通過 狀態!"
},
issue: {
issue: "缺陷",
issue_management: "缺陷管理",
platform_status: "平臺狀態",
issue_resource: "缺陷來源",
create_issue: "創建缺陷",
add_issue: "添加缺陷",
issue_list: "缺陷列錶",
search_name: "根據標題搜索",
platform_tip: "在繫統設置-工作空間-服務集成中集成缺陷管理平臺可以提交缺陷到指定缺陷管理平臺",
input_title: "請輸入標題",
id: "缺陷ID",
title: "缺陷標題",
description: "缺陷描述",
status: "缺陷狀態",
issue_project: "所屬項目",
platform: "平臺",
operate: "操作",
close: "關閉缺陷",
delete: "刪除缺陷",
title_description_required: "標題和描述必填",
close_success: "關閉成功",
delete_warning: "解除會影響測試計劃相關統計,是否確認",
preview: "預覽",
status_new: '新建',
status_resolved: '已解決',
status_closed: '已關閉',
status_active: '激活',
status_delete: '刪除',
status_in_progress: '接受/處理',
status_rejected: '拒絕',
status_upcoming: '待辦',
status_reopened: '重新打開',
please_choose_current_owner: "請選擇處理人",
tapd_current_owner: "Tapd 處理人",
zentao_bug_build: "禪道 影響版本",
zentao_bug_assigned: "禪道 處理人",
third_party_integrated: "集成第三方平臺",
use_third_party: "使用 Jira 缺陷模闆",
update_third_party_bugs: "更新第三方平臺的缺陷",
sync_bugs: "同步缺陷",
sync_complete: "同步完成",
issue_sync_tip: "當前項目正在同步缺陷, 請稍等!",
save_before_open_comment: "請先保存缺陷再添加評論",
delete_tip: "確認刪除缺陷:",
check_id_exist: "檢查",
save_project_first: "請先保存項目",
tapd_status_new: "新",
tapd_status_in_progress: "接受/處理",
tapd_status_reopened: "重新打開",
tapd_status_rejected: "已拒絕",
tapd_status_verified: "已驗證",
tapd_status_closed: "已關閉",
tapd_status_resolved: "已解決",
please_choose_platform_status: "請選擇平臺狀態"
},
report: {
name: "測試計劃報告",
list: {
name: "名稱",
test_plan: "測試計劃名稱",
creator: "創建人",
create_time: "創建時間",
trigger_mode: "觸發方式",
run_time: "運行耗時(s)",
pass_rate: "成功率",
status: "狀態",
operation: "操作",
},
trigger_mode: {
manual: "手動觸發",
automation: "自動觸發",
},
overview: "概覽",
testing_time: "測試時間",
total_number_tests: "測試總數",
exacutive_rate: "執行率",
exacutive_rate_tip: "執行過的用例/所有用例 * 100%",
passing_rate: "通過率",
passing_rate_tip: "執行通過用例/所有用例 * 100%",
content: "目錄",
report_summary: "報告總結",
analysis_functional: "功能用例統計分析",
analysis_api: "接口用例統計分析",
analysis_ui: "UI 用例統計分析",
analysis_load: "性能用例統計分析",
valid_for_24_hours: "24小時有效",
configuration: "配置",
share: "分享",
template_configuration: "模闆配置",
test_result: "測試結果",
fail_case: "失敗用例",
issue_list: "缺陷列錶",
all_case: "所有用例",
},
reporter: '報告人',
lastmodify: '最後更改'
};

View File

@ -1,3 +1,5 @@
import test_track from "./track/zh-CN";
export default { export default {
commons: { commons: {
project_permission: '请先添加该项目权限', project_permission: '请先添加该项目权限',
@ -94,6 +96,7 @@ export default {
input_password: '请输入密码', input_password: '请输入密码',
test: '测试', test: '测试',
create_time: '创建时间', create_time: '创建时间',
creator: '创建人',
update_user_id: '更新人ID', update_user_id: '更新人ID',
update_time: '更新时间', update_time: '更新时间',
delete_time: '删除时间', delete_time: '删除时间',
@ -2071,512 +2074,7 @@ export default {
please_search: "请搜索", please_search: "请搜索",
date: "日期" date: "日期"
}, },
test_track: { test_track,
sync_add_api_load: '同步添加关联的接口和性能测试',
next: '下一条',
total_size: '共 {0} 条',
related_requirements: '关联需求',
please_related_requirements: '请选择要关联的需求',
please_select_the_test_to_associate: "请选择需要关联的测试",
person_responsible: "责任人",
test_track: "测试跟踪",
planning_execution: "规划&执行",
confirm: "确 定",
cancel: "取 消",
project: "项目",
save: "保 存",
return: "返 回",
length_less_than: "长度必须小于",
recent_plan: "我最近的计划",
recent_case: "我最近的用例",
recent_review: "我最近的评审",
pass_rate: "通过率",
execution_result: ": 请选择执行结果",
actual_result: ": 实际结果为空",
cancel_relevance_success: "取消关联成功",
switch_project: "切换项目",
functional_test_case: "功能测试用例",
api_test_case: "接口测试用例",
ui_test_case: "UI 测试用例",
performance_test_case: "性能测试用例",
scenario_test_case: "场景测试用例",
ui_scenario_test_case: "UI 测试用例",
report_statistics: "报告统计",
sort: '种类',
automatic_status_update: "自动状态更新",
case: {
list: "列表",
minder: "脑图",
step_info: "步骤信息",
other_info: "其他信息",
step_describe: "步骤描述",
step_describe_tip: "适用于需要每一个步骤进行测试的场景,有明确的测试步骤、预期结果",
text_describe: "文本描述",
text_describe_tip: "使用于简单的测试场景,没有明确的测试步骤",
change_type: "更改类型",
minder_create_tip: "失败, 无法在脑图创建其父模块",
minder_tem_node_tip: "无法在临时节点{0}下创建用例",
minder_is_module_tip: "{0}是模块,不能修改为用例",
minder_not_module_tip: "模块{0},不能创建在非模块节点下",
minder_all_module_tip: "全部用例为虚拟模块,请在其他模块创建用例",
minder_issue_delete_tip: "取消缺陷关联成功",
minder_save_confirm_title: '请保存脑图',
minder_save_confirm_tip: '脑图未保存,确认保存脑图吗?',
minder_import_save_confirm_tip: '导入成功后会刷新脑图,确认保存脑图吗?',
check_select: "请勾选用例",
export_all_cases: '确定要导出全部用例吗?',
input_test_case: '请输入关联用例名称',
test_name: '测试名称',
other: "--其他--",
test_case: "功能用例",
move: "移动用例",
case_list: "用例列表",
create_case: "创建用例",
edit_case: "编辑用例",
view_case: "查看用例",
no_project: "该工作空间下无项目,请先创建项目",
priority: "用例等级",
type: "类型",
method: "测试方式",
auto: "自动",
manual: "手动",
create: "新建用例",
case_type: "用例类型",
name: "用例名称",
module: "所属模块",
project: '所属项目',
maintainer: "维护人",
steps: "执行步骤",
number: "编号",
prerequisite: "前置条件",
step_desc: "用例步骤",
expected_results: "预期结果",
input_name: "请输入名称",
input_module: "请选择模块",
input_maintainer: "请选择维护人",
input_priority: "请选择用例等级",
input_type: "请选择用例类型",
input_method: "请选择测试方式",
input_prerequisite: "请输入前置条件",
input_demand_name: "请输入需求ID或名称",
delete_confirm: "确认删除测试用例",
delete: "删除用例",
save_create_continue: "保存并继续创建",
save_add_public: "保存并添加到公共用例库",
please_create_project: "暂无项目,请先创建项目",
create_module_first: "请先新建模块",
relate_test: "关联测试",
relate_issue: "关联缺陷",
demand_name_id: "需求ID/名称",
please_select_relate_test: "请选择要关联的测试",
relate_test_not_find: '关联的测试不存在,请检查用例',
other_relate_test_not_find: '关联的测试名,请前往第三方平台执行',
batch_handle: '批量处理 (选中{0}项)',
batch_update: '更新{0}个用例的属性',
select_catalog: '请选择用例目录',
updated_attr_value: '更新后属性值为',
batch_operate: '批量操作',
please_select_attr: '请选择属性',
please_select_attr_value: '请选择属性对应的值',
batch_edit_case: '批量编辑',
batch_move_case: '批量移动',
batch_delete_case: '批量删除',
batch_copy: '批量复制',
batch_add_public: '批量添加到公共用例库',
batch_link_demand: '批量关联需求',
public_warning: '未开启公共用例库配置',
generate_dependencies: '生成依赖关系',
generate_dependencies_warning: '为了更好的体验,建议勾选一百条以下的数据',
batch_unlink: '批量取消关联',
unlink: '取消关联',
project_name: '所属项目',
status: '评审结果',
status_prepare: '未开始',
status_running: '进行中',
status_finished: '已完成',
cancel_relevance_project: "取消项目关联会同时取消该项目下已关联的测试用例",
img_loading_fail: "图片加载失败",
pdf_loading_fail: "PDF加载失败",
upload_tip: "文件大小限制[0-500MB]",
add_attachment: "添加",
attachment: "附件",
upload_time: "上传时间",
total: "用例总数",
node_id: "节点ID",
node_path: "节点路径",
match_rule: "测试用例匹配规则",
import: {
import: "导入用例",
case_import: "导入测试用例",
case_export: "导出测试用例",
download_template: "下载模版",
click_upload: "点击上传",
upload_limit: "只能上传xls/xlsx文件且不超过100M",
upload_xmind: "支持文件类型:.xmind一次至多导入800 条用例",
upload_xmind_format: "上传文件只能是 .xmind 格式",
upload_limit_other_size: "上传文件大小不能超过",
upload_limit_count: "一次只能上传一个文件",
upload_limit_format: "上传文件只能是 xls、xlsx格式!",
upload_limit_size: "上传文件大小不能超过 100MB!",
success: "导入成功!",
importing: "导入中...",
excel_title: "表格文件",
xmind_title: "思维导图",
import_desc: "导入说明",
import_file: "上传文件",
ignore_error: "忽略错误",
continue_upload: "继续上传",
import_create: "导入新建",
import_update: "导入更新",
import_tip1: "项目设置中“测试用例自定义ID” 开关开启时ID为必填项",
import_tip2: "导入更新时ID为必填项",
import_file_tips: "请先上传文件!",
},
export: {
export: "导出用例",
export_tip: "请切换成用例列表勾选用例导出!"
},
case_desc: "用例描述",
passing_rate: '用例通过率',
version: "版本",
sync_to_new_version: "复制以下信息到新版本",
exists_multiple_prerequisite_node: "下存在多个前置条件",
exists_multiple_remark_node: "下存在多个备注",
},
plan: {
test_plan: "测试计划",
test_plan_id: '测试计划Id',
create_plan: "创建测试计划",
edit_plan: "编辑测试计划",
plan_name: "计划名称",
plan_project: "所属项目",
related_project: "关联项目",
related_tip: "关联项目后可以添加关联项目下的测试用例到测试计划列表",
plan_stage: "测试阶段",
follow_people: "关注人",
plan_status: "状态",
smoke_test: "冒烟测试",
functional_test: "功能测试",
regression_test: "回归测试",
integration_testing: "集成测试",
system_test: "系统测试",
version_validation: "版本验证",
plan_principal: "责任人",
input_plan_name: "请输入测试计划名称",
input_plan_principal: "请选择负责人",
input_plan_project: "请选择所属项目",
input_related_project: "请选择关联项目",
input_plan_stage: "请选择测试阶段",
plan_status_prepare: "未开始",
plan_status_running: "进行中",
plan_status_finished: "已结束",
plan_status_completed: "已完成",
plan_status_archived: "已归档",
plan_status_trash: "废弃",
planned_start_time: "计划开始",
planned_end_time: "计划结束",
actual_start_time: "实际开始",
actual_end_time: "实际结束",
plan_delete_confirm: "将删除该测试计划下所有用例,确认删除测试计划: ",
plan_delete_tip: "该测试计划正在进行中,请确认再删除!",
plan_delete: "删除计划",
api_case: "接口测试用例",
scenario_case: "场景测试用例",
execute_result: "执行结果",
execute_time: '执行时间',
is_api_case_executing: "是否执行接口用例",
is_scenario_executing: '是否执行场景',
is_performance_executing: '是否执行性能',
test_plan_test_case_count: "功能用例数",
test_plan_api_case_count: "接口用例数",
test_plan_api_scenario_count: "场景用例数",
test_plan_ui_scenario_count: "UI 场景用例数",
test_plan_load_case_count: "性能用例数",
test_plan_component_case_count: "步骤用例数",
data_name: "数据名称",
test_plan_batch_switch: "批量开/关定时任务",
batch_update_schedule_enable: '更新{0}个测试计划的定时任务状态为',
batch_update_schedule_enable_alert: '注意:只能更新已设置了定时任务的测试计划',
next_run_time: '下次运行时间',
schedule_enabled: '已开启',
check_schedule_enabled: '您勾选的数据检测到有{0}条定时任务可以修改',
no_check_schedule_enabled: '您勾选的数据没有检测到定时任务',
load_case: {
case: "性能用例",
execution_status: "执行状态",
report: "报告",
view_report: "查看报告",
unlink_in_bulk: "批量取消关联",
batch_exec_cases: "批量执行用例",
exec: "正在执行....",
error: "用例执行错误,请单独调试该用例!",
report_not_found: "报告不存在",
content_empty: "内容为空",
}
},
demand: {
id: '需求ID',
name: '需求名称',
batch_relate: '批量关联需求',
relate_is_null_warn: '关联需求不能为空!',
relate_name_is_null_warn: '需求名称不能为空!',
third_platform_demand: "三方平台需求",
other_demand: "其他需求"
},
step_model: '步骤模型',
review: {
test_review: "用例评审",
create_review: "创建用例评审",
edit_review: "编辑用例评审",
review_name: "评审名称",
reviewer: "评审人",
review_project: "所属项目",
related_project: "关联项目",
related_tip: "关联项目后可以添加关联项目下的测试用例到评审列表",
review_creator: "发起人",
review_follow_people: "关注人",
review_status: "状态",
end_time: "截止时间",
delete: "删除评审",
input_review_name: "请输入评审名称",
input_review_project: "请选择所属项目",
input_reviewer: "请选择评审人",
no_link_case: "没有关联用例!",
pass: "通过",
un_pass: "未通过",
prepare: '未评审',
comment: "评论",
my_review: "我的评审",
my_create: "我创建的评审",
reviewed_by_me: "待我评审",
creator: "创建人",
done: "已评用例",
result_distribution: "结果分布",
deadline_cannot_early_tips: "截止时间不能早于当前时间!",
},
comment: {
no_comment: "暂无评论",
send_comment: "发表评论Ctrl+Enter发送",
send: "确定",
description_is_null: "评论内容不能为空!",
send_success: "评论成功!",
cannot_edit: "无法编辑此评论!",
cannot_delete: "无法删除此评论!",
submit_description: "请先提交评论!",
},
review_view: {
review: "评审",
all_case: "全部用例",
start_review: "开始评审",
relevance_case: "关联用例",
last_page: "已经到底了!",
execute_result: "评审结果",
},
module: {
id: '模块ID',
search: "搜索模块",
rename: "重命名",
add_submodule: "添加子模块",
add_module: "添加模块",
name: "模块名称",
delete_confirm: "确认删除模块: ",
delete_batch_confirm: "确认批量删除勾选的场景步骤?",
delete_all_resource: "以及模块下所有子模块和测试用例",
module: "模块",
title: "标题",
status: "状态",
describe: "描述",
current_owner: "处理人",
creation_time: "创建时间",
project_name: "所属项目"
},
home: {
recent_test: "最近测试",
my_plan: "我的计划",
test_rate: "测试进度",
tested_case: "已测用例",
review_progress: "评审进度",
case_count: "用例数量统计",
relevance_case: "关联用例数量统计",
case_maintenance: "用例责任人分布",
bug_count: "遗留缺陷统计",
case_review: "用例评审",
review_rate: "评审率",
coverage: "覆盖率",
function_case_count: "功能用例数",
relevance_case_count: "关联用例数",
serial_number: "序号",
test_plan_name: "测试计划名称",
case_size: "用例数",
bug_size: "缺陷数",
passing_rate: "通过率",
percentage: "占比"
},
plan_view: {
plan: "计划",
relevance_test_case: "关联测试用例",
cancel_all_relevance: "取消全部关联",
executor: "执行人",
executor_match_rule: "执行者匹配规则",
execute_result: "执行结果",
pass: "通过",
not_pass: "不通过",
failure: "失败",
blocking: "阻塞",
stop: "停止",
skip: "跳过",
actual_result: "实际结果",
step_result: "步骤执行结果",
my_case: "我的用例",
all_case: "全部用例",
pre_case: "上一条用例",
next_case: "下一条用例",
change_execution_results: "更改执行结果",
change_executor: "更改执行人",
select_executor: "请选择执行人",
select_execute_result: "选择执行结果",
cancel_relevance: "取消用例关联",
confirm_cancel_relevance: "确认取消关联",
select_manipulate: "请选择需要操作的数据",
select_template: "选择模版",
step: "步骤",
submit_issues: "提缺陷",
operate_step: "操作步骤",
edit_component: "编辑组件",
component: "组件",
base_info: "基础信息",
mock_info: "Mock服务",
test_result: "测试结果",
result_distribution: "测试结果分布",
custom_component: "自定义模块",
defect_list: "缺陷列表",
create_report: "创建测试报告",
view_report: "查看测试报告",
component_library: "组件库",
component_library_tip: "拖拽组件库中组件,添加至右侧,预览报告效果,每个系统组件只能添加一个。",
delete_component_tip: "请至少保留一个组件",
input_template_name: "输入模版名称",
template_special_characters: '模版名称不支持特殊字符',
case_count: "用例数",
issues_count: "缺陷数",
result_statistics: "测试结果统计",
result_statistics_chart: "测试结果统计图",
create_template: "新建模版",
report_template: "测试报告模版",
test_detail: "测试详情",
failure_case: "失败用例",
export_report: "导出报告",
share_report: "分享报告",
no_case_relevance: "没有关联用例",
automatically_update_status: "自动更新状态",
automatically_update_status_tip: "当功能用例关联的接口或性能用例在测试计划执行后,自动更新功能用例的状态",
allow_associated_repetitive_cases: "允许关联重复用例",
allow_associated_repetitive_cases_tip: "是否允许同一个测试计划中多次关联相同用例",
performance_case_count: "性能测试用例数",
running: "运行中",
please_choose_test_case: "请选择测试用例!",
execute_tip: "步骤执行结果中含有 失败 结果,无法标记该用例为 通过 状态!"
},
issue: {
issue: "缺陷",
issue_management: "缺陷管理",
platform_status: "平台状态",
issue_resource: "缺陷来源",
create_issue: "创建缺陷",
add_issue: "添加缺陷",
issue_list: "缺陷列表",
search_name: "根据标题搜索",
platform_tip: "在系统设置-工作空间-服务集成中集成缺陷管理平台可以提交缺陷到指定缺陷管理平台",
input_title: "请输入标题",
id: "缺陷ID",
title: "缺陷标题",
description: "缺陷描述",
status: "缺陷状态",
issue_project: "所属项目",
platform: "平台",
operate: "操作",
close: "关闭缺陷",
delete: "删除缺陷",
title_description_required: "标题和描述必填",
close_success: "关闭成功",
delete_warning: "解除会影响测试计划相关统计,是否确认",
preview: "预览",
status_new: '新建',
status_resolved: '已解决',
status_closed: '已关闭',
status_active: '激活',
status_delete: '删除',
status_in_progress: '接受/处理',
status_rejected: '拒绝',
status_upcoming: '待办',
status_reopened: '重新打开',
please_choose_current_owner: "请选择处理人",
tapd_current_owner: "Tapd 处理人",
zentao_bug_build: "禅道 影响版本",
zentao_bug_assigned: "禅道 处理人",
third_party_integrated: "集成第三方平台",
use_third_party: "使用 Jira 缺陷模板",
update_third_party_bugs: "更新第三方平台的缺陷",
sync_bugs: "同步缺陷",
sync_complete: "同步完成",
issue_sync_tip: "当前项目正在同步缺陷, 请稍等!",
save_before_open_comment: "请先保存缺陷再添加评论",
delete_tip: "确认删除缺陷:",
check_id_exist: "检查",
save_project_first: "请先保存项目",
tapd_status_new: "新",
tapd_status_in_progress: "接受/处理",
tapd_status_reopened: "重新打开",
tapd_status_rejected: "已拒绝",
tapd_status_verified: "已验证",
tapd_status_closed: "已关闭",
tapd_status_resolved: "已解决",
please_choose_platform_status: "请选择平台状态"
},
report: {
name: "测试计划报告",
list: {
name: "名称",
test_plan: "测试计划名称",
creator: "创建人",
create_time: "创建时间",
trigger_mode: "触发方式",
run_time: "运行耗时(s)",
pass_rate: "成功率",
status: "状态",
operation: "操作",
},
trigger_mode: {
manual: "手动触发",
automation: "自动触发",
},
overview: "概览",
testing_time: "测试时间",
total_number_tests: "测试总数",
exacutive_rate: "执行率",
exacutive_rate_tip: "执行过的用例/所有用例 * 100%",
passing_rate: "通过率",
passing_rate_tip: "执行通过用例/所有用例 * 100%",
content: "目录",
report_summary: "报告总结",
analysis_functional: "功能用例统计分析",
analysis_api: "接口用例统计分析",
analysis_ui: "UI 用例统计分析",
analysis_load: "性能用例统计分析",
valid_for_24_hours: "24小时有效",
configuration: "配置",
share: "分享",
template_configuration: "模板配置",
test_result: "测试结果",
fail_case: "失败用例",
issue_list: "缺陷列表",
all_case: "所有用例",
},
reporter: '报告人',
lastmodify: '最后更改'
},
test_resource_pool: { test_resource_pool: {
id: "测试资源池ID", id: "测试资源池ID",
type: '类型', type: '类型',

View File

@ -1,3 +1,5 @@
import test_track from "./track/zh-TW";
export default { export default {
commons: { commons: {
project_permission: '請先添加該項目權限', project_permission: '請先添加該項目權限',
@ -95,6 +97,7 @@ export default {
test: '測試', test: '測試',
create_time: '創建時間', create_time: '創建時間',
update_user_id: '更新人ID', update_user_id: '更新人ID',
creator: '創建人',
update_time: '更新時間', update_time: '更新時間',
delete_time: '刪除時間', delete_time: '刪除時間',
delete_user: '刪除人', delete_user: '刪除人',
@ -2068,509 +2071,7 @@ export default {
please_search: "請搜索", please_search: "請搜索",
date: "日期" date: "日期"
}, },
test_track: { test_track,
sync_add_api_load: '同步添加關聯的接口和性能測試',
next: '下一條',
total_size: '共 {0} 條',
related_requirements: '關聯需求',
please_related_requirements: '請選擇要關聯的需求',
please_select_the_test_to_associate: "請選擇需要關聯的測試",
person_responsible: "責任人",
test_track: "測試跟蹤",
planning_execution: "規劃&執行",
confirm: "確 定",
cancel: "取 消",
project: "項目",
save: "保 存",
return: "返 回",
length_less_than: "長度必須小於",
recent_plan: "我最近的計劃",
recent_case: "我最近的用例",
recent_review: "我最近的評審",
pass_rate: "通過率",
execution_result: ": 請選擇執行結果",
actual_result: ": 實際結果為空",
cancel_relevance_success: "取消關聯成功",
switch_project: "切換項目",
functional_test_case: "功能測試用例",
api_test_case: "接口測試用例",
ui_test_case: "UI 測試用例",
performance_test_case: "性能測試用例",
scenario_test_case: "場景測試用例",
ui_scenario_test_case: "UI 測試用例",
report_statistics: "報告統計",
sort: '種類',
automatic_status_update: "自動狀態更新",
case: {
list: "列表",
minder: "腦圖",
step_info: "步驟信息",
other_info: "其他信息",
step_describe: "步驟描述",
step_describe_tip: "適用於需要每一個步驟進行測試的場景,有明確的測試步驟、預期結果",
text_describe: "文本描述",
text_describe_tip: "使用於簡單的測試場景,沒有明確的測試步驟",
change_type: "更改類型",
minder_create_tip: "失敗, 無法在腦圖創建其父模塊",
minder_tem_node_tip: "無法在臨時節點{0}下創建用例",
minder_is_module_tip: "{0}是模塊,不能修改為用例",
minder_not_module_tip: "模塊{0},不能創建在非模塊節點下",
minder_all_module_tip: "全部用例為虛擬模塊,請在其他模塊創建用例",
minder_issue_delete_tip: "取消缺陷關聯成功",
minder_save_confirm_title: '請保存腦圖',
minder_save_confirm_tip: '腦圖未保存,確認保存腦圖嗎?',
minder_import_save_confirm_tip: '導入成功後會刷新腦圖,確認保存腦圖嗎?',
check_select: "請勾選用例",
export_all_cases: '確定要導出全部用例嗎?',
input_test_case: '請輸入關聯用例名稱',
test_name: '測試名稱',
other: "--其他--",
test_case: "功能用例",
move: "移動用例",
case_list: "用例列表",
create_case: "創建用例",
edit_case: "編輯用例",
view_case: "查看用例",
no_project: "該工作空間下無項目,請先創建項目",
priority: "用例等級",
type: "類型",
method: "測試方式",
auto: "自動",
manual: "手動",
create: "新建用例",
case_type: "用例類型",
name: "用例名稱",
module: "所屬模塊",
project: '所屬項目',
maintainer: "維護人",
steps: "執行步驟",
number: "編號",
prerequisite: "前置條件",
step_desc: "用例步驟",
expected_results: "預期結果",
input_name: "請輸入名稱",
input_module: "請選擇模塊",
input_maintainer: "請選擇維護人",
input_priority: "請選擇用例等級",
input_type: "請選擇用例類型",
input_method: "請選擇測試方式",
input_prerequisite: "請輸入前置條件",
input_demand_name: "請輸入需求ID或名稱",
delete_confirm: "確認刪除測試用例",
delete: "刪除用例",
save_create_continue: "保存並繼續創建",
save_add_public: "保存並添加到公共用例庫",
please_create_project: "暫無項目,請先創建項目",
create_module_first: "請先新建模塊",
relate_test: "關聯測試",
relate_issue: "關聯缺陷",
demand_name_id: "需求ID/名稱",
please_select_relate_test: "請選擇要關聯的測試",
relate_test_not_find: '關聯的測試不存在,請檢查用例',
other_relate_test_not_find: '關聯的測試名,請前往第三方平臺執行',
batch_handle: '批量處理 (選中{0}項)',
batch_update: '更新{0}個用例的屬性',
select_catalog: '請選擇用例目錄',
updated_attr_value: '更新後屬性值為',
batch_operate: '批量操作',
please_select_attr: '請選擇屬性',
please_select_attr_value: '請選擇屬性對應的值',
batch_edit_case: '批量編輯',
batch_move_case: '批量移動',
batch_delete_case: '批量刪除',
batch_copy: '批量復製',
batch_add_public: '批量添加到公共用例庫',
batch_link_demand: '批量關聯需求',
public_warning: '未開啟公共用例庫配置',
generate_dependencies: '生成依賴關系',
generate_dependencies_warning: '為了更好的體驗,建議勾選一百條以下的數據',
batch_unlink: '批量取消關聯',
unlink: '取消關聯',
project_name: '所屬項目',
status: '評審結果',
status_prepare: '未開始',
status_running: '進行中',
status_finished: '已完成',
cancel_relevance_project: "取消項目關聯會同時取消該項目下已關聯的測試用例",
img_loading_fail: "圖片加載失敗",
pdf_loading_fail: "PDF加載失敗",
upload_tip: "文件大小限制[0-500MB]",
add_attachment: "添加",
attachment: "附件",
upload_time: "上傳時間",
total: "用例總數",
node_id: "節點ID",
node_path: "節點路徑",
match_rule: "測試用例匹配規則",
import: {
import: "導入用例",
case_import: "導入測試用例",
case_export: "導出測試用例",
download_template: "下載模版",
click_upload: "點擊上傳",
upload_limit: "只能上傳xls/xlsx文件且不超過100M",
upload_xmind: "支持文件類型:.xmind一次至多導入800 條用例",
upload_xmind_format: "上傳文件只能是 .xmind 格式",
upload_limit_other_size: "上傳文件大小不能超過",
upload_limit_count: "一次只能上傳一個文件",
upload_limit_format: "上傳文件只能是 xls、xlsx格式!",
upload_limit_size: "上傳文件大小不能超過 100MB!",
success: "導入成功!",
importing: "導入中...",
excel_title: "表格文件",
xmind_title: "思維導圖",
import_desc: "導入說明",
import_file: "上傳文件",
ignore_error: "忽略錯誤",
continue_upload: "繼續上傳",
import_create: "導入新建",
import_update: "導入更新",
import_tip1: "項目設置中「測試用例自定義ID」 開關開啟時ID為必填項",
import_tip2: "導入更新時ID為必填項",
import_file_tips: "請先上傳文件!",
},
export: {
export: "導出用例",
export_tip: "請切換成用例列表勾選用例導出!"
},
case_desc: "用例描述",
passing_rate: '用例通過率',
sync_to_new_version: "復製以下信息到新版本",
exists_multiple_prerequisite_node: "下存在多個前置條件",
exists_multiple_remark_node: "下存在多個備註"
},
plan: {
test_plan: "測試計劃",
test_plan_id: '測試計劃Id',
create_plan: "創建測試計劃",
edit_plan: "編輯測試計劃",
plan_name: "計劃名稱",
plan_project: "所屬項目",
related_project: "關聯項目",
related_tip: "關聯項目後可以添加關聯項目下的測試用例到測試計劃列表",
plan_stage: "測試階段",
follow_people: "關註人",
plan_status: "當前狀態",
smoke_test: "冒煙測試",
functional_test: "功能測試",
regression_test: "回歸測試",
integration_testing: "集成測試",
system_test: "系統測試",
version_validation: "版本驗證",
plan_principal: "負責人",
input_plan_name: "請輸入測試計劃名稱",
input_plan_principal: "請選擇負責人",
input_plan_project: "請選擇所屬項目",
input_related_project: "請選擇關聯項目",
input_plan_stage: "請選擇測試階段",
plan_status_prepare: "未開始",
plan_status_running: "進行中",
plan_status_finished: "已結束",
plan_status_completed: "已完成",
plan_status_archived: "已歸檔",
plan_status_trash: "廢棄",
planned_start_time: "計劃開始",
planned_end_time: "計劃結束",
actual_start_time: "實際開始",
actual_end_time: "實際結束",
plan_delete_confirm: "將刪除該測試計劃下所有用例,確認刪除測試計劃: ",
plan_delete_tip: "該測試計劃正在進行中,請確認再刪除!",
plan_delete: "刪除計劃",
api_case: "接口測試用例",
scenario_case: "場景測試用例",
execute_result: "執行結果",
execute_time: '執行時間',
is_api_case_executing: "是否執行接口用例",
is_scenario_executing: '是否執行場景',
is_performance_executing: '是否執行性能',
test_plan_test_case_count: "功能用例數",
test_plan_api_case_count: "接口用例數",
test_plan_api_scenario_count: "場景用例數",
test_plan_ui_scenario_count: "UI 場景用例數",
test_plan_load_case_count: "性能用例數",
test_plan_component_case_count: "步驟用例數",
data_name: "數據名稱",
test_plan_batch_switch: "批量開/關定時任務",
batch_update_schedule_enable: '更新{0}個測試計畫的定時任務狀態為',
batch_update_schedule_enable_alert: '注意:只能更新已設定了定時任務的測試計畫',
next_run_time: '下次運行時間',
schedule_enabled: '已開啟',
check_schedule_enabled: '您勾選的數據檢測到有{0}條定時任務可以修改',
no_check_schedule_enabled: '您勾選的數據沒有檢測到定時任務',
load_case: {
case: "性能用例",
execution_status: "執行狀態",
report: "報告",
view_report: "查看報告",
unlink_in_bulk: "批量取消關聯",
batch_exec_cases: "批量執行用例",
exec: "正在執行....",
error: "用例執行錯誤,請單獨調試該用例!",
report_not_found: "報告不存在",
content_empty: "內容為空",
}
},
demand: {
id: '需求ID',
name: '需求名稱',
batch_relate: '批量關聯需求',
relate_is_null_warn: '關聯需求不能為空!',
relate_name_is_null_warn: '需求名稱不能為空!',
third_platform_demand: "三方平台需求",
other_demand: "其他需求"
},
step_model: '步驟模型',
review: {
test_review: "用例評審",
create_review: "創建用例評審",
edit_review: "編輯用例評審",
review_name: "評審名稱",
reviewer: "評審人",
review_project: "所屬項目",
related_project: "關聯項目",
related_tip: "關聯項目後可以添加關聯項目下的測試用例到評審列表",
review_creator: "發起人",
review_follow_people: "關註人",
review_status: "當前狀態",
end_time: "截止時間",
delete: "刪除評審",
input_review_name: "請輸入評審名稱",
input_review_project: "請選擇所屬項目",
input_reviewer: "請選擇評審人",
no_link_case: "沒有關聯用例!",
pass: "通過",
un_pass: "未通過",
prepare: '未評審',
comment: "評論",
my_review: "我的評審",
my_create: "我創建的評審",
reviewed_by_me: "待我評審",
creator: "創建人",
done: "已評用例",
result_distribution: "結果分布",
deadline_cannot_early_tips: "截止時間不能早於當前時間!",
},
comment: {
no_comment: "暫無評論",
send_comment: "發表評論Ctrl+Enter發送",
send: "確定",
description_is_null: "評論內容不能為空!",
send_success: "評論成功!",
cannot_edit: "無法編輯此評論!",
cannot_delete: "無法刪除此評論!",
submit_description: "請先提交評論!",
},
review_view: {
review: "評審",
all_case: "全部用例",
start_review: "開始評審",
relevance_case: "關聯用例",
last_page: "已經到底了!",
execute_result: "評審結果",
},
module: {
id: '模塊ID',
search: "搜索模塊",
rename: "重命名",
add_submodule: "添加子模塊",
add_module: "添加模塊",
name: "模塊名稱",
delete_confirm: "確認刪除模塊: ",
delete_all_resource: "以及模塊下所有子模塊和測試用例",
delete_batch_confirm: "確認批量刪除勾選的場景步驟?",
module: "模塊",
title: "標題",
status: "狀態",
describe: "描述",
current_owner: "處理人",
creation_time: "創建時間",
project_name: "所屬項目"
},
home: {
recent_test: "最近測試",
my_plan: "我的計劃",
test_rate: "測試進度",
tested_case: "已測用例",
review_progress: "評審進度",
case_count: "用例數量統計",
relevance_case: "關聯用例數量統計",
case_maintenance: "用例責任人分布",
bug_count: "遺留缺陷統計",
case_review: "用例評審",
review_rate: "評審率",
coverage: "覆蓋率",
function_case_count: "功能用例數",
relevance_case_count: "關聯用例數",
serial_number: "序號",
test_plan_name: "測試計劃名稱",
case_size: "用例數",
bug_size: "缺陷數",
passing_rate: "通過率",
percentage: "占比"
},
plan_view: {
plan: "計劃",
relevance_test_case: "關聯測試用例",
cancel_all_relevance: "取消全部關聯",
executor: "執行人",
executor_match_rule: "執行者匹配規則",
execute_result: "執行結果",
pass: "通過",
not_pass: "不通過",
failure: "失敗",
blocking: "阻塞",
stop: "停止",
skip: "跳過",
actual_result: "實際結果",
step_result: "步驟執行結果",
my_case: "我的用例",
all_case: "全部用例",
pre_case: "上一條用例",
next_case: "下一條用例",
change_execution_results: "更改執行結果",
change_executor: "更改執行人",
select_executor: "請選擇執行人",
select_execute_result: "選擇執行結果",
cancel_relevance: "取消用例關聯",
confirm_cancel_relevance: "確認取消關聯",
select_manipulate: "請選擇需要操作的數據",
select_template: "選擇模版",
step: "步驟",
submit_issues: "提缺陷",
operate_step: "操作步驟",
edit_component: "編輯組件",
component: "組件",
base_info: "基礎信息",
mock_info: "Mock服務",
test_result: "測試結果",
result_distribution: "測試結果分布",
custom_component: "自定義模塊",
defect_list: "缺陷列表",
create_report: "創建測試報告",
view_report: "查看測試報告",
component_library: "組件庫",
component_library_tip: "拖拽組件庫中組件,添加至右側,預覽報告效果,每個系統組件只能添加一個。",
delete_component_tip: "請至少保留一個組件",
input_template_name: "輸入模版名稱",
template_special_characters: '模版名稱不支持特殊字符',
case_count: "用例數",
issues_count: "缺陷數",
result_statistics: "測試結果統計",
result_statistics_chart: "測試結果統計圖",
create_template: "新建模版",
report_template: "測試報告模版",
test_detail: "測試詳情",
failure_case: "失敗用例",
export_report: "導出報告",
share_report: "分享報告",
no_case_relevance: "沒有關聯用例",
automatically_update_status: "自動更新狀態",
automatically_update_status_tip: "當功能用例關聯的接口或性能用例在測試計劃執行後,自動更新功能用例的狀態",
allow_associated_repetitive_cases: "允許關聯重復用例",
allow_associated_repetitive_cases_tip: "是否允許同一個測試計劃中多次關聯相同用例",
performance_case_count: "性能測試用例數",
running: "運行中",
please_choose_test_case: "请选择测试用例!",
execute_tip: "步驟執行結果中含有 失敗 結果,無法標記該用例為 通過 狀態!"
},
issue: {
issue: "缺陷",
issue_management: "缺陷管理",
platform_status: "平臺狀態",
issue_resource: "缺陷來源",
create_issue: "創建缺陷",
add_issue: "添加缺陷",
issue_list: "缺陷列表",
search_name: "根據標題搜索",
platform_tip: "在系統設置-工作空間-服務集成中集成缺陷管理平臺可以提交缺陷到指定缺陷管理平臺",
input_title: "請輸入標題",
id: "缺陷ID",
title: "缺陷標題",
description: "缺陷描述",
status: "缺陷狀態",
issue_project: "所屬項目",
platform: "平臺",
operate: "操作",
close: "關閉缺陷",
delete: "刪除缺陷",
title_description_required: "標題和描述必填",
close_success: "關閉成功",
delete_warning: "解除會影響測試計畫相關統計,是否確認",
preview: "預覽",
status_new: '新建',
status_resolved: '已解決',
status_closed: '已關閉',
status_active: '激活',
status_delete: '刪除',
status_in_progress: '接受/處理',
status_rejected: '拒絕',
status_upcoming: '待辦',
status_reopened: '重新打開',
please_choose_current_owner: "請選擇處理人",
tapd_current_owner: "Tapd 處理人",
zentao_bug_build: "禪道 影響版本",
zentao_bug_assigned: "禪道 處理人",
third_party_integrated: "集成第三方平臺",
use_third_party: "使用 Jira 缺陷模板",
update_third_party_bugs: "更新第三方平臺的缺陷",
sync_bugs: "同步缺陷",
sync_complete: "同步完成",
issue_sync_tip: "當前項目正在同步缺陷, 請稍等!",
save_before_open_comment: "請先保存缺陷再添加評論",
delete_tip: "確認刪除缺陷:",
check_id_exist: "檢查",
save_project_first: "請先保存項目",
tapd_status_new: "新",
tapd_status_in_progress: "接受/處理",
tapd_status_reopened: "重新打開",
tapd_status_rejected: "已拒絕",
tapd_status_verified: "已驗證",
tapd_status_closed: "已關閉",
tapd_status_resolved: "已解決",
please_choose_platform_status: "請選擇平臺狀態",
},
report: {
name: "測試計劃報告",
list: {
name: "名稱",
test_plan: "測試計劃名稱",
creator: "創建人",
create_time: "創建時間",
trigger_mode: "觸發方式",
run_time: "運行耗時(s)",
pass_rate: "成功率",
status: "狀態",
operation: "操作",
},
trigger_mode: {
manual: "手動觸發",
automation: "自動觸發",
},
overview: "概覽",
testing_time: "測試時間",
total_number_tests: "測試總數",
exacutive_rate: "執行率",
exacutive_rate_tip: "執行過的用例/所有用例 * 100%",
passing_rate: "通過率",
passing_rate_tip: "執行通過用例/所有用例 * 100%",
content: "目錄",
report_summary: "報告總結",
analysis_functional: "功能用例統計分析",
analysis_api: "接口用例統計分析",
analysis_ui: "UI 用例統計分析",
analysis_load: "性能用例統計分析",
valid_for_24_hours: "24小時有效",
configuration: "配置",
share: "分享",
template_configuration: "模板配置",
test_result: "測試結果",
fail_case: "失敗用例",
issue_list: "缺陷列表",
all_case: "所有用例",
},
reporter: '報告人',
lastmodify: '最後更改',
},
test_resource_pool: { test_resource_pool: {
id: "測試資源池ID", id: "測試資源池ID",
type: '類型', type: '類型',