测试计划概览前端及后端代码完善

This commit is contained in:
pfl
2025-06-06 17:19:18 +08:00
parent eee51078b5
commit 5cc2cdfc34
12 changed files with 708 additions and 83 deletions

View File

@@ -10,9 +10,12 @@ import com.test.test.domain.qo.IDQO;
import com.test.test.domain.qo.TestPlanAddQO;
import com.test.test.domain.qo.TestPlanListQO;
import com.test.test.domain.vo.TestPlanListVO;
import com.test.test.domain.vo.TestPlanOverviewTrendDataVO;
import com.test.test.domain.vo.TestPlanOverviewVO;
import com.test.test.service.ITestPlanService;
import jakarta.annotation.Resource;
import java.util.List;
import java.util.Map;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
@@ -79,4 +82,20 @@ public class TestPlanController extends BaseController {
public AjaxResult edit(@RequestBody TestPlan testPlan) {
return toAjax(testPlanService.updateTestPlan(testPlan));
}
/**
* 获取测试计划概览信息
*/
@PostMapping("/planOverview")
public TestPlanOverviewVO selectPlanOverview(@RequestBody IDQO qo) {
return testPlanService.selectPlanOverview(qo.getId());
}
/**
* 获取测试计划用例执行趋势数据
*/
@PostMapping("/planCaseTrendData")
public List<TestPlanOverviewTrendDataVO> getPlanCaseTrendData(@RequestBody IDQO qo) {
return testPlanService.getCaseTrendData(qo.getId());
}
}

View File

@@ -0,0 +1,22 @@
package com.test.test.domain.vo;
import java.io.Serializable;
import lombok.Data;
@Data
public class TestPlanOverviewTrendDataVO implements Serializable {
private static final long serialVersionUID = -6444876575138174061L;
private String caseTrendDates;
private Integer notExecuted;
private Integer passed;
private Integer failed;
private Integer blocked;
private Integer skipped;
}

View File

@@ -0,0 +1,146 @@
package com.test.test.domain.vo;
import java.io.Serializable;
import java.util.List;
import lombok.Data;
@Data
public class TestPlanOverviewVO implements Serializable {
private static final long serialVersionUID = -2634301979620606338L;
/**
* 用例总数
*/
private Integer caseCount;
/**
* 已执行用例数
*/
private Integer executedCaseCount;
/**
* 用例通过数
*/
private Integer passedCaseCount;
/**
* 用例失败数
*/
private Integer failedCaseCount;
/**
* 用例阻塞数
*/
private Integer blockedCaseCount;
/**
* 用例跳过数
*/
private Integer skippedCaseCount;
/**
* 用例未执行数
*/
private Integer notExecutedCaseCount;
/**
* 缺陷数
*/
private Integer defectCount;
/**
* 待确认缺陷状态数
*/
private Integer unconfirmedDefectCount;
/**
* 修复中缺陷状态数
*/
private Integer fixingDefectCount;
/**
* 待验证缺陷状态数
*/
private Integer unverifiedDefectCount;
/**
* 无效缺陷状态数
*/
private Integer invalidDefectCount;
/**
* 挂起缺陷状态数
*/
private Integer suspendedDefectCount;
/**
* 无效等级缺陷数
*/
private Integer invalidLevelDefectCount;
/**
* 轻微等级缺陷数
*/
private Integer minorLevelDefectCount;
/**
* 一般等级缺陷数
*/
private Integer normalLevelDefectCount;
/**
* 严重等级缺陷数
*/
private Integer seriousLevelDefectCount;
/**
* 致命等级缺陷数
*/
private Integer fatalLevelDefectCount;
/**
* 功能逻辑类型缺陷数
*/
private Integer logicDefectCount;
/**
* UI交互类型缺陷数
*/
private Integer uiDefectCount;
/**
* 性能问题类型缺陷数
*/
private Integer performanceDefectCount;
/**
* 兼容性问题类型缺陷数
*/
private Integer compatibilityDefectCount;
/**
* 配置错误类型缺陷数
*/
private Integer configurationDefectCount;
/**
* 安全问题类型缺陷数
*/
private Integer securityDefectCount;
/**
* 安装部署类型缺陷数
*/
private Integer installationDefectCount;
/**
* 其他类型缺陷数
*/
private Integer otherDefectCount;
/**
* 用例执行时间
*/
private List<String> caseTrendDates;
}

