refactor(接口测试): 优化接口标签保存

--bug=1038363 --user=王孝刚 【接口测试】API/CASE/场景-已有10个标签-批量编辑追加标签还是能继续添加标签
https://www.tapd.cn/55049933/s/1486207
This commit is contained in:
wxg0103 2024-04-02 15:00:18 +08:00 committed by Craftsman
parent 4cc3569bd6
commit d86b59f530
9 changed files with 45 additions and 17 deletions

View File

@ -428,5 +428,5 @@ api_scenario.environment_id.length_range=环境ID长度必须在0-50之间
api_scenario_step.name.length_range=步骤名称长度必须在1-255之间
api_scenario_step.name.not_blank=步骤名称不能为空
api_scenario_step.resource_num.length_range=资源编号长度必须在1-50之间
api_scenario_step.project_id.length_range
api_scenario_step.version_id.length_range
tags_size_large_than=标签数量超过{0}个

View File

@ -435,4 +435,5 @@ api_scenario.target_module_id.length_range=Target module ID length must be betwe
api_scenario.group_id.length_range=Group ID length must be between 0-50
api_scenario.environment_id.length_range=Environment ID length must be between 0-50
api_report_default_env=Default environment
api_report_default_env=Default environment
tags_size_large_than=The number of tags cannot exceed 10

View File

@ -403,4 +403,5 @@ api_scenario.target_module_id.length_range=目标模块ID长度必须在0-50之
api_scenario.group_id.length_range=环境组ID长度必须在0-50之间
api_scenario.environment_id.length_range=环境ID长度必须在0-50之间
api_report_default_env=默认环境
api_report_default_env=默认环境
tags_size_large_than=标签数量超过{0}个

View File

@ -402,4 +402,5 @@ api_scenario.target_module_id.length_range=目標模塊ID長度必須在0-50之
api_scenario.group_id.length_range=环境組ID長度必須在0-50之間
api_scenario.environment_id.length_range=環境ID長度必須在0-50之間
api_report_default_env=默认環境
api_report_default_env=默认環境
tags_size_large_than=標籤數量不能超過{max}

View File

@ -41,7 +41,6 @@ import io.metersphere.sdk.util.*;
import io.metersphere.system.dto.OperationHistoryDTO;
import io.metersphere.system.dto.request.OperationHistoryRequest;
import io.metersphere.system.dto.request.OperationHistoryVersionRequest;
import io.metersphere.system.dto.sdk.SessionUser;
import io.metersphere.system.dto.sdk.request.NodeMoveRequest;
import io.metersphere.system.dto.sdk.request.PosRequest;
import io.metersphere.system.dto.table.TableBatchProcessDTO;
@ -135,6 +134,7 @@ public class ApiDefinitionService extends MoveNodeService {
private OperationLogBlobMapper operationLogBlobMapper;
@Resource
private ApiExecuteService apiExecuteService;
private static final int MAX_TAG_SIZE = 10;
public List<ApiDefinitionDTO> getApiDefinitionPage(ApiDefinitionPageRequest request, String userId) {
CustomFieldUtils.setBaseQueryRequestCustomMultipleFields(request, userId);
@ -200,6 +200,7 @@ public class ApiDefinitionService extends MoveNodeService {
apiDefinition.setUpdateTime(System.currentTimeMillis());
apiDefinition.setRefId(apiDefinition.getId());
if (CollectionUtils.isNotEmpty(request.getTags())) {
apiTestCaseService.checkTagLength(request.getTags());
apiDefinition.setTags(request.getTags());
}
apiDefinitionMapper.insertSelective(apiDefinition);
@ -253,6 +254,7 @@ public class ApiDefinitionService extends MoveNodeService {
public ApiDefinition update(ApiDefinitionUpdateRequest request, String userId) {
ApiDefinition originApiDefinition = checkApiDefinition(request.getId());
ApiDefinition apiDefinition = new ApiDefinition();
apiTestCaseService.checkTagLength(request.getTags());
BeanUtils.copyBean(apiDefinition, request);
checkResponseNameCode(request.getResponse());
if (originApiDefinition.getProtocol().equals(ModuleConstants.NODE_PROTOCOL_HTTP)) {
@ -587,6 +589,7 @@ public class ApiDefinitionService extends MoveNodeService {
if (CollectionUtils.isNotEmpty(collect.get(id).getTags())) {
List<String> tags = collect.get(id).getTags();
tags.addAll(request.getTags());
apiTestCaseService.checkTagLength(tags);
apiDefinition.setTags(tags);
} else {
apiDefinition.setTags(request.getTags());

View File

@ -101,6 +101,7 @@ public class ApiTestCaseService extends MoveNodeService {
private EnvironmentService environmentService;
private static final String CASE_TABLE = "api_test_case";
private static final int MAX_TAG_SIZE = 10;
private void checkProjectExist(String projectId) {
Project project = projectMapper.selectByPrimaryKey(projectId);
@ -169,6 +170,7 @@ public class ApiTestCaseService extends MoveNodeService {
testCase.setCreateTime(System.currentTimeMillis());
testCase.setUpdateTime(System.currentTimeMillis());
if (CollectionUtils.isNotEmpty(request.getTags())) {
checkTagLength(request.getTags());
testCase.setTags(request.getTags());
}
apiTestCaseMapper.insertSelective(testCase);
@ -265,6 +267,7 @@ public class ApiTestCaseService extends MoveNodeService {
testCase.setUpdateUser(userId);
testCase.setUpdateTime(System.currentTimeMillis());
if (CollectionUtils.isNotEmpty(request.getTags())) {
checkTagLength(request.getTags());
testCase.setTags(request.getTags());
} else {
testCase.setTags(null);
@ -473,6 +476,7 @@ public class ApiTestCaseService extends MoveNodeService {
if (CollectionUtils.isEmpty(request.getTags())) {
throw new MSException(Translator.get("tags_is_null"));
}
checkTagLength(request.getTags());
if (request.isAppend()) {
Map<String, ApiTestCase> caseMap = extApiTestCaseMapper.getTagsByIds(ids, false)
.stream()
@ -482,6 +486,7 @@ public class ApiTestCaseService extends MoveNodeService {
if (CollectionUtils.isNotEmpty(v.getTags())) {
List<String> orgTags = v.getTags();
orgTags.addAll(request.getTags());
checkTagLength(orgTags.stream().distinct().toList());
v.setTags(orgTags.stream().distinct().toList());
} else {
v.setTags(request.getTags());
@ -795,4 +800,14 @@ public class ApiTestCaseService extends MoveNodeService {
public List<ReferenceDTO> getReference(ReferenceRequest request) {
return extApiDefinitionMapper.getReference(request);
}
/**
* 校验TAG长度
* @param tags 标签集合
*/
public void checkTagLength(List<String> tags) {
if (CollectionUtils.isNotEmpty(tags) && tags.size() > MAX_TAG_SIZE) {
throw new MSException(Translator.getWithArgs("tags_size_large_than", String.valueOf(MAX_TAG_SIZE)));
}
}
}

View File

@ -18,10 +18,7 @@ import io.metersphere.sdk.dto.api.result.RequestResult;
import io.metersphere.sdk.exception.MSException;
import io.metersphere.sdk.mapper.EnvironmentGroupMapper;
import io.metersphere.sdk.mapper.EnvironmentMapper;
import io.metersphere.sdk.util.BeanUtils;
import io.metersphere.sdk.util.JSON;
import io.metersphere.sdk.util.SubListUtils;
import io.metersphere.sdk.util.Translator;
import io.metersphere.sdk.util.*;
import io.metersphere.system.mapper.TestResourcePoolMapper;
import io.metersphere.system.mapper.UserMapper;
import io.metersphere.system.service.UserLoginService;
@ -201,7 +198,7 @@ public class ApiScenarioReportService {
List<ApiScenarioReportStepDTO> deatilList = extApiScenarioReportMapper.selectStepDeatilByReportId(id);
//根据stepId进行分组
Map<String, List<ApiScenarioReportStepDTO>> detailMap = deatilList.stream().collect(Collectors.groupingBy(ApiScenarioReportStepDTO::getStepId));
scenarioReportSteps.forEach(step -> {
scenarioReportSteps.parallelStream().forEach(step -> {
List<ApiScenarioReportStepDTO> details = detailMap.get(step.getStepId());
if (CollectionUtils.isNotEmpty(details)) {
details.sort(Comparator.comparingLong(ApiScenarioReportStepDTO::getLoopIndex));
@ -235,12 +232,14 @@ public class ApiScenarioReportService {
}
}
});
//将scenarioReportSteps按照parentId进行分组 值为list 然后根据sort进行排序
Map<String, List<ApiScenarioReportStepDTO>> scenarioReportStepMap = scenarioReportSteps.stream().collect(Collectors.groupingBy(ApiScenarioReportStepDTO::getParentId));
// TODO 查询修改
List<ApiScenarioReportStepDTO> steps = scenarioReportStepMap.get("NONE");
steps.sort(Comparator.comparingLong(ApiScenarioReportStepDTO::getSort));
getStepTree(steps, scenarioReportStepMap);
scenarioReportDTO.setStepTotal(steps.size());
scenarioReportDTO.setRequestTotal(scenarioReportDTO.getErrorCount() + scenarioReportDTO.getPendingCount() + scenarioReportDTO.getSuccessCount() + scenarioReportDTO.getFakeErrorCount());
scenarioReportDTO.setChildren(steps);
@ -281,7 +280,7 @@ public class ApiScenarioReportService {
ApiScenarioStepType.LOOP_CONTROLLER.name(),
ApiScenarioStepType.ONCE_ONLY_CONTROLLER.name(),
ApiScenarioStepType.CONSTANT_TIMER.name());
for (ApiScenarioReportStepDTO step : steps) {
steps.parallelStream().forEach(step -> {
List<ApiScenarioReportStepDTO> children = scenarioReportStepMap.get(step.getStepId());
if (CollectionUtils.isNotEmpty(children)) {
children.sort(Comparator.comparingLong(ApiScenarioReportStepDTO::getSort));
@ -299,13 +298,13 @@ public class ApiScenarioReportService {
//获取所有的子请求的状态
List<String> requestStatus = children.stream().map(ApiScenarioReportStepDTO::getStatus).toList();
//过滤出来SUCCESS的状态
List<String> successStatus = requestStatus.stream().filter(status -> StringUtils.equals(ApiReportStatus.SUCCESS.name(),status)).toList();
List<String> successStatus = requestStatus.stream().filter(status -> StringUtils.equals(ApiReportStatus.SUCCESS.name(), status)).toList();
//只要包含ERROR 就是ERROR
if (requestStatus.contains(ApiReportStatus.ERROR.name())) {
step.setStatus(ApiReportStatus.ERROR.name());
} else if (requestStatus.contains(ApiReportStatus.FAKE_ERROR.name())) {
step.setStatus(ApiReportStatus.FAKE_ERROR.name());
} else if (successStatus.size() == children.size()- noControllerIds.size()) {
} else if (successStatus.size() == children.size() - noControllerIds.size()) {
step.setStatus(ApiReportStatus.SUCCESS.name());
} else {
step.setStatus(ApiReportStatus.PENDING.name());
@ -316,7 +315,7 @@ public class ApiScenarioReportService {
step.setStatus(ApiReportStatus.SUCCESS.name());
}
}
}
});
}
}
@ -329,9 +328,9 @@ public class ApiScenarioReportService {
}
List<ApiScenarioReportDetail> apiReportDetails = checkResourceStep(stepId, reportId);
apiReportDetails.sort(Comparator.comparingLong(ApiScenarioReportDetail::getSort));
if (StringUtils.isNotBlank(index)) {
ApiScenarioReportDetail apiScenarioReportDetail = apiReportDetails.get(Integer.parseInt(index) -1);
ApiScenarioReportDetail apiScenarioReportDetail = apiReportDetails.get(Integer.parseInt(index) - 1);
apiReportDetails = Collections.singletonList(apiScenarioReportDetail);
}
List<ApiScenarioReportDetailDTO> results = new ArrayList<>();
@ -356,6 +355,7 @@ public class ApiScenarioReportService {
/**
* 更新执行中的场景报告
*
* @param reportId
*/
public void updateReportStatus(String reportId, String status) {

View File

@ -337,6 +337,7 @@ public class ApiScenarioService extends MoveNodeService {
if (CollectionUtils.isEmpty(request.getTags())) {
throw new MSException(Translator.get("tags_is_null"));
}
apiTestCaseService.checkTagLength(request.getTags());
if (request.isAppend()) {
Map<String, ApiScenario> scenarioMap = extApiScenarioMapper.getTagsByIds(ids, false)
.stream()
@ -346,6 +347,7 @@ public class ApiScenarioService extends MoveNodeService {
if (CollectionUtils.isNotEmpty(v.getTags())) {
List<String> orgTags = v.getTags();
orgTags.addAll(request.getTags());
apiTestCaseService.checkTagLength(orgTags.stream().distinct().toList());
v.setTags(orgTags.stream().distinct().toList());
} else {
v.setTags(request.getTags());
@ -410,6 +412,7 @@ public class ApiScenarioService extends MoveNodeService {
public ApiScenario add(ApiScenarioAddRequest request, String creator) {
checkAddExist(request);
apiTestCaseService.checkTagLength(request.getTags());
ApiScenario scenario = getAddApiScenario(request, creator);
scenario.setStepTotal(request.getSteps().size());
apiScenarioMapper.insert(scenario);
@ -655,6 +658,7 @@ public class ApiScenarioService extends MoveNodeService {
public ApiScenario update(ApiScenarioUpdateRequest request, String updater) {
checkResourceExist(request.getId());
checkUpdateExist(request);
apiTestCaseService.checkTagLength(request.getTags());
// 更新基础信息
ApiScenario scenario = BeanUtils.copyBean(new ApiScenario(), request);
scenario.setUpdateUser(updater);

View File

@ -929,6 +929,9 @@ public class ApiTestCaseControllerTests extends BaseTest {
//标签为空 报错
request.setTags(new LinkedHashSet<>());
this.requestPost(BATCH_EDIT, request, ERROR_REQUEST_MATCHER);
//标签超出10个报错
request.setTags(new LinkedHashSet<>(List.of("tag1", "tag2", "tag3", "tag4", "tag5", "tag6", "tag7", "tag8", "tag9", "tag10", "tag11")));
this.requestPost(BATCH_EDIT, request, ERROR_REQUEST_MATCHER);
//ids为空的时候
request.setTags(new LinkedHashSet<>(List.of("tag1")));
request.setSelectAll(true);