fix(测试跟踪): 测试计划历史报告导出各模块报告为空白

This commit is contained in:
chenjianxing 2022-10-13 14:29:07 +08:00 committed by jianxing
parent c24d8ee3e1
commit d77a66f7ba
13 changed files with 178 additions and 78 deletions

View File

@ -181,4 +181,9 @@ public class TestPlanApiCaseController {
testPlanApiCaseService.run(testId, reportId);
}
@PostMapping("/build/response")
public List<TestPlanFailureApiDTO> buildResponse(@RequestBody List<TestPlanFailureApiDTO> cases) {
testPlanApiCaseService.buildApiResponse(cases);
return cases;
}
}

View File

@ -219,4 +219,10 @@ public class TestPlanScenarioCaseController {
public List<ApiScenarioModuleDTO> getNodeByPlanId(@PathVariable String planId, @RequestBody List<String> projectIds) {
return testPlanScenarioCaseService.getNodeByPlanId(projectIds, planId);
}
@PostMapping("/build/response")
public List<TestPlanFailureScenarioDTO> buildResponse(@RequestBody List<TestPlanFailureScenarioDTO> cases) {
testPlanScenarioCaseService.buildScenarioResponse(cases);
return cases;
}
}

View File

@ -17,17 +17,10 @@ import io.metersphere.api.dto.plan.TestPlanApiCaseInfoDTO;
import io.metersphere.api.exec.api.ApiCaseExecuteService;
import io.metersphere.api.exec.api.ApiExecuteService;
import io.metersphere.api.exec.scenario.ApiScenarioEnvService;
import io.metersphere.base.domain.ApiDefinition;
import io.metersphere.base.domain.ApiDefinitionExecResultWithBLOBs;
import io.metersphere.base.domain.ApiTestCase;
import io.metersphere.base.domain.ApiTestCaseExample;
import io.metersphere.base.domain.ApiTestCaseWithBLOBs;
import io.metersphere.base.domain.ApiTestEnvironment;
import io.metersphere.base.domain.Project;
import io.metersphere.base.domain.TestPlanApiCase;
import io.metersphere.base.domain.TestPlanApiCaseExample;
import io.metersphere.base.domain.*;
import io.metersphere.base.mapper.ApiDefinitionExecResultMapper;
import io.metersphere.base.mapper.ApiTestCaseMapper;
import io.metersphere.base.mapper.ext.ExtApiDefinitionExecResultMapper;
import io.metersphere.base.mapper.plan.TestPlanApiCaseMapper;
import io.metersphere.base.mapper.plan.ext.ExtTestPlanApiCaseMapper;
import io.metersphere.commons.constants.ApiRunMode;
@ -36,11 +29,7 @@ import io.metersphere.commons.constants.ElementConstants;
import io.metersphere.commons.constants.TriggerMode;
import io.metersphere.commons.enums.ApiReportStatus;
import io.metersphere.commons.exception.MSException;
import io.metersphere.commons.utils.ApiDefinitionExecResultUtil;
import io.metersphere.commons.utils.JSON;
import io.metersphere.commons.utils.PageUtils;
import io.metersphere.commons.utils.Pager;
import io.metersphere.commons.utils.SessionUtils;
import io.metersphere.commons.utils.*;
import io.metersphere.dto.MsExecResponseDTO;
import io.metersphere.dto.RunModeConfigDTO;
import io.metersphere.environment.service.BaseEnvGroupProjectService;
@ -102,6 +91,8 @@ public class TestPlanApiCaseService {
@Lazy
@Resource
private ApiDefinitionService apiDefinitionService;
@Resource
ExtApiDefinitionExecResultMapper extApiDefinitionExecResultMapper;
@Lazy
@Resource
private ApiScenarioEnvService apiScenarioEnvService;
@ -429,6 +420,55 @@ public class TestPlanApiCaseService {
return buildCases(apiTestCases);
}
public void buildApiResponse(List<TestPlanFailureApiDTO> cases) {
if (!org.apache.commons.collections.CollectionUtils.isEmpty(cases)) {
List<String> reportIds = new ArrayList<>();
for (TestPlanFailureApiDTO apiCase : cases) {
if (StringUtils.isEmpty(apiCase.getReportId())) {
ApiDefinitionExecResultWithBLOBs result = extApiDefinitionExecResultMapper.selectPlanApiMaxResultByTestIdAndType(apiCase.getId(), "API_PLAN");
if (result != null && StringUtils.isNotBlank(result.getContent())) {
apiCase.setReportId(result.getId());
String contentStr = result.getContent();
try {
Map content = JSON.parseMap(contentStr);
if (StringUtils.isNotEmpty(contentStr)) {
content.put("envName", apiDefinitionService.getEnvNameByEnvConfig(result.getProjectId(), result.getEnvConfig()));
}
contentStr = JSON.toJSONString(content);
apiCase.setResponse(contentStr);
} catch (Exception e) {
LogUtil.error("解析content失败!", e);
}
}
} else {
reportIds.add(apiCase.getReportId());
}
}
if (org.apache.commons.collections.CollectionUtils.isNotEmpty(reportIds)) {
ApiDefinitionExecResultExample example = new ApiDefinitionExecResultExample();
example.createCriteria().andIdIn(reportIds);
List<ApiDefinitionExecResultWithBLOBs> results = apiDefinitionExecResultMapper.selectByExampleWithBLOBs(example);
// 格式化数据结果
Map<String, ApiDefinitionExecResultWithBLOBs> resultMap = results.stream().collect(Collectors.toMap(ApiDefinitionExecResult::getId, item -> item, (k, v) -> k));
cases.forEach(item -> {
if (resultMap.get(item.getReportId()) != null &&
StringUtils.isNotBlank(resultMap.get(item.getReportId()).getContent())) {
ApiDefinitionExecResultWithBLOBs execResult = resultMap.get(item.getReportId());
Map responseObj = new LinkedHashMap();
try {
responseObj = JSON.parseMap(execResult.getContent());
} catch (Exception e) {
}
if (StringUtils.isNotEmpty(execResult.getEnvConfig())) {
responseObj.put("envName", apiDefinitionService.getEnvNameByEnvConfig(execResult.getProjectId(), execResult.getEnvConfig()));
}
item.setResponse(responseObj.toString());
}
});
}
}
}
public List<TestPlanFailureApiDTO> buildCases(List<TestPlanFailureApiDTO> apiTestCases) {
if (CollectionUtils.isEmpty(apiTestCases)) {
return apiTestCases;

View File

@ -825,7 +825,7 @@ public class TestPlanScenarioCaseService {
apiAllCases = testPlanApiCaseService.getAllCases(planId);
report.setApiAllCases(apiAllCases);
if (saveResponse) {
buildApiResponse(apiAllCases);
testPlanApiCaseService.buildApiResponse(apiAllCases);
}
//场景
scenarioAllCases = getAllCases(planId);
@ -849,55 +849,6 @@ public class TestPlanScenarioCaseService {
}
}
public void buildApiResponse(List<TestPlanFailureApiDTO> cases) {
if (!CollectionUtils.isEmpty(cases)) {
List<String> reportIds = new ArrayList<>();
for (TestPlanFailureApiDTO apiCase : cases) {
if (StringUtils.isEmpty(apiCase.getReportId())) {
ApiDefinitionExecResultWithBLOBs result = extApiDefinitionExecResultMapper.selectPlanApiMaxResultByTestIdAndType(apiCase.getId(), "API_PLAN");
if (result != null && StringUtils.isNotBlank(result.getContent())) {
apiCase.setReportId(result.getId());
String contentStr = result.getContent();
try {
Map content = JSON.parseMap(contentStr);
if (StringUtils.isNotEmpty(contentStr)) {
content.put("envName", apiDefinitionService.getEnvNameByEnvConfig(result.getProjectId(), result.getEnvConfig()));
}
contentStr = JSON.toJSONString(content);
apiCase.setResponse(contentStr);
} catch (Exception e) {
LogUtil.error("解析content失败!", e);
}
}
} else {
reportIds.add(apiCase.getReportId());
}
}
if (CollectionUtils.isNotEmpty(reportIds)) {
ApiDefinitionExecResultExample example = new ApiDefinitionExecResultExample();
example.createCriteria().andIdIn(reportIds);
List<ApiDefinitionExecResultWithBLOBs> results = apiDefinitionExecResultMapper.selectByExampleWithBLOBs(example);
// 格式化数据结果
Map<String, ApiDefinitionExecResultWithBLOBs> resultMap = results.stream().collect(Collectors.toMap(ApiDefinitionExecResult::getId, item -> item, (k, v) -> k));
cases.forEach(item -> {
if (resultMap.get(item.getReportId()) != null &&
StringUtils.isNotBlank(resultMap.get(item.getReportId()).getContent())) {
ApiDefinitionExecResultWithBLOBs execResult = resultMap.get(item.getReportId());
Map responseObj = new LinkedHashMap();
try {
responseObj = JSON.parseMap(execResult.getContent());
} catch (Exception e) {
}
if (StringUtils.isNotEmpty(execResult.getEnvConfig())) {
responseObj.put("envName", apiDefinitionService.getEnvNameByEnvConfig(execResult.getProjectId(), execResult.getEnvConfig()));
}
item.setResponse(responseObj.toString());
}
});
}
}
}
private void screenApiCaseByStatusAndReportConfig(ApiPlanReportDTO report, List<TestPlanFailureApiDTO> apiAllCases, Map reportConfig) {
if (!CollectionUtils.isEmpty(apiAllCases)) {
List<TestPlanFailureApiDTO> apiFailureCases = new ArrayList<>();

View File

@ -194,5 +194,9 @@ public class TestPlanLoadCaseController {
return testPlanLoadCaseService.isExecuting(planId, projectId);
}
@PostMapping("/build/response")
public List<TestPlanLoadCaseDTO> buildResponse(@RequestBody List<TestPlanLoadCaseDTO> cases) {
testPlanLoadCaseService.buildLoadResponse(cases);
return cases;
}
}

View File

@ -0,0 +1,24 @@
package io.metersphere.dto;
import io.metersphere.base.domain.UiScenarioReportWithBLOBs;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
@Setter
@Getter
public class ScenarioReportResultWrapper extends UiScenarioReportWithBLOBs {
private String testName;
private String projectName;
private String testId;
private String userName;
private List<String> scenarioIds;
private String content;
}

View File

@ -1,14 +1,12 @@
package io.metersphere.dto;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.metersphere.base.domain.UiScenarioWithBLOBs;
import io.metersphere.plan.dto.APIScenarioReportResult;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@JsonInclude(JsonInclude.Include.NON_NULL) // todo check
public class TestPlanUiScenarioDTO extends UiScenarioWithBLOBs {
private APIScenarioReportResult response;
@JsonInclude(JsonInclude.Include.NON_NULL)
public class TestPlanUiScenarioDTO extends UiScenarioDTO {
private ScenarioReportResultWrapper response;
}

View File

@ -0,0 +1,36 @@
package io.metersphere.dto;
import io.metersphere.base.domain.UiScenarioWithBLOBs;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
import java.util.Map;
@Getter
@Setter
public class UiScenarioDTO extends UiScenarioWithBLOBs {
private String projectName;
private String userName;
private String creatorName;
private String principalName;
private List<String> tagNames;
private String deleteUser;
private String versionName;
private Boolean versionEnable;
/**
* 场景跨项目ID
*/
private List<String> projectIds;
private String caseId;
private String environment;
/**
* 场景列表 环境
*/
private String env;
private Map<String, String> environmentMap;
private String creator;
}

View File

@ -1262,16 +1262,37 @@ public class TestPlanService {
public void exportPlanDbReport(String reportId, String lang, HttpServletResponse response) throws UnsupportedEncodingException {
TestPlanSimpleReportDTO report = testPlanReportService.getReport(reportId);
// buildApiResponse(report.getApiAllCases());
// buildApiResponse(report.getApiFailureCases());
// buildScenarioResponse(report.getScenarioAllCases());
// buildScenarioResponse(report.getScenarioFailureCases());
// buildLoadResponse(report.getLoadAllCases());
// buildUiScenarioResponse(report.getUiAllCases());
// report.setLang(lang);
runReportWithExceptionHandle(report, r -> planTestPlanApiCaseService.buildResponse(r.getApiAllCases()),
(r, res) -> r.setApiAllCases((List<TestPlanFailureApiDTO>) res));
runReportWithExceptionHandle(report, r -> planTestPlanApiCaseService.buildResponse(r.getApiFailureCases()),
(r, res) -> r.setApiFailureCases((List<TestPlanFailureApiDTO>) res));
runReportWithExceptionHandle(report, r -> planTestPlanScenarioCaseService.buildResponse(r.getScenarioAllCases()),
(r, res) -> r.setScenarioAllCases((List<TestPlanFailureScenarioDTO>) res));
runReportWithExceptionHandle(report, r -> planTestPlanScenarioCaseService.buildResponse(r.getScenarioFailureCases()),
(r, res) -> r.setScenarioFailureCases((List<TestPlanFailureScenarioDTO>) res));
runReportWithExceptionHandle(report, r -> planTestPlanUiScenarioCaseService.buildResponse(r.getUiAllCases()),
(r, res) -> r.setUiAllCases((List<TestPlanUiScenarioDTO>) res));
runReportWithExceptionHandle(report, r -> planTestPlanUiScenarioCaseService.buildResponse(r.getUiFailureCases()),
(r, res) -> r.setUiFailureCases((List<TestPlanUiScenarioDTO>) res));
runReportWithExceptionHandle(report, r -> planTestPlanLoadCaseService.buildResponse(r.getLoadAllCases()),
(r, res) -> r.setLoadAllCases((List<TestPlanLoadCaseDTO>) res));
report.setLang(lang);
render(report, response);
}
public void runReportWithExceptionHandle(TestPlanSimpleReportDTO report, Function<TestPlanSimpleReportDTO, Object> getCaseFunc,
BiConsumer<TestPlanSimpleReportDTO, Object> setReportCaseFunc) {
try {
// todo 服务调用失败
setReportCaseFunc.accept(report, getCaseFunc.apply(report));
} catch (Exception e) {
LogUtil.error(e);
}
}
public Boolean checkReportConfig(Map config, String key) {
return ServiceUtils.checkConfigEnable(config, key);
}

View File

@ -3,7 +3,6 @@ package io.metersphere.plan.service.remote.api;
import io.metersphere.commons.exception.MSException;
import io.metersphere.commons.utils.LogUtil;
import io.metersphere.dto.*;
import io.metersphere.excel.constants.TestPlanTestCaseStatus;
import io.metersphere.plan.dto.*;
import io.metersphere.plan.utils.TestPlanStatusCalculator;
import org.apache.commons.collections.CollectionUtils;
@ -136,4 +135,8 @@ public class PlanTestPlanApiCaseService extends ApiTestService {
public List<ApiModuleDTO> getNodeByPlanId(List<String> projectIds, String planId, String protocol) {
return microService.postForDataArray(serviceName, BASE_UEL + "/list/module/" + planId + "/" + protocol, projectIds, ApiModuleDTO.class);
}
public List<TestPlanFailureApiDTO> buildResponse(List<TestPlanFailureApiDTO> apiAllCases) {
return microService.postForDataArray(serviceName, BASE_UEL + "/build/response", apiAllCases, TestPlanFailureApiDTO.class);
}
}

View File

@ -162,4 +162,8 @@ public class PlanTestPlanScenarioCaseService extends ApiTestService {
public List<ApiScenarioModuleDTO> getNodeByPlanId(List<String> projectIds, String planId) {
return microService.postForDataArray(serviceName, BASE_UEL + "/list/module/" + planId, projectIds, ApiScenarioModuleDTO.class);
}
public List<TestPlanFailureScenarioDTO> buildResponse(List<TestPlanFailureScenarioDTO> scenarioCases) {
return microService.postForDataArray(serviceName, BASE_UEL + "/build/response", scenarioCases, TestPlanFailureScenarioDTO.class);
}
}

View File

@ -116,4 +116,8 @@ public class PlanTestPlanLoadCaseService extends LoadTestService {
public Boolean isCaseExecuting(String planId, String projectId) {
return (Boolean) microService.getForData(serviceName, BASE_UEL + "/is/executing/" + planId + "/" + projectId);
}
public List<TestPlanLoadCaseDTO> buildResponse(List<TestPlanLoadCaseDTO> loadCases) {
return microService.postForDataArray(serviceName, BASE_UEL + "/build/response", loadCases, TestPlanLoadCaseDTO.class);
}
}

View File

@ -124,4 +124,8 @@ public class PlanTestPlanUiScenarioCaseService extends UiTestService {
public List<ModuleNodeDTO> getNodeByPlanId(List<String> projectIds, String planId) {
return microService.postForDataArray(serviceName, BASE_UEL + "/list/module/" + planId, projectIds, ModuleNodeDTO.class);
}
public List<TestPlanUiScenarioDTO> buildResponse(List<TestPlanUiScenarioDTO> uiCases) {
return microService.postForDataArray(serviceName, BASE_UEL + "/build/response", uiCases, TestPlanUiScenarioDTO.class);
}
}