View File

@@ -3,8 +3,9 @@ package com.test.test.mapper;
import com.test.test.domain.TestPlan;
import com.test.test.domain.qo.TestPlanListQO;
import com.test.test.domain.vo.TestPlanListVO;
import com.test.test.domain.vo.TestPlanOverviewTrendDataVO;
import com.test.test.domain.vo.TestPlanOverviewVO;
import java.util.List;
public interface TestPlanMapper {
/**
@@ -41,4 +42,18 @@ public interface TestPlanMapper {
* @return
*/
Long selectPlanId(String serialNumber);
/**
* 查询测试计划概览信息
* @param id
* @return
*/
TestPlanOverviewVO selectPlanOverview(Long id);
/**
* 查询测试计划用例执行趋势数据
* @param id
* @return
*/
List<TestPlanOverviewTrendDataVO> getCaseTrendData(Long id);
}

View File

@@ -4,6 +4,8 @@ import com.test.test.domain.TestPlan;
import com.test.test.domain.qo.TestPlanAddQO;
import com.test.test.domain.qo.TestPlanListQO;
import com.test.test.domain.vo.TestPlanListVO;
import com.test.test.domain.vo.TestPlanOverviewTrendDataVO;
import com.test.test.domain.vo.TestPlanOverviewVO;
import java.util.List;
/**
@@ -41,4 +43,18 @@ public interface ITestPlanService {
* @return
*/
public int updateTestPlan(TestPlan testPlan);
/**
* 获取测试计划概览信息
* @param id
* @return
*/
TestPlanOverviewVO selectPlanOverview(Long id);
/**
* 获取测试计划用例趋势数据
* @param id
* @return
*/
List<TestPlanOverviewTrendDataVO> getCaseTrendData(Long id);
}

View File

@@ -6,10 +6,15 @@ import com.test.test.domain.TestPlan;
import com.test.test.domain.qo.TestPlanAddQO;
import com.test.test.domain.qo.TestPlanListQO;
import com.test.test.domain.vo.TestPlanListVO;
import com.test.test.domain.vo.TestPlanOverviewTrendDataVO;
import com.test.test.domain.vo.TestPlanOverviewVO;
import com.test.test.mapper.TestPlanMapper;
import com.test.test.mapper.TestProjectPlanMapper;
import com.test.test.service.ITestPlanService;
import jakarta.annotation.Resource;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -82,4 +87,39 @@ public class TestPlanServiceImpl implements ITestPlanService {
testPlan.setUpdateTime(DateUtils.getNowDate());
return testPlanMapper.updateTestPlan(testPlan);
}
/**
* 获取测试计划概览信息
* @param id
* @return
*/
@Override
public TestPlanOverviewVO selectPlanOverview(Long id) {
TestPlanOverviewVO overviewVO = testPlanMapper.selectPlanOverview(id);
overviewVO.setCaseTrendDates(getCaseTrendDates());
return overviewVO;
}
/**
* 获取测试计划用例趋势数据
* @param id
* @return
*/
@Override
public List<TestPlanOverviewTrendDataVO> getCaseTrendData(Long id) {
return testPlanMapper.getCaseTrendData(id);
}
private List<String> getCaseTrendDates() {
List<String> dates = new ArrayList<>();
LocalDate today = LocalDate.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
for (int i = 6; i >= 0; i--) {
LocalDate date = today.minusDays(i);
dates.add(date.format(formatter));
}
return dates;
}
}

View File

