fix(测试跟踪): 测试计划历史报告导出各模块报告为空白
This commit is contained in:
parent
c24d8ee3e1
commit
d77a66f7ba
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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<>();
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue