feat(测试计划): 修复测试计划定时任务总是Running的问题
--bug=1005249 --user=宋天阳 【定时任务】测试计划定时任务,状态一直是running https://www.tapd.cn/55049933/s/1026590
This commit is contained in:
parent
47558a6438
commit
b4a5a008b6
|
@ -15,6 +15,7 @@ public class TestPlanScenarioRequest {
|
||||||
private String projectId;
|
private String projectId;
|
||||||
private String moduleId;
|
private String moduleId;
|
||||||
private List<String> moduleIds;
|
private List<String> moduleIds;
|
||||||
|
private List<String> scenarioIds;
|
||||||
private String name;
|
private String name;
|
||||||
private String status;
|
private String status;
|
||||||
private String workspaceId;
|
private String workspaceId;
|
||||||
|
|
|
@ -2342,7 +2342,6 @@ public class ApiAutomationService {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// uploadFiles(request, bodyFiles, scenarioFiles);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public DeleteCheckResult checkBeforeDelete(ApiScenarioBatchRequest request) {
|
public DeleteCheckResult checkBeforeDelete(ApiScenarioBatchRequest request) {
|
||||||
|
|
|
@ -9,15 +9,15 @@ import io.metersphere.base.mapper.ApiDefinitionMapper;
|
||||||
import io.metersphere.base.mapper.ApiTestCaseMapper;
|
import io.metersphere.base.mapper.ApiTestCaseMapper;
|
||||||
import io.metersphere.base.mapper.TestCaseReviewApiCaseMapper;
|
import io.metersphere.base.mapper.TestCaseReviewApiCaseMapper;
|
||||||
import io.metersphere.base.mapper.ext.ExtApiDefinitionExecResultMapper;
|
import io.metersphere.base.mapper.ext.ExtApiDefinitionExecResultMapper;
|
||||||
import io.metersphere.commons.constants.ApiRunMode;
|
import io.metersphere.commons.constants.*;
|
||||||
import io.metersphere.commons.constants.DelimiterConstants;
|
import io.metersphere.commons.utils.CommonBeanFactory;
|
||||||
import io.metersphere.commons.constants.TriggerMode;
|
|
||||||
import io.metersphere.commons.utils.DateUtils;
|
import io.metersphere.commons.utils.DateUtils;
|
||||||
import io.metersphere.commons.utils.SessionUtils;
|
import io.metersphere.commons.utils.SessionUtils;
|
||||||
import io.metersphere.track.dto.TestPlanDTO;
|
import io.metersphere.track.dto.TestPlanDTO;
|
||||||
import io.metersphere.track.request.testcase.QueryTestPlanRequest;
|
import io.metersphere.track.request.testcase.QueryTestPlanRequest;
|
||||||
import io.metersphere.track.service.TestCaseReviewApiCaseService;
|
import io.metersphere.track.service.TestCaseReviewApiCaseService;
|
||||||
import io.metersphere.track.service.TestPlanApiCaseService;
|
import io.metersphere.track.service.TestPlanApiCaseService;
|
||||||
|
import io.metersphere.track.service.TestPlanReportService;
|
||||||
import io.metersphere.track.service.TestPlanService;
|
import io.metersphere.track.service.TestPlanService;
|
||||||
import org.apache.commons.collections4.CollectionUtils;
|
import org.apache.commons.collections4.CollectionUtils;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
@ -157,69 +157,89 @@ public class ApiDefinitionExecResultService {
|
||||||
* @param result
|
* @param result
|
||||||
* @param type
|
* @param type
|
||||||
*/
|
*/
|
||||||
public void saveApiResultByScheduleTask(TestResult result, String type) {
|
public void saveApiResultByScheduleTask(TestResult result,String testPlanReportId, String type,String trigeMode) {
|
||||||
String saveResultType = type;
|
String saveResultType = type;
|
||||||
if (StringUtils.equalsAny(saveResultType, ApiRunMode.SCHEDULE_API_PLAN.name(), ApiRunMode.JENKINS_API_PLAN.name())) {
|
if (StringUtils.equalsAny(saveResultType, ApiRunMode.SCHEDULE_API_PLAN.name(), ApiRunMode.JENKINS_API_PLAN.name())) {
|
||||||
saveResultType = ApiRunMode.API_PLAN.name();
|
saveResultType = ApiRunMode.API_PLAN.name();
|
||||||
}
|
}
|
||||||
String finalSaveResultType = saveResultType;
|
String finalSaveResultType = saveResultType;
|
||||||
result.getScenarios().get(0).getRequestResults().forEach(item -> {
|
|
||||||
ApiDefinitionExecResult saveResult = new ApiDefinitionExecResult();
|
Map<String,String> apiIdResultMap = new HashMap<>();
|
||||||
saveResult.setId(UUID.randomUUID().toString());
|
|
||||||
saveResult.setCreateTime(System.currentTimeMillis());
|
if (CollectionUtils.isNotEmpty(result.getScenarios())) {
|
||||||
saveResult.setName(item.getName());
|
result.getScenarios().forEach(scenarioResult -> {
|
||||||
ApiDefinitionWithBLOBs apiDefinitionWithBLOBs = apiDefinitionMapper.selectByPrimaryKey(item.getName());
|
if (scenarioResult != null && CollectionUtils.isNotEmpty(scenarioResult.getRequestResults())) {
|
||||||
if (apiDefinitionWithBLOBs != null) {
|
scenarioResult.getRequestResults().forEach(item -> {
|
||||||
saveResult.setName(apiDefinitionWithBLOBs.getName());
|
String status = item.isSuccess() ? "success" : "error";
|
||||||
} else {
|
ApiDefinitionExecResult saveResult = new ApiDefinitionExecResult();
|
||||||
ApiTestCaseWithBLOBs caseWithBLOBs = apiTestCaseMapper.selectByPrimaryKey(item.getName());
|
saveResult.setId(UUID.randomUUID().toString());
|
||||||
if (caseWithBLOBs != null) {
|
saveResult.setCreateTime(System.currentTimeMillis());
|
||||||
saveResult.setName(caseWithBLOBs.getName());
|
saveResult.setName(item.getName());
|
||||||
|
ApiDefinitionWithBLOBs apiDefinitionWithBLOBs = apiDefinitionMapper.selectByPrimaryKey(item.getName());
|
||||||
|
if (apiDefinitionWithBLOBs != null) {
|
||||||
|
saveResult.setName(apiDefinitionWithBLOBs.getName());
|
||||||
|
apiIdResultMap.put(apiDefinitionWithBLOBs.getId(),item.isSuccess()? TestPlanApiExecuteStatus.SUCCESS.name() : TestPlanApiExecuteStatus.FAILD.name());
|
||||||
|
} else {
|
||||||
|
ApiTestCaseWithBLOBs caseWithBLOBs = apiTestCaseMapper.selectByPrimaryKey(item.getName());
|
||||||
|
if (caseWithBLOBs != null) {
|
||||||
|
saveResult.setName(caseWithBLOBs.getName());
|
||||||
|
apiIdResultMap.put(caseWithBLOBs.getId(),item.isSuccess()? TestPlanApiExecuteStatus.SUCCESS.name() : TestPlanApiExecuteStatus.FAILD.name());
|
||||||
|
}else {
|
||||||
|
caseWithBLOBs = testPlanApiCaseService.getApiTestCaseById(item.getName());
|
||||||
|
if (caseWithBLOBs != null) {
|
||||||
|
saveResult.setName(caseWithBLOBs.getName());
|
||||||
|
apiIdResultMap.put(caseWithBLOBs.getId(), item.isSuccess() ? TestPlanApiExecuteStatus.SUCCESS.name() : TestPlanApiExecuteStatus.FAILD.name());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (StringUtils.equals(type, ApiRunMode.JENKINS_API_PLAN.name())) {
|
||||||
|
saveResult.setTriggerMode(TriggerMode.API.name());
|
||||||
|
} else {
|
||||||
|
saveResult.setTriggerMode(TriggerMode.SCHEDULE.name());
|
||||||
|
}
|
||||||
|
|
||||||
|
saveResult.setResourceId(item.getName());
|
||||||
|
saveResult.setActuator("LOCAL");
|
||||||
|
saveResult.setContent(JSON.toJSONString(item));
|
||||||
|
saveResult.setStartTime(item.getStartTime());
|
||||||
|
saveResult.setEndTime(item.getResponseResult().getResponseTime());
|
||||||
|
saveResult.setType(finalSaveResultType);
|
||||||
|
saveResult.setStatus(status);
|
||||||
|
|
||||||
|
String userID = null;
|
||||||
|
if (StringUtils.equals(type, ApiRunMode.SCHEDULE_API_PLAN.name())) {
|
||||||
|
TestPlanApiCase apiCase = testPlanApiCaseService.getById(item.getName());
|
||||||
|
String scheduleCreateUser = testPlanService.findScheduleCreateUserById(apiCase.getTestPlanId());
|
||||||
|
userID = scheduleCreateUser;
|
||||||
|
apiCase.setStatus(status);
|
||||||
|
apiCase.setUpdateTime(System.currentTimeMillis());
|
||||||
|
testPlanApiCaseService.updateByPrimaryKeySelective(apiCase);
|
||||||
|
} else if (StringUtils.equals(type, ApiRunMode.JENKINS_SCENARIO_PLAN.name())) {
|
||||||
|
TestPlanApiCase apiCase = testPlanApiCaseService.getById(item.getName());
|
||||||
|
userID = Objects.requireNonNull(SessionUtils.getUser()).getId();
|
||||||
|
apiCase.setStatus(status);
|
||||||
|
apiCase.setUpdateTime(System.currentTimeMillis());
|
||||||
|
testPlanApiCaseService.updateByPrimaryKeySelective(apiCase);
|
||||||
|
} else {
|
||||||
|
userID = Objects.requireNonNull(SessionUtils.getUser()).getId();
|
||||||
|
testPlanApiCaseService.setExecResult(item.getName(), status, item.getStartTime());
|
||||||
|
testCaseReviewApiCaseService.setExecResult(item.getName(), status, item.getStartTime());
|
||||||
|
}
|
||||||
|
saveResult.setUserId(userID);
|
||||||
|
// 前一条数据内容清空
|
||||||
|
ApiDefinitionExecResult prevResult = extApiDefinitionExecResultMapper.selectMaxResultByResourceIdAndType(item.getName(), finalSaveResultType);
|
||||||
|
if (prevResult != null) {
|
||||||
|
prevResult.setContent(null);
|
||||||
|
apiDefinitionExecResultMapper.updateByPrimaryKeyWithBLOBs(prevResult);
|
||||||
|
}
|
||||||
|
apiDefinitionExecResultMapper.insert(saveResult);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
if (StringUtils.equals(type, ApiRunMode.JENKINS_API_PLAN.name())) {
|
}
|
||||||
saveResult.setTriggerMode(TriggerMode.API.name());
|
|
||||||
} else {
|
|
||||||
saveResult.setTriggerMode(TriggerMode.SCHEDULE.name());
|
|
||||||
}
|
|
||||||
|
|
||||||
saveResult.setResourceId(item.getName());
|
TestPlanReportService testPlanReportService = CommonBeanFactory.getBean(TestPlanReportService.class);
|
||||||
saveResult.setActuator("LOCAL");
|
testPlanReportService.updateExecuteApis(testPlanReportId,apiIdResultMap,null,null);
|
||||||
saveResult.setContent(JSON.toJSONString(item));
|
|
||||||
saveResult.setStartTime(item.getStartTime());
|
|
||||||
String status = item.isSuccess() ? "success" : "error";
|
|
||||||
saveResult.setEndTime(item.getResponseResult().getResponseTime());
|
|
||||||
saveResult.setType(finalSaveResultType);
|
|
||||||
saveResult.setStatus(status);
|
|
||||||
|
|
||||||
String userID = null;
|
|
||||||
if (StringUtils.equals(type, ApiRunMode.SCHEDULE_API_PLAN.name())) {
|
|
||||||
TestPlanApiCase apiCase = testPlanApiCaseService.getById(item.getName());
|
|
||||||
String scheduleCreateUser = testPlanService.findScheduleCreateUserById(apiCase.getTestPlanId());
|
|
||||||
userID = scheduleCreateUser;
|
|
||||||
apiCase.setStatus(status);
|
|
||||||
apiCase.setUpdateTime(System.currentTimeMillis());
|
|
||||||
testPlanApiCaseService.updateByPrimaryKeySelective(apiCase);
|
|
||||||
} else if (StringUtils.equals(type, ApiRunMode.JENKINS_SCENARIO_PLAN.name())) {
|
|
||||||
TestPlanApiCase apiCase = testPlanApiCaseService.getById(item.getName());
|
|
||||||
userID = Objects.requireNonNull(SessionUtils.getUser()).getId();
|
|
||||||
apiCase.setStatus(status);
|
|
||||||
apiCase.setUpdateTime(System.currentTimeMillis());
|
|
||||||
testPlanApiCaseService.updateByPrimaryKeySelective(apiCase);
|
|
||||||
} else {
|
|
||||||
userID = Objects.requireNonNull(SessionUtils.getUser()).getId();
|
|
||||||
testPlanApiCaseService.setExecResult(item.getName(), status, item.getStartTime());
|
|
||||||
testCaseReviewApiCaseService.setExecResult(item.getName(), status, item.getStartTime());
|
|
||||||
}
|
|
||||||
saveResult.setUserId(userID);
|
|
||||||
// 前一条数据内容清空
|
|
||||||
ApiDefinitionExecResult prevResult = extApiDefinitionExecResultMapper.selectMaxResultByResourceIdAndType(item.getName(), finalSaveResultType);
|
|
||||||
if (prevResult != null) {
|
|
||||||
prevResult.setContent(null);
|
|
||||||
apiDefinitionExecResultMapper.updateByPrimaryKeyWithBLOBs(prevResult);
|
|
||||||
}
|
|
||||||
apiDefinitionExecResultMapper.insert(saveResult);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void deleteByResourceId(String resourceId) {
|
public void deleteByResourceId(String resourceId) {
|
||||||
|
|
|
@ -23,6 +23,7 @@ import io.metersphere.base.mapper.TestPlanApiScenarioMapper;
|
||||||
import io.metersphere.base.mapper.ext.ExtApiScenarioReportMapper;
|
import io.metersphere.base.mapper.ext.ExtApiScenarioReportMapper;
|
||||||
import io.metersphere.commons.constants.ApiRunMode;
|
import io.metersphere.commons.constants.ApiRunMode;
|
||||||
import io.metersphere.commons.constants.ReportTriggerMode;
|
import io.metersphere.commons.constants.ReportTriggerMode;
|
||||||
|
import io.metersphere.commons.constants.TestPlanApiExecuteStatus;
|
||||||
import io.metersphere.commons.constants.TriggerMode;
|
import io.metersphere.commons.constants.TriggerMode;
|
||||||
import io.metersphere.commons.exception.MSException;
|
import io.metersphere.commons.exception.MSException;
|
||||||
import io.metersphere.commons.utils.*;
|
import io.metersphere.commons.utils.*;
|
||||||
|
@ -252,7 +253,7 @@ public class ApiScenarioReportService {
|
||||||
return returnReport;
|
return returnReport;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ApiScenarioReport updateSchedulePlanCase(TestResult result, String runMode) {
|
public ApiScenarioReport updateSchedulePlanCase(TestResult result, String runMode) {
|
||||||
ApiScenarioReport lastReport = null;
|
ApiScenarioReport lastReport = null;
|
||||||
List<ScenarioResult> scenarioResultList = result.getScenarios();
|
List<ScenarioResult> scenarioResultList = result.getScenarios();
|
||||||
|
|
||||||
|
@ -261,6 +262,7 @@ public class ApiScenarioReportService {
|
||||||
|
|
||||||
List<String> reportIds = new ArrayList<>();
|
List<String> reportIds = new ArrayList<>();
|
||||||
List<String> scenarioIdList = new ArrayList<>();
|
List<String> scenarioIdList = new ArrayList<>();
|
||||||
|
Map<String,String> scenarioAndErrorMap = new HashMap<>();
|
||||||
for (ScenarioResult scenarioResult : scenarioResultList) {
|
for (ScenarioResult scenarioResult : scenarioResultList) {
|
||||||
|
|
||||||
// 存储场景报告
|
// 存储场景报告
|
||||||
|
@ -296,9 +298,12 @@ public class ApiScenarioReportService {
|
||||||
report.setScenarioId(testPlanApiScenario.getApiScenarioId());
|
report.setScenarioId(testPlanApiScenario.getApiScenarioId());
|
||||||
report.setTestPlanScenarioId(planScenarioId);
|
report.setTestPlanScenarioId(planScenarioId);
|
||||||
apiScenarioReportMapper.updateByPrimaryKeySelective(report);
|
apiScenarioReportMapper.updateByPrimaryKeySelective(report);
|
||||||
|
|
||||||
if (scenarioResult.getError() > 0) {
|
if (scenarioResult.getError() > 0) {
|
||||||
|
scenarioAndErrorMap.put(testPlanApiScenario.getApiScenarioId(), TestPlanApiExecuteStatus.FAILD.name());
|
||||||
testPlanApiScenario.setLastResult(ScenarioStatus.Fail.name());
|
testPlanApiScenario.setLastResult(ScenarioStatus.Fail.name());
|
||||||
} else {
|
} else {
|
||||||
|
scenarioAndErrorMap.put(testPlanApiScenario.getApiScenarioId(), TestPlanApiExecuteStatus.SUCCESS.name());
|
||||||
testPlanApiScenario.setLastResult(ScenarioStatus.Success.name());
|
testPlanApiScenario.setLastResult(ScenarioStatus.Success.name());
|
||||||
}
|
}
|
||||||
String passRate = new DecimalFormat("0%").format((float) scenarioResult.getSuccess() / (scenarioResult.getSuccess() + scenarioResult.getError()));
|
String passRate = new DecimalFormat("0%").format((float) scenarioResult.getSuccess() / (scenarioResult.getSuccess() + scenarioResult.getError()));
|
||||||
|
@ -317,18 +322,17 @@ public class ApiScenarioReportService {
|
||||||
testPlanApiScenario.setReportId(report.getId());
|
testPlanApiScenario.setReportId(report.getId());
|
||||||
testPlanApiScenario.setUpdateTime(System.currentTimeMillis());
|
testPlanApiScenario.setUpdateTime(System.currentTimeMillis());
|
||||||
testPlanApiScenarioMapper.updateByPrimaryKeySelective(testPlanApiScenario);
|
testPlanApiScenarioMapper.updateByPrimaryKeySelective(testPlanApiScenario);
|
||||||
// scenarioIds.append(scenarioResult.getName()).append(",");
|
|
||||||
scenarioIdList.add(testPlanApiScenario.getApiScenarioId());
|
scenarioIdList.add(testPlanApiScenario.getApiScenarioId());
|
||||||
scenarioNames.append(report.getName()).append(",");
|
scenarioNames.append(report.getName()).append(",");
|
||||||
|
|
||||||
lastReport = report;
|
lastReport = report;
|
||||||
reportIds.add(report.getId());
|
reportIds.add(report.getId());
|
||||||
}
|
}
|
||||||
// 合并报告
|
|
||||||
// margeReport(result, scenarioIds, scenarioNames, runMode, projectId, userId, reportIds);
|
|
||||||
|
|
||||||
TestPlanReportService testPlanReportService = CommonBeanFactory.getBean(TestPlanReportService.class);
|
TestPlanReportService testPlanReportService = CommonBeanFactory.getBean(TestPlanReportService.class);
|
||||||
testPlanReportService.updateReport(testPlanReportIdList, runMode, lastReport.getTriggerMode(), scenarioIdList);
|
for (String planId :testPlanReportIdList) {
|
||||||
|
testPlanReportService.updateExecuteApis(planId,null,scenarioAndErrorMap,null);
|
||||||
|
}
|
||||||
|
// testPlanReportService.updateReport(testPlanReportIdList, runMode, lastReport.getTriggerMode(), scenarioIdList);
|
||||||
|
|
||||||
return lastReport;
|
return lastReport;
|
||||||
}
|
}
|
||||||
|
|
|
@ -90,21 +90,9 @@ public class TestResultService {
|
||||||
} else if (StringUtils.equalsAny(runMode, ApiRunMode.API_PLAN.name(), ApiRunMode.SCHEDULE_API_PLAN.name(), ApiRunMode.JENKINS_API_PLAN.name())) {
|
} else if (StringUtils.equalsAny(runMode, ApiRunMode.API_PLAN.name(), ApiRunMode.SCHEDULE_API_PLAN.name(), ApiRunMode.JENKINS_API_PLAN.name())) {
|
||||||
//测试计划定时任务-接口执行逻辑的话,需要同步测试计划的报告数据
|
//测试计划定时任务-接口执行逻辑的话,需要同步测试计划的报告数据
|
||||||
if (StringUtils.equals(runMode, ApiRunMode.SCHEDULE_API_PLAN.name())) {
|
if (StringUtils.equals(runMode, ApiRunMode.SCHEDULE_API_PLAN.name())) {
|
||||||
apiDefinitionExecResultService.saveApiResultByScheduleTask(testResult, ApiRunMode.SCHEDULE_API_PLAN.name());
|
apiDefinitionExecResultService.saveApiResultByScheduleTask(testResult,debugReportId, ApiRunMode.SCHEDULE_API_PLAN.name(),ReportTriggerMode.SCHEDULE.name());
|
||||||
List<String> testPlanReportIdList = new ArrayList<>();
|
|
||||||
testPlanReportIdList.add(debugReportId);
|
|
||||||
for (String testPlanReportId : testPlanReportIdList) { // 更新每个测试计划的状态
|
|
||||||
testPlanReportService.checkTestPlanStatus(testPlanReportId);
|
|
||||||
}
|
|
||||||
testPlanReportService.updateReport(testPlanReportIdList, ApiRunMode.SCHEDULE_API_PLAN.name(), ReportTriggerMode.SCHEDULE.name());
|
|
||||||
} else if (StringUtils.equals(runMode, ApiRunMode.JENKINS_API_PLAN.name())) {
|
} else if (StringUtils.equals(runMode, ApiRunMode.JENKINS_API_PLAN.name())) {
|
||||||
apiDefinitionExecResultService.saveApiResultByScheduleTask(testResult, ApiRunMode.JENKINS_API_PLAN.name());
|
apiDefinitionExecResultService.saveApiResultByScheduleTask(testResult,debugReportId, ApiRunMode.JENKINS_API_PLAN.name(),ReportTriggerMode.API.name());
|
||||||
List<String> testPlanReportIdList = new ArrayList<>();
|
|
||||||
testPlanReportIdList.add(debugReportId);
|
|
||||||
for (String testPlanReportId : testPlanReportIdList) { // 更新每个测试计划的状态
|
|
||||||
testPlanReportService.checkTestPlanStatus(testPlanReportId);
|
|
||||||
}
|
|
||||||
testPlanReportService.updateReport(testPlanReportIdList, ApiRunMode.JENKINS_API_PLAN.name(), ReportTriggerMode.API.name());
|
|
||||||
} else {
|
} else {
|
||||||
apiDefinitionExecResultService.saveApiResult(testResult, ApiRunMode.API_PLAN.name(), TriggerMode.MANUAL.name());
|
apiDefinitionExecResultService.saveApiResult(testResult, ApiRunMode.API_PLAN.name(), TriggerMode.MANUAL.name());
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@ package io.metersphere.base.mapper.ext;
|
||||||
|
|
||||||
import io.metersphere.api.dto.definition.ApiTestCaseRequest;
|
import io.metersphere.api.dto.definition.ApiTestCaseRequest;
|
||||||
import io.metersphere.api.dto.definition.TestPlanApiCaseDTO;
|
import io.metersphere.api.dto.definition.TestPlanApiCaseDTO;
|
||||||
|
import io.metersphere.base.domain.ApiTestCaseWithBLOBs;
|
||||||
import io.metersphere.base.domain.TestPlanApiCase;
|
import io.metersphere.base.domain.TestPlanApiCase;
|
||||||
import org.apache.ibatis.annotations.Param;
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
|
@ -21,4 +22,6 @@ public interface ExtTestPlanApiCaseMapper {
|
||||||
List<String> getStatusByTestPlanId(String id);
|
List<String> getStatusByTestPlanId(String id);
|
||||||
|
|
||||||
List<String> selectIds(@Param("request") ApiTestCaseRequest request);
|
List<String> selectIds(@Param("request") ApiTestCaseRequest request);
|
||||||
|
|
||||||
|
ApiTestCaseWithBLOBs getApiTestCaseById(String testPlanApiCaseId);
|
||||||
}
|
}
|
|
@ -13,7 +13,11 @@
|
||||||
WHERE test_plan_id = #{request.testPlanId} and api_case_id = #{request.apiCaseId}
|
WHERE test_plan_id = #{request.testPlanId} and api_case_id = #{request.apiCaseId}
|
||||||
)
|
)
|
||||||
</insert>
|
</insert>
|
||||||
|
<select id="getApiTestCaseById" resultType="io.metersphere.base.domain.ApiTestCaseWithBLOBs">
|
||||||
|
SELECT t.* FROM api_test_case t
|
||||||
|
INNER JOIN test_plan_api_case tpac ON t.id = tpac.api_case_id
|
||||||
|
WHERE tpac.id = #{0}
|
||||||
|
</select>
|
||||||
<select id="list" resultType="io.metersphere.api.dto.definition.TestPlanApiCaseDTO">
|
<select id="list" resultType="io.metersphere.api.dto.definition.TestPlanApiCaseDTO">
|
||||||
select
|
select
|
||||||
t.id, t.environment_id, t.create_time, t.update_time,
|
t.id, t.environment_id, t.create_time, t.update_time,
|
||||||
|
|
|
@ -57,6 +57,12 @@
|
||||||
inner join project p on lt.project_id = p.id
|
inner join project p on lt.project_id = p.id
|
||||||
<where>
|
<where>
|
||||||
tplc.test_plan_id = #{request.testPlanId}
|
tplc.test_plan_id = #{request.testPlanId}
|
||||||
|
<if test="request.caseIds != null and request.caseIds.size > 0">
|
||||||
|
AND lt.id IN
|
||||||
|
<foreach collection="request.caseIds" item="value" separator="," open="(" close=")">
|
||||||
|
#{value}
|
||||||
|
</foreach>
|
||||||
|
</if>
|
||||||
<if test="request.projectId != null and request.projectId != ''">
|
<if test="request.projectId != null and request.projectId != ''">
|
||||||
and lt.project_id = #{request.projectId}
|
and lt.project_id = #{request.projectId}
|
||||||
</if>
|
</if>
|
||||||
|
|
|
@ -30,6 +30,13 @@
|
||||||
and t.test_plan_id = #{request.planId}
|
and t.test_plan_id = #{request.planId}
|
||||||
</if>
|
</if>
|
||||||
where 1
|
where 1
|
||||||
|
|
||||||
|
<if test="request.scenarioIds != null and request.scenarioIds.size() > 0">
|
||||||
|
and c.id in
|
||||||
|
<foreach collection="request.scenarioIds" item="caseId" separator="," open="(" close=")">
|
||||||
|
#{caseId}
|
||||||
|
</foreach>
|
||||||
|
</if>
|
||||||
<if test="request.ids != null and request.ids.size() > 0">
|
<if test="request.ids != null and request.ids.size() > 0">
|
||||||
<if test="request.projectId != null and request.projectId!=''">
|
<if test="request.projectId != null and request.projectId!=''">
|
||||||
and c.project_id = #{request.projectId}
|
and c.project_id = #{request.projectId}
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
package io.metersphere.commons.constants;
|
||||||
|
|
||||||
|
public enum TestPlanApiExecuteStatus {
|
||||||
|
PREPARE,RUNNING,SUCCESS,FAILD
|
||||||
|
}
|
|
@ -9,7 +9,6 @@ import io.metersphere.commons.constants.OperLogConstants;
|
||||||
import io.metersphere.commons.constants.PermissionConstants;
|
import io.metersphere.commons.constants.PermissionConstants;
|
||||||
import io.metersphere.commons.utils.PageUtils;
|
import io.metersphere.commons.utils.PageUtils;
|
||||||
import io.metersphere.commons.utils.Pager;
|
import io.metersphere.commons.utils.Pager;
|
||||||
import io.metersphere.commons.utils.SessionUtils;
|
|
||||||
import io.metersphere.log.annotation.MsAuditLog;
|
import io.metersphere.log.annotation.MsAuditLog;
|
||||||
import io.metersphere.service.CheckPermissionService;
|
import io.metersphere.service.CheckPermissionService;
|
||||||
import io.metersphere.track.dto.ApiRunConfigDTO;
|
import io.metersphere.track.dto.ApiRunConfigDTO;
|
||||||
|
@ -162,4 +161,5 @@ public class TestPlanController {
|
||||||
String apiRunConfig = JSONObject.toJSONString(api);
|
String apiRunConfig = JSONObject.toJSONString(api);
|
||||||
return testPlanService.run(testplanRunRequest.getTestPlanId(), testplanRunRequest.getProjectId(), testplanRunRequest.getUserId(), testplanRunRequest.getTriggerMode(), apiRunConfig);
|
return testPlanService.run(testplanRunRequest.getTestPlanId(), testplanRunRequest.getProjectId(), testplanRunRequest.getUserId(), testplanRunRequest.getTriggerMode(), apiRunConfig);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
package io.metersphere.track.dto;
|
||||||
|
|
||||||
|
import io.metersphere.base.domain.TestPlanReport;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author song.tianyang
|
||||||
|
* @Date 2021/7/20 11:22 上午
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
public class TestPlanScheduleReportInfoDTO {
|
||||||
|
private TestPlanReport testPlanReport;
|
||||||
|
private Map<String, String> planScenarioIdMap = new LinkedHashMap<>();
|
||||||
|
private Map<String, String> apiTestCaseIdMap = new LinkedHashMap<>();
|
||||||
|
private Map<String, String> performanceIdMap = new LinkedHashMap<>();
|
||||||
|
}
|
|
@ -492,4 +492,8 @@ public class TestPlanApiCaseService {
|
||||||
.andStatusEqualTo("error");
|
.andStatusEqualTo("error");
|
||||||
return testPlanApiCaseMapper.countByExample(example) > 0 ? true : false;
|
return testPlanApiCaseMapper.countByExample(example) > 0 ? true : false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ApiTestCaseWithBLOBs getApiTestCaseById(String testPlanApiCaseId) {
|
||||||
|
return extTestPlanApiCaseMapper.getApiTestCaseById(testPlanApiCaseId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,9 +3,14 @@ package io.metersphere.track.service;
|
||||||
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSON;
|
||||||
import com.alibaba.fastjson.JSONArray;
|
import com.alibaba.fastjson.JSONArray;
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import io.metersphere.api.dto.automation.ApiScenarioDTO;
|
||||||
|
import io.metersphere.api.dto.automation.TestPlanScenarioRequest;
|
||||||
|
import io.metersphere.api.dto.definition.ApiTestCaseRequest;
|
||||||
|
import io.metersphere.api.dto.definition.TestPlanApiCaseDTO;
|
||||||
import io.metersphere.base.domain.*;
|
import io.metersphere.base.domain.*;
|
||||||
import io.metersphere.base.mapper.*;
|
import io.metersphere.base.mapper.*;
|
||||||
import io.metersphere.base.mapper.ext.ExtTestPlanApiCaseMapper;
|
import io.metersphere.base.mapper.ext.ExtTestPlanApiCaseMapper;
|
||||||
|
import io.metersphere.base.mapper.ext.ExtTestPlanLoadCaseMapper;
|
||||||
import io.metersphere.base.mapper.ext.ExtTestPlanMapper;
|
import io.metersphere.base.mapper.ext.ExtTestPlanMapper;
|
||||||
import io.metersphere.base.mapper.ext.ExtTestPlanReportMapper;
|
import io.metersphere.base.mapper.ext.ExtTestPlanReportMapper;
|
||||||
import io.metersphere.commons.constants.*;
|
import io.metersphere.commons.constants.*;
|
||||||
|
@ -18,15 +23,18 @@ import io.metersphere.notice.service.NoticeSendService;
|
||||||
import io.metersphere.service.SystemParameterService;
|
import io.metersphere.service.SystemParameterService;
|
||||||
import io.metersphere.track.Factory.ReportComponentFactory;
|
import io.metersphere.track.Factory.ReportComponentFactory;
|
||||||
import io.metersphere.track.domain.ReportComponent;
|
import io.metersphere.track.domain.ReportComponent;
|
||||||
|
import io.metersphere.track.domain.ReportResultComponent;
|
||||||
import io.metersphere.track.dto.*;
|
import io.metersphere.track.dto.*;
|
||||||
import io.metersphere.track.request.report.QueryTestPlanReportRequest;
|
import io.metersphere.track.request.report.QueryTestPlanReportRequest;
|
||||||
import io.metersphere.track.request.report.TestPlanReportSaveRequest;
|
import io.metersphere.track.request.report.TestPlanReportSaveRequest;
|
||||||
import io.metersphere.track.request.testcase.QueryTestPlanRequest;
|
import io.metersphere.track.request.testcase.QueryTestPlanRequest;
|
||||||
import io.metersphere.track.request.testplan.LoadCaseRequest;
|
import io.metersphere.track.request.testplan.LoadCaseRequest;
|
||||||
import org.apache.commons.collections.CollectionUtils;
|
import org.apache.commons.collections.CollectionUtils;
|
||||||
|
import org.apache.commons.collections.MapUtils;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.apache.ibatis.session.SqlSession;
|
||||||
|
import org.apache.ibatis.session.SqlSessionFactory;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
@ -36,18 +44,18 @@ import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author song.tianyang
|
* @author song.tianyang
|
||||||
* @Date 2021/1/8 4:34 下午
|
* 2021/1/8 4:34 下午
|
||||||
* @Description
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
@Transactional(rollbackFor = Exception.class)
|
|
||||||
public class TestPlanReportService {
|
public class TestPlanReportService {
|
||||||
@Resource
|
@Resource
|
||||||
TestPlanReportMapper testPlanReportMapper;
|
TestPlanReportMapper testPlanReportMapper;
|
||||||
@Resource
|
@Resource
|
||||||
TestPlanReportDataMapper testPlanReportDataMapper;
|
TestPlanReportDataMapper testPlanReportDataMapper;
|
||||||
@Resource
|
@Resource
|
||||||
|
ExtTestPlanLoadCaseMapper extTestPlanLoadCaseMapper;
|
||||||
|
@Resource
|
||||||
TestPlanApiScenarioMapper testPlanScenarioCaseMapper;
|
TestPlanApiScenarioMapper testPlanScenarioCaseMapper;
|
||||||
@Resource
|
@Resource
|
||||||
TestPlanApiCaseMapper testPlanApiCaseMapper;
|
TestPlanApiCaseMapper testPlanApiCaseMapper;
|
||||||
|
@ -59,13 +67,16 @@ public class TestPlanReportService {
|
||||||
ExtTestPlanMapper extTestPlanMapper;
|
ExtTestPlanMapper extTestPlanMapper;
|
||||||
@Resource
|
@Resource
|
||||||
ExtTestPlanApiCaseMapper extTestPlanApiCaseMapper;
|
ExtTestPlanApiCaseMapper extTestPlanApiCaseMapper;
|
||||||
@Resource
|
// @Resource
|
||||||
TestPlanLoadCaseService testPlanLoadCaseService;
|
// TestPlanLoadCaseService testPlanLoadCaseService;
|
||||||
@Resource
|
// @Resource
|
||||||
TestPlanService testPlanService;
|
// TestPlanService testPlanService;
|
||||||
@Resource
|
@Resource
|
||||||
LoadTestReportMapper loadTestReportMapper;
|
LoadTestReportMapper loadTestReportMapper;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
SqlSessionFactory sqlSessionFactory;
|
||||||
|
|
||||||
private final ExecutorService executorService = Executors.newFixedThreadPool(20);
|
private final ExecutorService executorService = Executors.newFixedThreadPool(20);
|
||||||
|
|
||||||
public List<TestPlanReportDTO> list(QueryTestPlanReportRequest request) {
|
public List<TestPlanReportDTO> list(QueryTestPlanReportRequest request) {
|
||||||
|
@ -74,20 +85,81 @@ public class TestPlanReportService {
|
||||||
if (StringUtils.isNotBlank(projectId)) {
|
if (StringUtils.isNotBlank(projectId)) {
|
||||||
request.setProjectId(projectId);
|
request.setProjectId(projectId);
|
||||||
}
|
}
|
||||||
List<TestPlanReportDTO> returnList = extTestPlanReportMapper.list(request);
|
return extTestPlanReportMapper.list(request);
|
||||||
return returnList;
|
}
|
||||||
|
|
||||||
|
public TestPlanScheduleReportInfoDTO genTestPlanReportBySchedule(String projectID, String planId, String userId, String triggerMode) {
|
||||||
|
Map<String, String> planScenarioIdMap = new LinkedHashMap<>();
|
||||||
|
Map<String, String> apiTestCaseIdMap = new LinkedHashMap<>();
|
||||||
|
Map<String, String> performanceIdMap = new LinkedHashMap<>();
|
||||||
|
|
||||||
|
TestPlanApiScenarioExample scenarioCaseExample = new TestPlanApiScenarioExample();
|
||||||
|
scenarioCaseExample.createCriteria().andTestPlanIdEqualTo(planId);
|
||||||
|
List<TestPlanApiScenario> testPlanApiScenarioList = testPlanScenarioCaseMapper.selectByExample(scenarioCaseExample);
|
||||||
|
for (TestPlanApiScenario model : testPlanApiScenarioList) {
|
||||||
|
planScenarioIdMap.put(model.getApiScenarioId(), model.getId());
|
||||||
|
}
|
||||||
|
TestPlanApiCaseExample apiCaseExample = new TestPlanApiCaseExample();
|
||||||
|
apiCaseExample.createCriteria().andTestPlanIdEqualTo(planId);
|
||||||
|
List<TestPlanApiCase> testPlanApiCaseList = testPlanApiCaseMapper.selectByExample(apiCaseExample);
|
||||||
|
for (TestPlanApiCase model :
|
||||||
|
testPlanApiCaseList) {
|
||||||
|
apiTestCaseIdMap.put(model.getApiCaseId(), model.getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
LoadCaseRequest loadCaseRequest = new LoadCaseRequest();
|
||||||
|
loadCaseRequest.setTestPlanId(planId);
|
||||||
|
loadCaseRequest.setProjectId(projectID);
|
||||||
|
List<TestPlanLoadCaseDTO> testPlanLoadCaseDTOList = extTestPlanLoadCaseMapper.selectTestPlanLoadCaseList(loadCaseRequest);
|
||||||
|
for (TestPlanLoadCaseDTO dto : testPlanLoadCaseDTOList) {
|
||||||
|
performanceIdMap.put(dto.getId(), dto.getLoadCaseId());
|
||||||
|
}
|
||||||
|
|
||||||
|
String planReportId = UUID.randomUUID().toString();
|
||||||
|
|
||||||
|
List<Map<String, String>> apiCaseInfoList = new ArrayList<>();
|
||||||
|
for (String id : apiTestCaseIdMap.keySet()) {
|
||||||
|
Map<String, String> map = new HashMap<>();
|
||||||
|
map.put("id", id);
|
||||||
|
map.put("status", TestPlanApiExecuteStatus.PREPARE.name());
|
||||||
|
apiCaseInfoList.add(map);
|
||||||
|
}
|
||||||
|
List<Map<String, String>> scenarioInfoList = new ArrayList<>();
|
||||||
|
for (String id : planScenarioIdMap.keySet()) {
|
||||||
|
Map<String, String> map = new HashMap<>();
|
||||||
|
map.put("id", id);
|
||||||
|
map.put("status", TestPlanApiExecuteStatus.PREPARE.name());
|
||||||
|
scenarioInfoList.add(map);
|
||||||
|
}
|
||||||
|
List<Map<String, String>> performanceInfoList = new ArrayList<>();
|
||||||
|
for (String id : performanceIdMap.values()) {
|
||||||
|
Map<String, String> map = new HashMap<>();
|
||||||
|
map.put("id", id);
|
||||||
|
map.put("status", TestPlanApiExecuteStatus.PREPARE.name());
|
||||||
|
performanceInfoList.add(map);
|
||||||
|
}
|
||||||
|
TestPlanReportSaveRequest saveRequest = new TestPlanReportSaveRequest(planReportId, planId, userId, triggerMode,
|
||||||
|
apiTestCaseIdMap.size() > 0, planScenarioIdMap.size() > 0, performanceIdMap.size() > 0,
|
||||||
|
JSONArray.toJSONString(apiCaseInfoList), JSONArray.toJSONString(scenarioInfoList), JSONArray.toJSONString(performanceInfoList));
|
||||||
|
TestPlanReport report = this.genTestPlanReport(saveRequest);
|
||||||
|
|
||||||
|
TestPlanScheduleReportInfoDTO returnDTO = new TestPlanScheduleReportInfoDTO();
|
||||||
|
returnDTO.setTestPlanReport(report);
|
||||||
|
returnDTO.setPlanScenarioIdMap(planScenarioIdMap);
|
||||||
|
returnDTO.setApiTestCaseIdMap(apiTestCaseIdMap);
|
||||||
|
returnDTO.setPerformanceIdMap(performanceIdMap);
|
||||||
|
return returnDTO;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* saveRequest.reportId 报告ID(外部传入)
|
* saveRequest.reportId 报告ID(外部传入)
|
||||||
* saveRequest.planId 测试计划ID
|
* saveRequest.planId 测试计划ID
|
||||||
* saveRequest.userId 用户ID
|
* saveRequest.userId 用户ID
|
||||||
* saveRequest.triggerMode 执行方式
|
* saveRequest.triggerMode 执行方式
|
||||||
* saveRequest.countResources 是否统计资源-false的话, 下面三个不同资源是否运行则由参数决定。 true的话则由统计后的结果决定
|
* saveRequest.countResources 是否统计资源-false的话, 下面三个不同资源是否运行则由参数决定。 true的话则由统计后的结果决定
|
||||||
* saveRequest.apiCaseIsExecuting 接口案例是否执行中
|
* saveRequest.apiCaseIsExecuting 接口案例是否执行中
|
||||||
* saveRequest.scenarioIsExecuting 场景案例是否执行中
|
* saveRequest.scenarioIsExecuting 场景案例是否执行中
|
||||||
* saveRequest.performanceIsExecuting 性能案例是否执行中
|
* saveRequest.performanceIsExecuting 性能案例是否执行中
|
||||||
* @return
|
|
||||||
*/
|
*/
|
||||||
public TestPlanReport genTestPlanReport(TestPlanReportSaveRequest saveRequest) {
|
public TestPlanReport genTestPlanReport(TestPlanReportSaveRequest saveRequest) {
|
||||||
TestPlan testPlan = testPlanMapper.selectByPrimaryKey(saveRequest.getPlanId());
|
TestPlan testPlan = testPlanMapper.selectByPrimaryKey(saveRequest.getPlanId());
|
||||||
|
@ -99,7 +171,7 @@ public class TestPlanReportService {
|
||||||
testPlanReport.setUpdateTime(System.currentTimeMillis());
|
testPlanReport.setUpdateTime(System.currentTimeMillis());
|
||||||
try {
|
try {
|
||||||
testPlanReport.setName(testPlan.getName() + "-" + DateUtils.getTimeString(new Date()));
|
testPlanReport.setName(testPlan.getName() + "-" + DateUtils.getTimeString(new Date()));
|
||||||
} catch (Exception e) {
|
} catch (Exception ignored) {
|
||||||
}
|
}
|
||||||
testPlanReport.setTriggerMode(saveRequest.getTriggerMode());
|
testPlanReport.setTriggerMode(saveRequest.getTriggerMode());
|
||||||
testPlanReport.setCreator(saveRequest.getUserId());
|
testPlanReport.setCreator(saveRequest.getUserId());
|
||||||
|
@ -115,36 +187,45 @@ public class TestPlanReportService {
|
||||||
apiExample.createCriteria().andTestPlanIdEqualTo(saveRequest.getPlanId());
|
apiExample.createCriteria().andTestPlanIdEqualTo(saveRequest.getPlanId());
|
||||||
List<String> apiCaseIdList = testPlanApiCaseMapper.selectByExample(apiExample)
|
List<String> apiCaseIdList = testPlanApiCaseMapper.selectByExample(apiExample)
|
||||||
.stream().map(TestPlanApiCase::getApiCaseId).collect(Collectors.toList());
|
.stream().map(TestPlanApiCase::getApiCaseId).collect(Collectors.toList());
|
||||||
if (apiCaseIdList.isEmpty()) {
|
testPlanReport.setIsApiCaseExecuting(!apiCaseIdList.isEmpty());
|
||||||
testPlanReport.setIsApiCaseExecuting(false);
|
|
||||||
} else {
|
|
||||||
testPlanReport.setIsApiCaseExecuting(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
TestPlanApiScenarioExample example = new TestPlanApiScenarioExample();
|
TestPlanApiScenarioExample example = new TestPlanApiScenarioExample();
|
||||||
example.createCriteria().andTestPlanIdEqualTo(saveRequest.getPlanId());
|
example.createCriteria().andTestPlanIdEqualTo(saveRequest.getPlanId());
|
||||||
List<String> scenarioIdList = testPlanScenarioCaseMapper.selectByExample(example)
|
List<String> scenarioIdList = testPlanScenarioCaseMapper.selectByExample(example)
|
||||||
.stream().map(TestPlanApiScenario::getApiScenarioId).collect(Collectors.toList());
|
.stream().map(TestPlanApiScenario::getApiScenarioId).collect(Collectors.toList());
|
||||||
if (scenarioIdList.isEmpty()) {
|
testPlanReport.setIsScenarioExecuting(!scenarioIdList.isEmpty());
|
||||||
testPlanReport.setIsScenarioExecuting(false);
|
|
||||||
} else {
|
|
||||||
testPlanReport.setIsScenarioExecuting(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
LoadCaseRequest loadCaseRequest = new LoadCaseRequest();
|
LoadCaseRequest loadCaseRequest = new LoadCaseRequest();
|
||||||
loadCaseRequest.setTestPlanId(saveRequest.getPlanId());
|
loadCaseRequest.setTestPlanId(saveRequest.getPlanId());
|
||||||
loadCaseRequest.setProjectId(testPlan.getProjectId());
|
loadCaseRequest.setProjectId(testPlan.getProjectId());
|
||||||
List<String> performanceIdList = testPlanLoadCaseService.list(loadCaseRequest)
|
List<String> performanceIdList = extTestPlanLoadCaseMapper.selectTestPlanLoadCaseList(loadCaseRequest)
|
||||||
.stream().map(TestPlanLoadCaseDTO::getLoadCaseId).collect(Collectors.toList());
|
.stream().map(TestPlanLoadCaseDTO::getLoadCaseId).collect(Collectors.toList());
|
||||||
if (performanceIdList.isEmpty()) {
|
testPlanReport.setIsPerformanceExecuting(!performanceIdList.isEmpty());
|
||||||
testPlanReport.setIsPerformanceExecuting(false);
|
|
||||||
} else {
|
|
||||||
testPlanReport.setIsPerformanceExecuting(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
testPlanReportData.setApiCaseInfo(JSONArray.toJSONString(apiCaseIdList));
|
List<Map<String, String>> apiCaseInfoList = new ArrayList<>();
|
||||||
testPlanReportData.setScenarioInfo(JSONArray.toJSONString(scenarioIdList));
|
for (String id : apiCaseIdList) {
|
||||||
testPlanReportData.setPerformanceInfo(JSONArray.toJSONString(performanceIdList));
|
Map<String, String> map = new HashMap<>();
|
||||||
|
map.put("id", id);
|
||||||
|
map.put("status", TestPlanApiExecuteStatus.PREPARE.name());
|
||||||
|
apiCaseInfoList.add(map);
|
||||||
|
}
|
||||||
|
List<Map<String, String>> scenarioInfoList = new ArrayList<>();
|
||||||
|
for (String id : scenarioIdList) {
|
||||||
|
Map<String, String> map = new HashMap<>();
|
||||||
|
map.put("id", id);
|
||||||
|
map.put("status", TestPlanApiExecuteStatus.PREPARE.name());
|
||||||
|
scenarioInfoList.add(map);
|
||||||
|
}
|
||||||
|
List<Map<String, String>> performanceInfoList = new ArrayList<>();
|
||||||
|
for (String id : performanceIdList) {
|
||||||
|
Map<String, String> map = new HashMap<>();
|
||||||
|
map.put("id", id);
|
||||||
|
map.put("status", TestPlanApiExecuteStatus.PREPARE.name());
|
||||||
|
performanceInfoList.add(map);
|
||||||
|
}
|
||||||
|
testPlanReportData.setApiCaseInfo(JSONArray.toJSONString(apiCaseInfoList));
|
||||||
|
testPlanReportData.setScenarioInfo(JSONArray.toJSONString(scenarioInfoList));
|
||||||
|
testPlanReportData.setPerformanceInfo(JSONArray.toJSONString(performanceInfoList));
|
||||||
} else {
|
} else {
|
||||||
testPlanReport.setIsApiCaseExecuting(saveRequest.isApiCaseIsExecuting());
|
testPlanReport.setIsApiCaseExecuting(saveRequest.isApiCaseIsExecuting());
|
||||||
testPlanReport.setIsScenarioExecuting(saveRequest.isScenarioIsExecuting());
|
testPlanReport.setIsScenarioExecuting(saveRequest.isScenarioIsExecuting());
|
||||||
|
@ -162,8 +243,13 @@ public class TestPlanReportService {
|
||||||
testPlanReport.setStatus(APITestStatus.Completed.name());
|
testPlanReport.setStatus(APITestStatus.Completed.name());
|
||||||
}
|
}
|
||||||
|
|
||||||
testPlanReportMapper.insert(testPlanReport);
|
SqlSession sqlSession = sqlSessionFactory.openSession(false);
|
||||||
testPlanReportDataMapper.insert(testPlanReportData);
|
TestPlanReportMapper insertReportMapper = sqlSession.getMapper(TestPlanReportMapper.class);
|
||||||
|
TestPlanReportDataMapper insertReportDataMapper = sqlSession.getMapper(TestPlanReportDataMapper.class);
|
||||||
|
insertReportMapper.insert(testPlanReport);
|
||||||
|
insertReportDataMapper.insert(testPlanReportData);
|
||||||
|
sqlSession.commit();
|
||||||
|
sqlSession.flushStatements();
|
||||||
|
|
||||||
//更新TestPlan状态,改为进行中
|
//更新TestPlan状态,改为进行中
|
||||||
testPlan.setStatus(TestPlanStatus.Underway.name());
|
testPlan.setStatus(TestPlanStatus.Underway.name());
|
||||||
|
@ -200,34 +286,316 @@ public class TestPlanReportService {
|
||||||
returnDTO.setStartTime(report.getStartTime());
|
returnDTO.setStartTime(report.getStartTime());
|
||||||
returnDTO.setEndTime(report.getEndTime());
|
returnDTO.setEndTime(report.getEndTime());
|
||||||
|
|
||||||
String testProject = testPlanService.findTestProjectNameByTestPlanID(report.getTestPlanId());
|
String testProject = extTestPlanMapper.findTestProjectNameByTestPlanID(report.getTestPlanId());
|
||||||
returnDTO.setProjectName(testProject);
|
returnDTO.setProjectName(testProject);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
returnDTO.setId(report.getId());
|
||||||
|
returnDTO.setName(report.getName());
|
||||||
|
returnDTO.setStartTime(report.getStartTime());
|
||||||
|
returnDTO.setEndTime(report.getEndTime());
|
||||||
|
returnDTO.setTestPlanId(report.getTestPlanId());
|
||||||
|
returnDTO.setReportComponents(report.getComponents());
|
||||||
}
|
}
|
||||||
returnDTO.setId(report.getId());
|
|
||||||
returnDTO.setName(report.getName());
|
|
||||||
returnDTO.setStartTime(report.getStartTime());
|
|
||||||
returnDTO.setEndTime(report.getEndTime());
|
|
||||||
returnDTO.setTestPlanId(report.getTestPlanId());
|
|
||||||
returnDTO.setReportComponents(report.getComponents());
|
|
||||||
return returnDTO;
|
return returnDTO;
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized void updateReport(List<String> testPlanReportIdList, String runMode, String triggerMode) {
|
public synchronized void updateReport(List<String> testPlanReportIdList, String runMode, String triggerMode) {
|
||||||
for (String planReportId : testPlanReportIdList) {
|
for (String planReportId : testPlanReportIdList) {
|
||||||
this.countReportByTestPlanReportId(planReportId, runMode, triggerMode,null);
|
this.countReportByTestPlanReportId(planReportId, runMode, triggerMode, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized void updateReport(List<String> testPlanReportIdList, String runMode, String triggerMode,List<String> scenarioIdList) {
|
public synchronized void updateReport(List<String> testPlanReportIdList, String runMode, String triggerMode, List<String> scenarioIdList) {
|
||||||
for (String planReportId : testPlanReportIdList) {
|
for (String planReportId : testPlanReportIdList) {
|
||||||
this.countReportByTestPlanReportId(planReportId, runMode, triggerMode,scenarioIdList);
|
this.countReportByTestPlanReportId(planReportId, runMode, triggerMode, scenarioIdList);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public TestCaseReportMetricDTO countReportData(TestPlanDTO testPlan, TestPlanReportDataWithBLOBs testPlanReportData) {
|
||||||
|
TestCaseReportMetricDTO returnDTO = new TestCaseReportMetricDTO();
|
||||||
|
ReportResultComponent reportResultComponent = new ReportResultComponent(testPlan);
|
||||||
|
reportResultComponent.afterBuild(returnDTO);
|
||||||
|
|
||||||
|
TestCaseReportAdvanceStatusResultDTO statusDTO = new TestCaseReportAdvanceStatusResultDTO();
|
||||||
|
String apiCaseExecuteMapJson = testPlanReportData.getApiCaseInfo();
|
||||||
|
String scenarioExecuteMapJson = testPlanReportData.getScenarioInfo();
|
||||||
|
String loadExecuteMapJson = testPlanReportData.getPerformanceInfo();
|
||||||
|
|
||||||
|
List<TestCaseReportStatusResultDTO> apiResult = new ArrayList<>();
|
||||||
|
List<TestCaseReportStatusResultDTO> scenarioResult = new ArrayList<>();
|
||||||
|
List<TestCaseReportStatusResultDTO> loadResult = new ArrayList<>();
|
||||||
|
|
||||||
|
List<String> faliureApiCaseIdList = new ArrayList<>();
|
||||||
|
List<String> faliureScenarioCaseIdList = new ArrayList<>();
|
||||||
|
List<String> faliureLoadCaseIdList = new ArrayList<>();
|
||||||
|
|
||||||
|
JSONArray apiCaseExecuteArr = new JSONArray();
|
||||||
|
JSONArray scenarioExecuteArr = new JSONArray();
|
||||||
|
JSONArray loadExecuteArr = new JSONArray();
|
||||||
|
if (StringUtils.isNotEmpty(apiCaseExecuteMapJson)) {
|
||||||
|
try {
|
||||||
|
apiCaseExecuteArr = JSONArray.parseArray(apiCaseExecuteMapJson);
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (StringUtils.isNotEmpty(scenarioExecuteMapJson)) {
|
||||||
|
try {
|
||||||
|
scenarioExecuteArr = JSONArray.parseArray(scenarioExecuteMapJson);
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (StringUtils.isNotEmpty(loadExecuteMapJson)) {
|
||||||
|
try {
|
||||||
|
loadExecuteArr = JSONArray.parseArray(loadExecuteMapJson);
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < apiCaseExecuteArr.size(); i++) {
|
||||||
|
JSONObject jsonObj = apiCaseExecuteArr.getJSONObject(i);
|
||||||
|
|
||||||
|
Map<String, Integer> countMap = new HashMap<>();
|
||||||
|
if (jsonObj.containsKey("status")) {
|
||||||
|
String status = jsonObj.getString("status");
|
||||||
|
if (StringUtils.equalsAnyIgnoreCase(status, TestPlanApiExecuteStatus.SUCCESS.name())) {
|
||||||
|
if (countMap.containsKey("Pass")) {
|
||||||
|
countMap.put("Pass", countMap.get("Pass") + 1);
|
||||||
|
} else {
|
||||||
|
countMap.put("Pass", 1);
|
||||||
|
}
|
||||||
|
} else if (StringUtils.equalsAnyIgnoreCase(status, TestPlanApiExecuteStatus.FAILD.name())) {
|
||||||
|
if (jsonObj.containsKey("id")) {
|
||||||
|
faliureApiCaseIdList.add(jsonObj.getString("id"));
|
||||||
|
}
|
||||||
|
if (countMap.containsKey("Failure")) {
|
||||||
|
countMap.put("Failure", countMap.get("Failure") + 1);
|
||||||
|
} else {
|
||||||
|
countMap.put("Failure", 1);
|
||||||
|
}
|
||||||
|
} else if (StringUtils.equalsAnyIgnoreCase(status, TestPlanApiExecuteStatus.PREPARE.name())) {
|
||||||
|
if (jsonObj.containsKey("id")) {
|
||||||
|
faliureApiCaseIdList.add(jsonObj.getString("id"));
|
||||||
|
}
|
||||||
|
if (countMap.containsKey("Skip")) {
|
||||||
|
countMap.put("Skip", countMap.get("Skip") + 1);
|
||||||
|
} else {
|
||||||
|
countMap.put("Skip", 1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (countMap.containsKey("Underway")) {
|
||||||
|
countMap.put("Underway", countMap.get("Underway") + 1);
|
||||||
|
} else {
|
||||||
|
countMap.put("Underway", 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (Map.Entry<String, Integer> entry : countMap.entrySet()) {
|
||||||
|
String status = entry.getKey();
|
||||||
|
Integer value = entry.getValue();
|
||||||
|
TestCaseReportStatusResultDTO dto = new TestCaseReportStatusResultDTO();
|
||||||
|
dto.setStatus(status);
|
||||||
|
dto.setCount(value);
|
||||||
|
apiResult.add(dto);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < scenarioExecuteArr.size(); i++) {
|
||||||
|
JSONObject jsonObj = scenarioExecuteArr.getJSONObject(i);
|
||||||
|
Map<String, Integer> countMap = new HashMap<>();
|
||||||
|
if (jsonObj.containsKey("status")) {
|
||||||
|
String status = jsonObj.getString("status");
|
||||||
|
if (StringUtils.equalsAnyIgnoreCase(status, TestPlanApiExecuteStatus.SUCCESS.name())) {
|
||||||
|
if (countMap.containsKey("Pass")) {
|
||||||
|
countMap.put("Pass", countMap.get("Pass") + 1);
|
||||||
|
} else {
|
||||||
|
countMap.put("Pass", 1);
|
||||||
|
}
|
||||||
|
} else if (StringUtils.equalsAnyIgnoreCase(status, TestPlanApiExecuteStatus.FAILD.name())) {
|
||||||
|
if (jsonObj.containsKey("id")) {
|
||||||
|
faliureScenarioCaseIdList.add(jsonObj.getString("id"));
|
||||||
|
}
|
||||||
|
if (countMap.containsKey("Failure")) {
|
||||||
|
countMap.put("Failure", countMap.get("Failure") + 1);
|
||||||
|
} else {
|
||||||
|
countMap.put("Failure", 1);
|
||||||
|
}
|
||||||
|
} else if (StringUtils.equalsAnyIgnoreCase(status, TestPlanApiExecuteStatus.PREPARE.name())) {
|
||||||
|
if (jsonObj.containsKey("id")) {
|
||||||
|
faliureScenarioCaseIdList.add(jsonObj.getString("id"));
|
||||||
|
}
|
||||||
|
if (countMap.containsKey("Skip")) {
|
||||||
|
countMap.put("Skip", countMap.get("Skip") + 1);
|
||||||
|
} else {
|
||||||
|
countMap.put("Skip", 1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (countMap.containsKey("Underway")) {
|
||||||
|
countMap.put("Underway", countMap.get("Underway") + 1);
|
||||||
|
} else {
|
||||||
|
countMap.put("Underway", 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Map.Entry<String, Integer> entry : countMap.entrySet()) {
|
||||||
|
String status = entry.getKey();
|
||||||
|
Integer value = entry.getValue();
|
||||||
|
TestCaseReportStatusResultDTO dto = new TestCaseReportStatusResultDTO();
|
||||||
|
dto.setStatus(status);
|
||||||
|
dto.setCount(value);
|
||||||
|
scenarioResult.add(dto);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < loadExecuteArr.size(); i++) {
|
||||||
|
JSONObject jsonObj = loadExecuteArr.getJSONObject(i);
|
||||||
|
Map<String, Integer> countMap = new HashMap<>();
|
||||||
|
if (jsonObj.containsKey("status")) {
|
||||||
|
String status = jsonObj.getString("status");
|
||||||
|
if (StringUtils.equalsAnyIgnoreCase(status, TestPlanApiExecuteStatus.SUCCESS.name())) {
|
||||||
|
if (countMap.containsKey("Pass")) {
|
||||||
|
countMap.put("Pass", countMap.get("Pass") + 1);
|
||||||
|
} else {
|
||||||
|
countMap.put("Pass", 1);
|
||||||
|
}
|
||||||
|
} else if (StringUtils.equalsAnyIgnoreCase(status, TestPlanApiExecuteStatus.FAILD.name())) {
|
||||||
|
if (jsonObj.containsKey("id")) {
|
||||||
|
faliureLoadCaseIdList.add(jsonObj.getString("id"));
|
||||||
|
}
|
||||||
|
if (countMap.containsKey("Failure")) {
|
||||||
|
countMap.put("Failure", countMap.get("Failure") + 1);
|
||||||
|
} else {
|
||||||
|
countMap.put("Failure", 1);
|
||||||
|
}
|
||||||
|
} else if (StringUtils.equalsAnyIgnoreCase(status, TestPlanApiExecuteStatus.PREPARE.name())) {
|
||||||
|
if (jsonObj.containsKey("id")) {
|
||||||
|
faliureLoadCaseIdList.add(jsonObj.getString("id"));
|
||||||
|
}
|
||||||
|
if (countMap.containsKey("Skip")) {
|
||||||
|
countMap.put("Skip", countMap.get("Skip") + 1);
|
||||||
|
} else {
|
||||||
|
countMap.put("Skip", 1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (countMap.containsKey("Underway")) {
|
||||||
|
countMap.put("Underway", countMap.get("Underway") + 1);
|
||||||
|
} else {
|
||||||
|
countMap.put("Underway", 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Map.Entry<String, Integer> entry : countMap.entrySet()) {
|
||||||
|
String status = entry.getKey();
|
||||||
|
Integer value = entry.getValue();
|
||||||
|
TestCaseReportStatusResultDTO dto = new TestCaseReportStatusResultDTO();
|
||||||
|
dto.setStatus(status);
|
||||||
|
dto.setCount(value);
|
||||||
|
loadResult.add(dto);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
statusDTO.setApiResult(apiResult);
|
||||||
|
statusDTO.setScenarioResult(scenarioResult);
|
||||||
|
statusDTO.setLoadResult(loadResult);
|
||||||
|
|
||||||
|
returnDTO.setExecuteResult(statusDTO);
|
||||||
|
|
||||||
|
//统计失败用例
|
||||||
|
FailureTestCasesAdvanceDTO failureDto = new FailureTestCasesAdvanceDTO();
|
||||||
|
failureDto.setFunctionalTestCases(new ArrayList<>());
|
||||||
|
if (!faliureApiCaseIdList.isEmpty()) {
|
||||||
|
TestPlanApiCaseService testPlanApiCaseService = CommonBeanFactory.getBean(TestPlanApiCaseService.class);
|
||||||
|
ApiTestCaseRequest request = new ApiTestCaseRequest();
|
||||||
|
request.setPlanId(testPlan.getId());
|
||||||
|
request.setIds(faliureApiCaseIdList);
|
||||||
|
List<TestPlanApiCaseDTO> testPlanApiCaseDTOList = testPlanApiCaseService.list(request);
|
||||||
|
failureDto.setApiTestCases(testPlanApiCaseDTOList);
|
||||||
|
} else {
|
||||||
|
failureDto.setApiTestCases(new ArrayList<>());
|
||||||
|
}
|
||||||
|
if (!faliureScenarioCaseIdList.isEmpty()) {
|
||||||
|
TestPlanScenarioCaseService testPlanScenarioCaseService = CommonBeanFactory.getBean(TestPlanScenarioCaseService.class);
|
||||||
|
|
||||||
|
TestPlanScenarioRequest request = new TestPlanScenarioRequest();
|
||||||
|
request.setPlanId(testPlan.getId());
|
||||||
|
request.setScenarioIds(faliureScenarioCaseIdList);
|
||||||
|
List<ApiScenarioDTO> scenarioDTOS = testPlanScenarioCaseService.list(request);
|
||||||
|
failureDto.setScenarioTestCases(scenarioDTOS);
|
||||||
|
} else {
|
||||||
|
failureDto.setScenarioTestCases(new ArrayList<>());
|
||||||
|
}
|
||||||
|
if (!faliureLoadCaseIdList.isEmpty()) {
|
||||||
|
TestPlanLoadCaseService testPlanLoadCaseService = CommonBeanFactory.getBean(TestPlanLoadCaseService.class);
|
||||||
|
LoadCaseRequest request = new LoadCaseRequest();
|
||||||
|
request.setTestPlanId(testPlan.getId());
|
||||||
|
request.setIds(faliureLoadCaseIdList);
|
||||||
|
List<TestPlanLoadCaseDTO> loadDTOs = testPlanLoadCaseService.list(request);
|
||||||
|
failureDto.setLoadTestCases(loadDTOs);
|
||||||
|
} else {
|
||||||
|
failureDto.setLoadTestCases(new ArrayList<>());
|
||||||
|
}
|
||||||
|
returnDTO.setFailureTestCases(failureDto);
|
||||||
|
|
||||||
|
return returnDTO;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateReport(TestPlanReportDataWithBLOBs testPlanReportData, boolean apiCaseIsOk, boolean scenarioIsOk, boolean performanceIsOk) {
|
||||||
|
TestPlanReport testPlanReport = testPlanReportMapper.selectByPrimaryKey(testPlanReportData.getTestPlanReportId());
|
||||||
|
if (testPlanReport == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
testPlanReport.setEndTime(System.currentTimeMillis());
|
||||||
|
testPlanReport.setUpdateTime(System.currentTimeMillis());
|
||||||
|
if (apiCaseIsOk) {
|
||||||
|
testPlanReport.setIsApiCaseExecuting(false);
|
||||||
|
}
|
||||||
|
if (scenarioIsOk) {
|
||||||
|
testPlanReport.setIsScenarioExecuting(false);
|
||||||
|
}
|
||||||
|
if (performanceIsOk) {
|
||||||
|
testPlanReport.setIsPerformanceExecuting(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
int[] componentIndexArr = new int[]{1, 3, 4};
|
||||||
|
testPlanReport.setComponents(JSONArray.toJSONString(componentIndexArr));
|
||||||
|
|
||||||
|
|
||||||
|
QueryTestPlanRequest queryTestPlanRequest = new QueryTestPlanRequest();
|
||||||
|
queryTestPlanRequest.setId(testPlanReport.getTestPlanId());
|
||||||
|
TestPlanDTO testPlan = extTestPlanMapper.list(queryTestPlanRequest).get(0);
|
||||||
|
|
||||||
|
|
||||||
|
TestPlanService testPlanService = CommonBeanFactory.getBean(TestPlanService.class);
|
||||||
|
JSONArray componentIds = JSONArray.parseArray(testPlanReport.getComponents());
|
||||||
|
List<ReportComponent> components = ReportComponentFactory.createComponents(componentIds.toJavaList(String.class), testPlan);
|
||||||
|
testPlanService.buildApiCaseReport(testPlanReport.getTestPlanId(), components);
|
||||||
|
testPlanService.buildScenarioCaseReport(testPlanReport.getTestPlanId(), components);
|
||||||
|
testPlanService.buildLoadCaseReport(testPlanReport.getTestPlanId(), components);
|
||||||
|
|
||||||
|
|
||||||
|
TestCaseReportMetricDTO testCaseReportMetricDTO = this.countReportData(testPlan, testPlanReportData);
|
||||||
|
|
||||||
|
//统计执行的场景ID
|
||||||
|
testPlanReportData.setExecuteResult(JSONObject.toJSONString(testCaseReportMetricDTO.getExecuteResult()));
|
||||||
|
testPlanReportData.setFailurTestCases(JSONObject.toJSONString(testCaseReportMetricDTO.getFailureTestCases()));
|
||||||
|
testPlanReportData.setModuleExecuteResult(JSONArray.toJSONString(testCaseReportMetricDTO.getModuleExecuteResult()));
|
||||||
|
testPlanReportDataMapper.updateByPrimaryKeyWithBLOBs(testPlanReportData);
|
||||||
|
|
||||||
|
|
||||||
|
String testPlanStatus = this.getTestPlanReportStatus(testPlanReport, testPlanReportData);
|
||||||
|
testPlanReport.setStatus(testPlanStatus);
|
||||||
|
this.update(testPlanReport);
|
||||||
|
}
|
||||||
|
|
||||||
public void checkTestPlanStatus(String planReportId) {
|
public void checkTestPlanStatus(String planReportId) {
|
||||||
try {
|
try {
|
||||||
TestPlanReport testPlanReport = testPlanReportMapper.selectByPrimaryKey(planReportId);
|
TestPlanReport testPlanReport = testPlanReportMapper.selectByPrimaryKey(planReportId);
|
||||||
|
|
||||||
|
TestPlanService testPlanService = CommonBeanFactory.getBean(TestPlanService.class);
|
||||||
testPlanService.checkStatus(testPlanReport.getTestPlanId());
|
testPlanService.checkStatus(testPlanReport.getTestPlanId());
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
LogUtil.error(e.getMessage(), e);
|
LogUtil.error(e.getMessage(), e);
|
||||||
|
@ -239,7 +607,7 @@ public class TestPlanReportService {
|
||||||
* @param resourceRunMode 资源的运行模式,triggerMode非Scedule可以为null
|
* @param resourceRunMode 资源的运行模式,triggerMode非Scedule可以为null
|
||||||
* @param triggerMode 触发方式 ReportTriggerMode.enum
|
* @param triggerMode 触发方式 ReportTriggerMode.enum
|
||||||
*/
|
*/
|
||||||
public void countReportByTestPlanReportId(String planReportId, String resourceRunMode, String triggerMode,List<String> scenarioIdList) {
|
public void countReportByTestPlanReportId(String planReportId, String resourceRunMode, String triggerMode, List<String> scenarioIdList) {
|
||||||
TestPlanReport testPlanReport = testPlanReportMapper.selectByPrimaryKey(planReportId);
|
TestPlanReport testPlanReport = testPlanReportMapper.selectByPrimaryKey(planReportId);
|
||||||
|
|
||||||
QueryTestPlanRequest queryTestPlanRequest = new QueryTestPlanRequest();
|
QueryTestPlanRequest queryTestPlanRequest = new QueryTestPlanRequest();
|
||||||
|
@ -272,7 +640,7 @@ public class TestPlanReportService {
|
||||||
}
|
}
|
||||||
testPlanReport.setComponents(JSONArray.toJSONString(componentIndexArr));
|
testPlanReport.setComponents(JSONArray.toJSONString(componentIndexArr));
|
||||||
|
|
||||||
// JSONObject content = JSONObject.parseObject("{\"components\":[1,2,3,4,5]}");
|
TestPlanService testPlanService = CommonBeanFactory.getBean(TestPlanService.class);
|
||||||
JSONArray componentIds = JSONArray.parseArray(testPlanReport.getComponents());
|
JSONArray componentIds = JSONArray.parseArray(testPlanReport.getComponents());
|
||||||
List<ReportComponent> components = ReportComponentFactory.createComponents(componentIds.toJavaList(String.class), testPlan);
|
List<ReportComponent> components = ReportComponentFactory.createComponents(componentIds.toJavaList(String.class), testPlan);
|
||||||
testPlanService.buildApiCaseReport(testPlanReport.getTestPlanId(), components);
|
testPlanService.buildApiCaseReport(testPlanReport.getTestPlanId(), components);
|
||||||
|
@ -326,37 +694,36 @@ public class TestPlanReportService {
|
||||||
testPlanReportData = testPlanReportDataList.get(0);
|
testPlanReportData = testPlanReportDataList.get(0);
|
||||||
|
|
||||||
if (CollectionUtils.isNotEmpty(scenarioIdList)
|
if (CollectionUtils.isNotEmpty(scenarioIdList)
|
||||||
&&StringUtils.equalsAny(triggerMode, ReportTriggerMode.SCHEDULE.name(), ReportTriggerMode.API.name())
|
&& StringUtils.equalsAny(triggerMode, ReportTriggerMode.SCHEDULE.name(), ReportTriggerMode.API.name())
|
||||||
&& StringUtils.equalsAny(resourceRunMode, ApiRunMode.SCHEDULE_SCENARIO_PLAN.name(), ApiRunMode.JENKINS_SCENARIO_PLAN.name())) {
|
&& StringUtils.equalsAny(resourceRunMode, ApiRunMode.SCHEDULE_SCENARIO_PLAN.name(), ApiRunMode.JENKINS_SCENARIO_PLAN.name())) {
|
||||||
try{
|
try {
|
||||||
List<String> scenarioListArr = JSONArray.parseArray(testPlanReportData.getScenarioInfo(),String.class);
|
List<String> scenarioListArr = JSONArray.parseArray(testPlanReportData.getScenarioInfo(), String.class);
|
||||||
TestCaseReportAdvanceStatusResultDTO savedDTO = JSONObject.parseObject(testPlanReportData.getExecuteResult(),TestCaseReportAdvanceStatusResultDTO.class);
|
TestCaseReportAdvanceStatusResultDTO savedDTO = JSONObject.parseObject(testPlanReportData.getExecuteResult(), TestCaseReportAdvanceStatusResultDTO.class);
|
||||||
List<String> executeScenarioList = new ArrayList<>();
|
List<String> executeScenarioList = new ArrayList<>();
|
||||||
if(savedDTO != null){
|
if (savedDTO != null) {
|
||||||
if(savedDTO.getExecutedScenarioIds() != null){
|
if (savedDTO.getExecutedScenarioIds() != null) {
|
||||||
executeScenarioList = savedDTO.getExecutedScenarioIds();
|
executeScenarioList = savedDTO.getExecutedScenarioIds();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (String scenarioId : scenarioIdList) {
|
for (String scenarioId : scenarioIdList) {
|
||||||
if (!executeScenarioList.contains(scenarioId)) {
|
if (!executeScenarioList.contains(scenarioId)) {
|
||||||
executeScenarioList.add(scenarioId);
|
executeScenarioList.add(scenarioId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(testCaseReportMetricDTO.getExecuteResult() == null){
|
if (testCaseReportMetricDTO.getExecuteResult() == null) {
|
||||||
TestCaseReportAdvanceStatusResultDTO executeResultDTO = new TestCaseReportAdvanceStatusResultDTO();
|
TestCaseReportAdvanceStatusResultDTO executeResultDTO = new TestCaseReportAdvanceStatusResultDTO();
|
||||||
testCaseReportMetricDTO.setExecuteResult(executeResultDTO);
|
testCaseReportMetricDTO.setExecuteResult(executeResultDTO);
|
||||||
}
|
}
|
||||||
testCaseReportMetricDTO.getExecuteResult().setExecutedScenarioIds(executeScenarioList);
|
testCaseReportMetricDTO.getExecuteResult().setExecutedScenarioIds(executeScenarioList);
|
||||||
|
|
||||||
if(!CollectionUtils.isEqualCollection(scenarioListArr,executeScenarioList)){
|
if (!CollectionUtils.isEqualCollection(scenarioListArr, executeScenarioList)) {
|
||||||
testPlanReport.setIsScenarioExecuting(true);
|
testPlanReport.setIsScenarioExecuting(true);
|
||||||
}
|
}
|
||||||
}catch (Exception e){
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//统计执行的场景ID
|
//统计执行的场景ID
|
||||||
|
|
||||||
testPlanReportData.setExecuteResult(JSONObject.toJSONString(testCaseReportMetricDTO.getExecuteResult()));
|
testPlanReportData.setExecuteResult(JSONObject.toJSONString(testCaseReportMetricDTO.getExecuteResult()));
|
||||||
testPlanReportData.setFailurTestCases(JSONObject.toJSONString(testCaseReportMetricDTO.getFailureTestCases()));
|
testPlanReportData.setFailurTestCases(JSONObject.toJSONString(testCaseReportMetricDTO.getFailureTestCases()));
|
||||||
testPlanReportData.setModuleExecuteResult(JSONArray.toJSONString(testCaseReportMetricDTO.getModuleExecuteResult()));
|
testPlanReportData.setModuleExecuteResult(JSONArray.toJSONString(testCaseReportMetricDTO.getModuleExecuteResult()));
|
||||||
|
@ -390,21 +757,21 @@ public class TestPlanReportService {
|
||||||
JSONObject failurCaseObject = JSONObject.parseObject(failCaseString);
|
JSONObject failurCaseObject = JSONObject.parseObject(failCaseString);
|
||||||
if (failurCaseObject.containsKey("apiTestCases") && failurCaseObject.getJSONArray("apiTestCases").size() >= 0) {
|
if (failurCaseObject.containsKey("apiTestCases") && failurCaseObject.getJSONArray("apiTestCases").size() >= 0) {
|
||||||
JSONArray array = failurCaseObject.getJSONArray("apiTestCases");
|
JSONArray array = failurCaseObject.getJSONArray("apiTestCases");
|
||||||
if(array.size() > 0){
|
if (array.size() > 0) {
|
||||||
status = TestPlanReportStatus.FAILED.name();
|
status = TestPlanReportStatus.FAILED.name();
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (failurCaseObject.containsKey("loadTestCases") && failurCaseObject.getJSONArray("loadTestCases").size() >= 0) {
|
if (failurCaseObject.containsKey("loadTestCases") && failurCaseObject.getJSONArray("loadTestCases").size() >= 0) {
|
||||||
JSONArray array = failurCaseObject.getJSONArray("loadTestCases");
|
JSONArray array = failurCaseObject.getJSONArray("loadTestCases");
|
||||||
if(array.size() > 0){
|
if (array.size() > 0) {
|
||||||
status = TestPlanReportStatus.FAILED.name();
|
status = TestPlanReportStatus.FAILED.name();
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (failurCaseObject.containsKey("scenarioTestCases") && failurCaseObject.getJSONArray("scenarioTestCases").size() >= 0) {
|
if (failurCaseObject.containsKey("scenarioTestCases") && failurCaseObject.getJSONArray("scenarioTestCases").size() >= 0) {
|
||||||
JSONArray array = failurCaseObject.getJSONArray("scenarioTestCases");
|
JSONArray array = failurCaseObject.getJSONArray("scenarioTestCases");
|
||||||
if(array.size() > 0){
|
if (array.size() > 0) {
|
||||||
status = TestPlanReportStatus.FAILED.name();
|
status = TestPlanReportStatus.FAILED.name();
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
@ -443,7 +810,7 @@ public class TestPlanReportService {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void sendMessage(TestPlanReport testPlanReport) {
|
public void sendMessage(TestPlanReport testPlanReport) {
|
||||||
TestPlan testPlan = testPlanService.getTestPlan(testPlanReport.getTestPlanId());
|
TestPlan testPlan = testPlanMapper.selectByPrimaryKey(testPlanReport.getTestPlanId());
|
||||||
assert testPlan != null;
|
assert testPlan != null;
|
||||||
SystemParameterService systemParameterService = CommonBeanFactory.getBean(SystemParameterService.class);
|
SystemParameterService systemParameterService = CommonBeanFactory.getBean(SystemParameterService.class);
|
||||||
NoticeSendService noticeSendService = CommonBeanFactory.getBean(NoticeSendService.class);
|
NoticeSendService noticeSendService = CommonBeanFactory.getBean(NoticeSendService.class);
|
||||||
|
@ -511,19 +878,20 @@ public class TestPlanReportService {
|
||||||
* @param performaneReportIDList
|
* @param performaneReportIDList
|
||||||
*/
|
*/
|
||||||
public void updatePerformanceInfo(TestPlanReport testPlanReport, List<String> performaneReportIDList, String triggerMode) {
|
public void updatePerformanceInfo(TestPlanReport testPlanReport, List<String> performaneReportIDList, String triggerMode) {
|
||||||
TestPlanReportDataExample example = new TestPlanReportDataExample();
|
// TestPlanReportDataExample example = new TestPlanReportDataExample();
|
||||||
example.createCriteria().andTestPlanReportIdEqualTo(testPlanReport.getId());
|
// example.createCriteria().andTestPlanReportIdEqualTo(testPlanReport.getId());
|
||||||
List<TestPlanReportDataWithBLOBs> reportDataList = testPlanReportDataMapper.selectByExampleWithBLOBs(example);
|
// List<TestPlanReportDataWithBLOBs> reportDataList = testPlanReportDataMapper.selectByExampleWithBLOBs(example);
|
||||||
for (TestPlanReportDataWithBLOBs models : reportDataList) {
|
// for (TestPlanReportDataWithBLOBs models : reportDataList) {
|
||||||
models.setPerformanceInfo(JSONArray.toJSONString(performaneReportIDList));
|
// models.setPerformanceInfo(JSONArray.toJSONString(performaneReportIDList));
|
||||||
testPlanReportDataMapper.updateByPrimaryKeyWithBLOBs(models);
|
// testPlanReportDataMapper.updateByPrimaryKeyWithBLOBs(models);
|
||||||
}
|
// }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 虽然kafka已经设置了topic推送,但是当执行机器性能不够时会影响到报告状态当修改
|
* 虽然kafka已经设置了topic推送,但是当执行机器性能不够时会影响到报告状态当修改
|
||||||
* 同时如果执行过程中报告删除,那么此时也应当记为失败。
|
* 同时如果执行过程中报告删除,那么此时也应当记为失败。
|
||||||
*/
|
*/
|
||||||
List<String> updatePerformaneReportIDList = new ArrayList<>(performaneReportIDList);
|
List<String> updatePerformaneReportIDList = new ArrayList<>(performaneReportIDList);
|
||||||
|
Map<String, String> finishLoadTestId = new HashMap<>();
|
||||||
executorService.submit(() -> {
|
executorService.submit(() -> {
|
||||||
//错误数据检查集合。 如果错误数据出现超过20次,则取消该条数据的检查
|
//错误数据检查集合。 如果错误数据出现超过20次,则取消该条数据的检查
|
||||||
Map<String, Integer> errorDataCheckMap = new HashMap<>();
|
Map<String, Integer> errorDataCheckMap = new HashMap<>();
|
||||||
|
@ -544,17 +912,23 @@ public class TestPlanReportService {
|
||||||
}
|
}
|
||||||
} else if (StringUtils.equalsAny(loadTestReportFromDatabase.getStatus(),
|
} else if (StringUtils.equalsAny(loadTestReportFromDatabase.getStatus(),
|
||||||
PerformanceTestStatus.Completed.name(), PerformanceTestStatus.Error.name())) {
|
PerformanceTestStatus.Completed.name(), PerformanceTestStatus.Error.name())) {
|
||||||
|
finishLoadTestId.put(loadTestReportFromDatabase.getTestId(), TestPlanApiExecuteStatus.SUCCESS.name());
|
||||||
performaneReportIDList.remove(loadTestReportId);
|
performaneReportIDList.remove(loadTestReportId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (performaneReportIDList.isEmpty()) {
|
if (performaneReportIDList.isEmpty()) {
|
||||||
for (String string : updatePerformaneReportIDList) {
|
if (StringUtils.equals(triggerMode, ReportTriggerMode.API.name())) {
|
||||||
TestPlanLoadCaseEventDTO eventDTO = new TestPlanLoadCaseEventDTO();
|
for (String string : updatePerformaneReportIDList) {
|
||||||
eventDTO.setReportId(string);
|
TestPlanLoadCaseEventDTO eventDTO = new TestPlanLoadCaseEventDTO();
|
||||||
eventDTO.setTriggerMode(triggerMode);
|
eventDTO.setReportId(string);
|
||||||
eventDTO.setStatus(PerformanceTestStatus.Completed.name());
|
eventDTO.setTriggerMode(triggerMode);
|
||||||
this.updatePerformanceTestStatus(eventDTO);
|
eventDTO.setStatus(PerformanceTestStatus.Completed.name());
|
||||||
|
this.updatePerformanceTestStatus(eventDTO);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.updateExecuteApis(testPlanReport.getId(), null, null, finishLoadTestId);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
//查询定时任务是否关闭
|
//查询定时任务是否关闭
|
||||||
|
@ -625,4 +999,106 @@ public class TestPlanReportService {
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public synchronized void updateExecuteApis(String planReportId, Map<String, String> executeApiCaseIdMap, Map<String, String> executeScenarioCaseIdMap, Map<String, String> executePerformanceIdMap) {
|
||||||
|
TestPlanReportDataExample example = new TestPlanReportDataExample();
|
||||||
|
if(executeApiCaseIdMap == null){
|
||||||
|
executeApiCaseIdMap = new HashMap<>();
|
||||||
|
}
|
||||||
|
if(executeScenarioCaseIdMap == null){
|
||||||
|
executeScenarioCaseIdMap = new HashMap<>();
|
||||||
|
}
|
||||||
|
if(executePerformanceIdMap == null){
|
||||||
|
executePerformanceIdMap = new HashMap<>();
|
||||||
|
}
|
||||||
|
example.createCriteria().andTestPlanReportIdEqualTo(planReportId);
|
||||||
|
List<TestPlanReportDataWithBLOBs> reportDataList = testPlanReportDataMapper.selectByExampleWithBLOBs(example);
|
||||||
|
if (!reportDataList.isEmpty()) {
|
||||||
|
TestPlanReportDataWithBLOBs reportData = reportDataList.get(0);
|
||||||
|
|
||||||
|
boolean apiCaseExecuteOk = true;
|
||||||
|
|
||||||
|
try {
|
||||||
|
JSONArray executeArr = JSONArray.parseArray(reportData.getApiCaseInfo());
|
||||||
|
JSONArray newArr = new JSONArray();
|
||||||
|
for (int i = 0; i < executeArr.size(); i++) {
|
||||||
|
JSONObject caseInfo = executeArr.getJSONObject(i);
|
||||||
|
if (caseInfo.containsKey("id") && caseInfo.containsKey("status")) {
|
||||||
|
if (MapUtils.isNotEmpty(executeApiCaseIdMap)) {
|
||||||
|
String id = caseInfo.getString("id");
|
||||||
|
String status = caseInfo.getString("status");
|
||||||
|
String updateStatus = executeApiCaseIdMap.get(id);
|
||||||
|
if (StringUtils.isNotEmpty(updateStatus)
|
||||||
|
&& !StringUtils.equalsAnyIgnoreCase(status, TestPlanApiExecuteStatus.SUCCESS.name(), TestPlanApiExecuteStatus.FAILD.name())) {
|
||||||
|
caseInfo.put("status", updateStatus);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (StringUtils.equals(TestPlanApiExecuteStatus.RUNNING.name(), caseInfo.getString("status"))) {
|
||||||
|
apiCaseExecuteOk = false;
|
||||||
|
}
|
||||||
|
newArr.add(caseInfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
reportData.setApiCaseInfo(newArr.toJSONString());
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean scenarioExecuteOk = true;
|
||||||
|
|
||||||
|
try {
|
||||||
|
JSONArray executeArr = JSONArray.parseArray(reportData.getScenarioInfo());
|
||||||
|
JSONArray newArr = new JSONArray();
|
||||||
|
for (int i = 0; i < executeArr.size(); i++) {
|
||||||
|
JSONObject caseInfo = executeArr.getJSONObject(i);
|
||||||
|
if (caseInfo.containsKey("id") && caseInfo.containsKey("status")) {
|
||||||
|
if (MapUtils.isNotEmpty(executeScenarioCaseIdMap)) {
|
||||||
|
String id = caseInfo.getString("id");
|
||||||
|
String status = caseInfo.getString("status");
|
||||||
|
String updateStatus = executeScenarioCaseIdMap.get(id);
|
||||||
|
if (StringUtils.isNotEmpty(updateStatus)
|
||||||
|
&& !StringUtils.equalsAnyIgnoreCase(status, TestPlanApiExecuteStatus.SUCCESS.name(), TestPlanApiExecuteStatus.FAILD.name())) {
|
||||||
|
caseInfo.put("status", updateStatus);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (StringUtils.equals(TestPlanApiExecuteStatus.RUNNING.name(), caseInfo.getString("status"))) {
|
||||||
|
scenarioExecuteOk = false;
|
||||||
|
}
|
||||||
|
newArr.add(caseInfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
reportData.setScenarioInfo(newArr.toJSONString());
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
|
boolean performanceExecuteOk = true;
|
||||||
|
|
||||||
|
try {
|
||||||
|
JSONArray executeArr = JSONArray.parseArray(reportData.getPerformanceInfo());
|
||||||
|
JSONArray newArr = new JSONArray();
|
||||||
|
for (int i = 0; i < executeArr.size(); i++) {
|
||||||
|
JSONObject caseInfo = executeArr.getJSONObject(i);
|
||||||
|
if (caseInfo.containsKey("id") && caseInfo.containsKey("status")) {
|
||||||
|
if (MapUtils.isNotEmpty(executePerformanceIdMap)) {
|
||||||
|
String id = caseInfo.getString("id");
|
||||||
|
String status = caseInfo.getString("status");
|
||||||
|
String updateStatus = executePerformanceIdMap.get(id);
|
||||||
|
if (StringUtils.isNotEmpty(updateStatus)
|
||||||
|
&& !StringUtils.equalsAnyIgnoreCase(status, TestPlanApiExecuteStatus.SUCCESS.name(), TestPlanApiExecuteStatus.FAILD.name())) {
|
||||||
|
caseInfo.put("status", updateStatus);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (StringUtils.equals(TestPlanApiExecuteStatus.RUNNING.name(), caseInfo.getString("status"))) {
|
||||||
|
performanceExecuteOk = false;
|
||||||
|
}
|
||||||
|
newArr.add(caseInfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
reportData.setPerformanceInfo(newArr.toJSONString());
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
|
|
||||||
|
testPlanReportDataMapper.updateByPrimaryKeySelective(reportData);
|
||||||
|
this.updateReport(reportData, apiCaseExecuteOk, scenarioExecuteOk, performanceExecuteOk);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,7 +60,6 @@ import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
@Transactional(rollbackFor = Exception.class)
|
|
||||||
public class TestPlanService {
|
public class TestPlanService {
|
||||||
@Resource
|
@Resource
|
||||||
ExtScheduleMapper extScheduleMapper;
|
ExtScheduleMapper extScheduleMapper;
|
||||||
|
@ -137,6 +136,8 @@ public class TestPlanService {
|
||||||
private ApiScenarioReportMapper apiScenarioReportMapper;
|
private ApiScenarioReportMapper apiScenarioReportMapper;
|
||||||
@Resource
|
@Resource
|
||||||
private TestPlanReportMapper testPlanReportMapper;
|
private TestPlanReportMapper testPlanReportMapper;
|
||||||
|
@Resource
|
||||||
|
private TestPlanReportService testPlanReportService;
|
||||||
@Lazy
|
@Lazy
|
||||||
@Resource
|
@Resource
|
||||||
private IssuesService issuesService;
|
private IssuesService issuesService;
|
||||||
|
@ -406,7 +407,6 @@ public class TestPlanService {
|
||||||
statusList.addAll(testPlanApiCaseService.getExecResultByPlanId(testPlanId));
|
statusList.addAll(testPlanApiCaseService.getExecResultByPlanId(testPlanId));
|
||||||
statusList.addAll(testPlanScenarioCaseService.getExecResultByPlanId(testPlanId));
|
statusList.addAll(testPlanScenarioCaseService.getExecResultByPlanId(testPlanId));
|
||||||
statusList.addAll(testPlanLoadCaseService.getStatus(testPlanId));
|
statusList.addAll(testPlanLoadCaseService.getStatus(testPlanId));
|
||||||
// Prepare, Pass, Failure, Blocking, Skip, Underway
|
|
||||||
TestPlanDTO testPlanDTO = new TestPlanDTO();
|
TestPlanDTO testPlanDTO = new TestPlanDTO();
|
||||||
testPlanDTO.setId(testPlanId);
|
testPlanDTO.setId(testPlanId);
|
||||||
if (statusList.size() == 0) { // 原先status不是prepare, 但删除所有关联用例的情况
|
if (statusList.size() == 0) { // 原先status不是prepare, 但删除所有关联用例的情况
|
||||||
|
@ -866,7 +866,6 @@ public class TestPlanService {
|
||||||
|
|
||||||
String returnStr = null;
|
String returnStr = null;
|
||||||
for (Map.Entry<String, Map<String, String>> entry : testPlanScenarioIdMap.entrySet()) {
|
for (Map.Entry<String, Map<String, String>> entry : testPlanScenarioIdMap.entrySet()) {
|
||||||
// String testPlanId = entry.getKey();
|
|
||||||
Map<String, String> scenarioMap = entry.getValue();
|
Map<String, String> scenarioMap = entry.getValue();
|
||||||
|
|
||||||
RunScenarioRequest request = new RunScenarioRequest();
|
RunScenarioRequest request = new RunScenarioRequest();
|
||||||
|
@ -881,8 +880,8 @@ public class TestPlanService {
|
||||||
request.setConfig(planScenarioExecuteRequest.getConfig());
|
request.setConfig(planScenarioExecuteRequest.getConfig());
|
||||||
request.setTestPlanScheduleJob(true);
|
request.setTestPlanScheduleJob(true);
|
||||||
request.setTestPlanReportId(planScenarioExecuteRequest.getTestPlanReportId());
|
request.setTestPlanReportId(planScenarioExecuteRequest.getTestPlanReportId());
|
||||||
|
// request.getConfig().getReportType()
|
||||||
request.setId(UUID.randomUUID().toString());
|
request.setId(UUID.randomUUID().toString());
|
||||||
|
|
||||||
if (request.getConfig() != null) {
|
if (request.getConfig() != null) {
|
||||||
if (request.getConfig().getMode().equals(RunModeConstants.PARALLEL.toString())) {
|
if (request.getConfig().getMode().equals(RunModeConstants.PARALLEL.toString())) {
|
||||||
// 校验并发数量
|
// 校验并发数量
|
||||||
|
@ -998,9 +997,6 @@ public class TestPlanService {
|
||||||
}
|
}
|
||||||
|
|
||||||
public String run(String testPlanID, String projectID, String userId, String triggerMode, String apiRunConfig) {
|
public String run(String testPlanID, String projectID, String userId, String triggerMode, String apiRunConfig) {
|
||||||
Map<String, String> planScenarioIdMap;
|
|
||||||
Map<String, String> apiTestCaseIdMap;
|
|
||||||
Map<String, String> performanceIdMap;
|
|
||||||
if (StringUtils.isEmpty(apiRunConfig)) {
|
if (StringUtils.isEmpty(apiRunConfig)) {
|
||||||
apiRunConfig =
|
apiRunConfig =
|
||||||
"{\"mode\":\"parallel\"," +
|
"{\"mode\":\"parallel\"," +
|
||||||
|
@ -1009,48 +1005,23 @@ public class TestPlanService {
|
||||||
"\"runWithinResourcePool\":true," +
|
"\"runWithinResourcePool\":true," +
|
||||||
"\"resourcePoolId\":\"29773f4f-55e4-4bce-ad3d-b531b4eb59c2\"}";
|
"\"resourcePoolId\":\"29773f4f-55e4-4bce-ad3d-b531b4eb59c2\"}";
|
||||||
}
|
}
|
||||||
planScenarioIdMap = new LinkedHashMap<>();
|
|
||||||
apiTestCaseIdMap = new LinkedHashMap<>();
|
|
||||||
performanceIdMap = new LinkedHashMap<>();
|
|
||||||
|
|
||||||
List<TestPlanApiScenario> testPlanApiScenarioList = testPlanScenarioCaseService.getCasesByPlanId(testPlanID);
|
|
||||||
for (TestPlanApiScenario model : testPlanApiScenarioList) {
|
|
||||||
planScenarioIdMap.put(model.getApiScenarioId(), model.getId());
|
|
||||||
}
|
|
||||||
List<TestPlanApiCase> testPlanApiCaseList = testPlanApiCaseService.getCasesByPlanId(testPlanID);
|
|
||||||
for (TestPlanApiCase model :
|
|
||||||
testPlanApiCaseList) {
|
|
||||||
apiTestCaseIdMap.put(model.getApiCaseId(), model.getId());
|
|
||||||
}
|
|
||||||
|
|
||||||
LoadCaseRequest loadCaseRequest = new LoadCaseRequest();
|
|
||||||
loadCaseRequest.setTestPlanId(testPlanID);
|
|
||||||
loadCaseRequest.setProjectId(projectID);
|
|
||||||
List<TestPlanLoadCaseDTO> testPlanLoadCaseDTOList = testPlanLoadCaseService.list(loadCaseRequest);
|
|
||||||
for (TestPlanLoadCaseDTO dto : testPlanLoadCaseDTOList) {
|
|
||||||
performanceIdMap.put(dto.getId(), dto.getLoadCaseId());
|
|
||||||
}
|
|
||||||
|
|
||||||
LogUtil.info("-------------- start testplan schedule ----------");
|
|
||||||
TestPlanReportService testPlanReportService = CommonBeanFactory.getBean(TestPlanReportService.class);
|
|
||||||
|
|
||||||
boolean apiCaseIsExcuting = false;
|
|
||||||
boolean scenarioIsExcuting = false;
|
|
||||||
boolean performaceIsExcuting = false;
|
|
||||||
String apiCaseIdArray = "";
|
|
||||||
String scenarioCaseIdArray = "";
|
|
||||||
String performanceCaseIdArray = "";
|
|
||||||
String planReportId = UUID.randomUUID().toString();
|
|
||||||
//创建测试报告,然后返回的ID重新赋值为resourceID,作为后续的参数
|
//创建测试报告,然后返回的ID重新赋值为resourceID,作为后续的参数
|
||||||
TestPlanReportSaveRequest saveRequest = new TestPlanReportSaveRequest(planReportId, testPlanID, userId, triggerMode,
|
TestPlanScheduleReportInfoDTO reportInfoDTO = testPlanReportService.genTestPlanReportBySchedule(projectID,testPlanID,userId,triggerMode);
|
||||||
apiTestCaseIdMap.size() > 0, planScenarioIdMap.size() > 0, performanceIdMap.size() > 0,
|
TestPlanReport testPlanReport = reportInfoDTO.getTestPlanReport();
|
||||||
JSONArray.toJSONString(new ArrayList<>(apiTestCaseIdMap.keySet())), JSONArray.toJSONString(new ArrayList<>(planScenarioIdMap.keySet())), JSONArray.toJSONString(new ArrayList<>(performanceIdMap.values())));
|
Map<String, String> planScenarioIdMap = reportInfoDTO.getPlanScenarioIdMap();
|
||||||
|
Map<String, String> apiTestCaseIdMap = reportInfoDTO.getApiTestCaseIdMap();
|
||||||
|
Map<String, String> performanceIdMap = reportInfoDTO.getPerformanceIdMap();
|
||||||
|
|
||||||
TestPlanReport testPlanReport = testPlanReportService.genTestPlanReport(saveRequest);
|
String planReportId = testPlanReport.getId();
|
||||||
|
|
||||||
|
//不同任务的执行ID
|
||||||
|
Map<String,String> executePerformanceIdMap = new HashMap<>();
|
||||||
|
Map<String,String> executeApiCaseIdMap = new HashMap<>();
|
||||||
|
Map<String,String> executeScenarioCaseIdMap = new HashMap<>();
|
||||||
|
|
||||||
//执行性能测试任务
|
//执行性能测试任务
|
||||||
List<String> performaneReportIDList = new ArrayList<>();
|
List<String> performaneReportIDList = new ArrayList<>();
|
||||||
List<String> performanceRunCaseIdList = new ArrayList<>();
|
|
||||||
for (Map.Entry<String, String> entry : performanceIdMap.entrySet()) {
|
for (Map.Entry<String, String> entry : performanceIdMap.entrySet()) {
|
||||||
String id = entry.getKey();
|
String id = entry.getKey();
|
||||||
String caseID = entry.getValue();
|
String caseID = entry.getValue();
|
||||||
|
@ -1067,7 +1038,6 @@ public class TestPlanService {
|
||||||
reportId = performanceTestService.run(performanceRequest);
|
reportId = performanceTestService.run(performanceRequest);
|
||||||
if (reportId != null) {
|
if (reportId != null) {
|
||||||
performaneReportIDList.add(reportId);
|
performaneReportIDList.add(reportId);
|
||||||
|
|
||||||
TestPlanLoadCase testPlanLoadCase = new TestPlanLoadCase();
|
TestPlanLoadCase testPlanLoadCase = new TestPlanLoadCase();
|
||||||
testPlanLoadCase.setId(performanceRequest.getTestPlanLoadId());
|
testPlanLoadCase.setId(performanceRequest.getTestPlanLoadId());
|
||||||
testPlanLoadCase.setLoadReportId(reportId);
|
testPlanLoadCase.setLoadReportId(reportId);
|
||||||
|
@ -1083,26 +1053,29 @@ public class TestPlanService {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
if (StringUtils.isNotEmpty(reportId)) {
|
if (StringUtils.isNotEmpty(reportId)) {
|
||||||
performanceRunCaseIdList.add(caseID);
|
executePerformanceIdMap.put(caseID,TestPlanApiExecuteStatus.RUNNING.name());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!performanceRunCaseIdList.isEmpty()) {
|
|
||||||
performaceIsExcuting = true;
|
|
||||||
performanceCaseIdArray = JSONArray.toJSONString(new ArrayList<>(performanceRunCaseIdList));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!performaneReportIDList.isEmpty()) {
|
if (!performaneReportIDList.isEmpty()) {
|
||||||
//性能测试时保存性能测试报告ID,在结果返回时用于捕捉并进行
|
//性能测试时保存性能测试报告ID,在结果返回时用于捕捉并进行
|
||||||
testPlanReportService.updatePerformanceInfo(testPlanReport, performaneReportIDList, triggerMode);
|
testPlanReportService.updatePerformanceInfo(testPlanReport, performaneReportIDList, triggerMode);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (Map.Entry<String, String> entry : apiTestCaseIdMap.entrySet()) {
|
||||||
|
String apiCaseID = entry.getKey();
|
||||||
|
executeApiCaseIdMap.put(apiCaseID,TestPlanApiExecuteStatus.RUNNING.name());
|
||||||
|
}
|
||||||
|
for (String id : planScenarioIdMap.keySet()) {
|
||||||
|
executeScenarioCaseIdMap.put(id,TestPlanApiExecuteStatus.RUNNING.name());
|
||||||
|
}
|
||||||
|
testPlanReportService.updateExecuteApis(planReportId,executeApiCaseIdMap,executeScenarioCaseIdMap,executePerformanceIdMap);
|
||||||
|
|
||||||
|
|
||||||
//执行接口案例任务
|
//执行接口案例任务
|
||||||
for (Map.Entry<String, String> entry : apiTestCaseIdMap.entrySet()) {
|
for (Map.Entry<String, String> entry : apiTestCaseIdMap.entrySet()) {
|
||||||
String apiCaseID = entry.getKey();
|
String apiCaseID = entry.getKey();
|
||||||
String planCaseID = entry.getValue();
|
// String planCaseID = entry.getValue();
|
||||||
ApiTestCaseWithBLOBs blobs = apiTestCaseService.get(apiCaseID);
|
ApiTestCaseWithBLOBs blobs = apiTestCaseService.get(apiCaseID);
|
||||||
//需要更新这里来保证PlanCase的状态能正常更改
|
//需要更新这里来保证PlanCase的状态能正常更改
|
||||||
if (StringUtils.equals(triggerMode, ReportTriggerMode.API.name())) {
|
if (StringUtils.equals(triggerMode, ReportTriggerMode.API.name())) {
|
||||||
|
@ -1110,11 +1083,7 @@ public class TestPlanService {
|
||||||
} else {
|
} else {
|
||||||
apiTestCaseService.run(blobs, UUID.randomUUID().toString(), planReportId, testPlanID, ApiRunMode.SCHEDULE_API_PLAN.name());
|
apiTestCaseService.run(blobs, UUID.randomUUID().toString(), planReportId, testPlanID, ApiRunMode.SCHEDULE_API_PLAN.name());
|
||||||
}
|
}
|
||||||
|
executeApiCaseIdMap.put(apiCaseID,TestPlanApiExecuteStatus.RUNNING.name());
|
||||||
apiCaseIsExcuting = true;
|
|
||||||
}
|
|
||||||
if (apiCaseIsExcuting) {
|
|
||||||
apiCaseIdArray = JSONArray.toJSONString(new ArrayList<>(apiTestCaseIdMap.keySet()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//执行场景执行任务
|
//执行场景执行任务
|
||||||
|
@ -1143,19 +1112,10 @@ public class TestPlanService {
|
||||||
RunModeConfig runModeConfig = JSONObject.parseObject(apiRunConfig, RunModeConfig.class);
|
RunModeConfig runModeConfig = JSONObject.parseObject(apiRunConfig, RunModeConfig.class);
|
||||||
scenarioRequest.setConfig(runModeConfig);
|
scenarioRequest.setConfig(runModeConfig);
|
||||||
String scenarioReportID = this.scenarioRunModeConfig(scenarioRequest);
|
String scenarioReportID = this.scenarioRunModeConfig(scenarioRequest);
|
||||||
if (StringUtils.isNotEmpty(scenarioReportID)) {
|
// if (StringUtils.isNotEmpty(scenarioReportID)) {
|
||||||
scenarioIsExcuting = true;
|
// scenarioIsExcuting = true;
|
||||||
scenarioCaseIdArray = JSONArray.toJSONString(new ArrayList<>(planScenarioIdMap.keySet()));
|
// scenarioCaseIdArray = JSONArray.toJSONString(new ArrayList<>(planScenarioIdMap.keySet()));
|
||||||
}
|
// }
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//如果report参数和预期不对(某些原因执行失败),则更新report
|
|
||||||
if (saveRequest.isApiCaseIsExecuting() != apiCaseIsExcuting || saveRequest.isScenarioIsExecuting() != scenarioIsExcuting || saveRequest.isPerformanceIsExecuting() != performaceIsExcuting) {
|
|
||||||
testPlanReport.setIsApiCaseExecuting(apiCaseIsExcuting);
|
|
||||||
testPlanReport.setIsScenarioExecuting(scenarioIsExcuting);
|
|
||||||
testPlanReport.setIsPerformanceExecuting(performaceIsExcuting);
|
|
||||||
testPlanReportService.update(testPlanReport);
|
|
||||||
}
|
}
|
||||||
return testPlanReport.getId();
|
return testPlanReport.getId();
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,57 +34,16 @@
|
||||||
default() {
|
default() {
|
||||||
return {
|
return {
|
||||||
functionalTestCases: [
|
functionalTestCases: [
|
||||||
{
|
|
||||||
name: 'testCase1',
|
|
||||||
priority: 'P1',
|
|
||||||
type: 'api',
|
|
||||||
method: 'auto',
|
|
||||||
nodePath: '/module1/module2',
|
|
||||||
executorName: "Tom",
|
|
||||||
status: "Failure",
|
|
||||||
updateTime: new Date(),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'testCase2',
|
|
||||||
priority: 'P0',
|
|
||||||
type: 'functional',
|
|
||||||
method: 'manual',
|
|
||||||
nodePath: '/module1',
|
|
||||||
executorName: "Micheal",
|
|
||||||
status: "Failure",
|
|
||||||
updateTime: new Date()
|
|
||||||
}
|
|
||||||
],
|
],
|
||||||
apiTestCases: [
|
apiTestCases: [
|
||||||
{
|
|
||||||
name: 'testCase3',
|
|
||||||
priority: 'P2',
|
|
||||||
path: '/module1/module2',
|
|
||||||
createUser: "Tom",
|
|
||||||
lastResult: "Failure",
|
|
||||||
updateTime: new Date(),
|
|
||||||
}
|
|
||||||
],
|
],
|
||||||
scenarioTestCases: [
|
scenarioTestCases: [
|
||||||
{
|
|
||||||
name: 'testCase4',
|
|
||||||
level: 'P3',
|
|
||||||
modulePath: '/module1/module2',
|
|
||||||
stepTotal: 10,
|
|
||||||
passRate: '80%',
|
|
||||||
userId: "Tom",
|
|
||||||
lastResult: "Failure",
|
|
||||||
updateTime: new Date(),
|
|
||||||
}
|
|
||||||
],
|
],
|
||||||
loadTestCases: [
|
loadTestCases: [
|
||||||
{
|
|
||||||
caseName: 'testCase5',
|
|
||||||
projectName: '测试项目',
|
|
||||||
userName: 'Tom',
|
|
||||||
createTime: new Date(),
|
|
||||||
caseStatus: 'error',
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -88,17 +88,37 @@
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
showFunctional() {
|
showFunctional() {
|
||||||
return this.executeResult.functionalResult.length > 0
|
if(this.executeResult.functionalResult){
|
||||||
|| (this.executeResult.apiResult.length <= 0 && this.executeResult.scenarioResult.length <= 0 && this.executeResult.loadResult.length <= 0);
|
return this.executeResult.functionalResult.length > 0
|
||||||
|
|| (this.executeResult.apiResult.length <= 0 && this.executeResult.scenarioResult.length <= 0 && this.executeResult.loadResult.length <= 0);
|
||||||
|
}else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
showApi() {
|
showApi() {
|
||||||
return this.executeResult.apiResult.length > 0;
|
if(this.executeResult.apiResult){
|
||||||
|
return this.executeResult.apiResult.length > 0;
|
||||||
|
}else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
showScenario() {
|
showScenario() {
|
||||||
return this.executeResult.scenarioResult.length > 0;
|
|
||||||
|
if(this.executeResult.scenarioResult){
|
||||||
|
return this.executeResult.scenarioResult.length > 0;
|
||||||
|
}else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
showLoad() {
|
showLoad() {
|
||||||
return this.executeResult.loadResult.length > 0;
|
|
||||||
|
if(this.executeResult.loadResult){
|
||||||
|
return this.executeResult.loadResult.length > 0;
|
||||||
|
}else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
|
@ -158,7 +178,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
copyData(status) {
|
copyData(status) {
|
||||||
return JSON.parse(JSON.stringify(this.dataMap.get(status)))
|
if(this.dataMap.get(status)){
|
||||||
|
return JSON.parse(JSON.stringify(this.dataMap.get(status)))
|
||||||
|
}
|
||||||
},
|
},
|
||||||
reload() {
|
reload() {
|
||||||
this.isShow = false;
|
this.isShow = false;
|
||||||
|
|
Loading…
Reference in New Issue