@@ -203,4 +203,56 @@
<select id="selectPlanId" resultType="Long">
select id from test_plan where serial_number = #{serialNumber} and del_flag = '0'
</select>
<select id="selectPlanOverview" resultType="TestPlanOverviewVO">
SELECT
(SELECT COUNT(1) FROM test_plan_case tpc WHERE tpc.plan_id = #{id} AND tpc.del_flag = '0') AS caseCount,
(SELECT COUNT(1) FROM test_plan_case tpc WHERE tpc.plan_id = #{id} AND tpc.del_flag = '0' AND tpc.execute_result != '0') AS executedCaseCount,
(SELECT COUNT(1) FROM test_plan_case tpc WHERE tpc.plan_id = #{id} AND tpc.del_flag = '0' AND tpc.execute_result = '1') AS passedCaseCount,
(SELECT COUNT(1) FROM test_plan_case tpc WHERE tpc.plan_id = #{id} AND tpc.del_flag = '0' AND tpc.execute_result = '2') AS failedCaseCount,
(SELECT COUNT(1) FROM test_plan_case tpc WHERE tpc.plan_id = #{id} AND tpc.del_flag = '0' AND tpc.execute_result = '0') AS notExecutedCaseCount,
(SELECT COUNT(1) FROM test_plan_case tpc WHERE tpc.plan_id = #{id} AND tpc.del_flag = '0' AND tpc.execute_result = '3') AS blockedCaseCount,
(SELECT COUNT(1) FROM test_plan_case tpc WHERE tpc.plan_id = #{id} AND tpc.del_flag = '0' AND tpc.execute_result = '4') AS skippedCaseCount,
(SELECT COUNT(1) FROM test_plan_defect tpd WHERE tpd.plan_id = #{id} AND tpd.del_flag = '0') AS defectCount,
(SELECT COUNT(1) FROM test_plan_defect tpd LEFT JOIN test_defect td ON td.id = tpd.defect_id WHERE tpd.plan_id = #{id} AND td.status = '0' AND tpd.del_flag = '0') AS unconfirmedDefectCount,
(SELECT COUNT(1) FROM test_plan_defect tpd LEFT JOIN test_defect td ON td.id = tpd.defect_id WHERE tpd.plan_id = #{id} AND td.status = '1' AND tpd.del_flag = '0') AS fixingDefectCount,
(SELECT COUNT(1) FROM test_plan_defect tpd LEFT JOIN test_defect td ON td.id = tpd.defect_id WHERE tpd.plan_id = #{id} AND td.status = '5' AND tpd.del_flag = '0') AS unverifiedDefectCount,
(SELECT COUNT(1) FROM test_plan_defect tpd LEFT JOIN test_defect td ON td.id = tpd.defect_id WHERE tpd.plan_id = #{id} AND td.status = '3' AND tpd.del_flag = '0') AS invalidDefectCount,
(SELECT COUNT(1) FROM test_plan_defect tpd LEFT JOIN test_defect td ON td.id = tpd.defect_id WHERE tpd.plan_id = #{id} AND td.status = '4' AND tpd.del_flag = '0') AS suspendedDefectCount,
(SELECT COUNT(1) FROM test_plan_defect tpd LEFT JOIN test_defect td ON td.id = tpd.defect_id WHERE tpd.plan_id = #{id} AND td.level = '0' AND tpd.del_flag = '0') AS invalidLevelDefectCount,
(SELECT COUNT(1) FROM test_plan_defect tpd LEFT JOIN test_defect td ON td.id = tpd.defect_id WHERE tpd.plan_id = #{id} AND td.level = '1' AND tpd.del_flag = '0') AS minorLevelDefectCount,
(SELECT COUNT(1) FROM test_plan_defect tpd LEFT JOIN test_defect td ON td.id = tpd.defect_id WHERE tpd.plan_id = #{id} AND td.level = '2' AND tpd.del_flag = '0') AS normalLevelDefectCount,
(SELECT COUNT(1) FROM test_plan_defect tpd LEFT JOIN test_defect td ON td.id = tpd.defect_id WHERE tpd.plan_id = #{id} AND td.level = '3' AND tpd.del_flag = '0') AS seriousLevelDefectCount,
(SELECT COUNT(1) FROM test_plan_defect tpd LEFT JOIN test_defect td ON td.id = tpd.defect_id WHERE tpd.plan_id = #{id} AND td.level = '4' AND tpd.del_flag = '0') AS fatalLevelDefectCount,
(SELECT COUNT(1) FROM test_plan_defect tpd LEFT JOIN test_defect td ON td.id = tpd.defect_id WHERE tpd.plan_id = #{id} AND td.type = '0' AND tpd.del_flag = '0') AS logicDefectCount,
(SELECT COUNT(1) FROM test_plan_defect tpd LEFT JOIN test_defect td ON td.id = tpd.defect_id WHERE tpd.plan_id = #{id} AND td.type = '1' AND tpd.del_flag = '0') AS uiDefectCount,
(SELECT COUNT(1) FROM test_plan_defect tpd LEFT JOIN test_defect td ON td.id = tpd.defect_id WHERE tpd.plan_id = #{id} AND td.type = '2' AND tpd.del_flag = '0') AS performanceDefectCount,
(SELECT COUNT(1) FROM test_plan_defect tpd LEFT JOIN test_defect td ON td.id = tpd.defect_id WHERE tpd.plan_id = #{id} AND td.type = '3' AND tpd.del_flag = '0') AS compatibilityDefectCount,
(SELECT COUNT(1) FROM test_plan_defect tpd LEFT JOIN test_defect td ON td.id = tpd.defect_id WHERE tpd.plan_id = #{id} AND td.type = '4' AND tpd.del_flag = '0') AS configurationDefectCount,
(SELECT COUNT(1) FROM test_plan_defect tpd LEFT JOIN test_defect td ON td.id = tpd.defect_id WHERE tpd.plan_id = #{id} AND td.type = '5' AND tpd.del_flag = '0') AS securityDefectCount,
(SELECT COUNT(1) FROM test_plan_defect tpd LEFT JOIN test_defect td ON td.id = tpd.defect_id WHERE tpd.plan_id = #{id} AND td.type = '6' AND tpd.del_flag = '0') AS installationDefectCount,
(SELECT COUNT(1) FROM test_plan_defect tpd LEFT JOIN test_defect td ON td.id = tpd.defect_id WHERE tpd.plan_id = #{id} AND td.type = '7' AND tpd.del_flag = '0') AS otherDefectCount
FROM test_plan tp
WHERE tp.id = #{id}
AND tp.del_flag = '0'
</select>
<select id="getCaseTrendData" resultType="TestPlanOverviewTrendDataVO">
SELECT
DATE_FORMAT(tpc.execute_time, '%Y-%m-%d') AS caseTrendDates,
SUM(CASE WHEN tpc.execute_result = '0' THEN 1 ELSE 0 END) AS notExecuted,
SUM(CASE WHEN tpc.execute_result = '1' THEN 1 ELSE 0 END) AS passed,
SUM(CASE WHEN tpc.execute_result = '2' THEN 1 ELSE 0 END) AS failed,
SUM(CASE WHEN tpc.execute_result = '3' THEN 1 ELSE 0 END) AS blocked,
SUM(CASE WHEN tpc.execute_result = '4' THEN 1 ELSE 0 END) AS skipped
FROM test_plan_case tpc
LEFT JOIN test_plan tp ON tp.id = tpc.plan_id
WHERE tpc.del_flag = '0'
AND tpc.plan_id = #{id}
AND tp.del_flag = '0'
AND tpc.execute_time >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)
GROUP BY DATE_FORMAT(tpc.execute_time, '%Y-%m-%d')
ORDER BY DATE_FORMAT(tpc.execute_time, '%Y-%m-%d') ASC
</select>
</mapper>