测试跟踪首页数据

This commit is contained in:
chenjianxing 2020-05-15 17:07:47 +08:00
parent 6ad8cac646
commit 7eee038ea3
12 changed files with 131 additions and 28 deletions

View File

@ -9,4 +9,6 @@ import java.util.List;
public interface ExtProjectMapper {
List<ProjectDTO> getProjectWithWorkspace(@Param("proRequest") ProjectRequest request);
List<String> getProjectIdByWorkspaceId(String workspaceId);
}

View File

@ -16,5 +16,10 @@
</if>
</where>
</select>
<select id="getProjectIdByWorkspaceId" resultType="java.lang.String">
select id
from project
where workspace_id = #{workspaceId}
</select>
</mapper>

View File

@ -1,5 +1,6 @@
package io.metersphere.base.mapper.ext;
import io.metersphere.track.dto.TestPlanDTOWithMetric;
import io.metersphere.track.request.testcase.QueryTestPlanRequest;
import io.metersphere.track.dto.TestPlanDTO;
import org.apache.ibatis.annotations.Param;
@ -9,5 +10,5 @@ import java.util.List;
public interface ExtTestPlanMapper {
List<TestPlanDTO> list(@Param("request") QueryTestPlanRequest params);
List<TestPlanDTO> listRelate(@Param("request") QueryTestPlanRequest params);
List<TestPlanDTOWithMetric> listRelate(@Param("request") QueryTestPlanRequest params);
}

View File

@ -30,7 +30,7 @@
</if>
</select>
<select id="listRelate" resultType="io.metersphere.track.dto.TestPlanDTO">
<select id="listRelate" resultType="io.metersphere.track.dto.TestPlanDTOWithMetric">
select test_plan.*, project.name as project_name
from test_plan
left join project on test_plan.project_id = project.id

View File

@ -8,6 +8,7 @@ import io.metersphere.commons.utils.Pager;
import io.metersphere.commons.utils.SessionUtils;
import io.metersphere.track.dto.TestCaseReportMetricDTO;
import io.metersphere.track.dto.TestPlanDTO;
import io.metersphere.track.dto.TestPlanDTOWithMetric;
import io.metersphere.track.request.testcase.PlanCaseRelevanceRequest;
import io.metersphere.track.request.testcase.QueryTestPlanRequest;
import io.metersphere.track.service.TestPlanService;
@ -38,7 +39,7 @@ public class TestPlanController {
}
@PostMapping("/list/all/relate")
public List<TestPlanDTO> listRelateAll() {
public List<TestPlanDTOWithMetric> listRelateAll() {
return testPlanService.listRelateAllPlan();
}

View File

@ -0,0 +1,15 @@
package io.metersphere.track.dto;
import io.metersphere.base.domain.TestPlan;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class TestPlanDTOWithMetric extends TestPlanDTO {
private Double passRate;
private Double testRate;
private Integer passed;
private Integer tested;
private Integer total;
}

View File

@ -20,6 +20,8 @@ public class QueryTestPlanCaseRequest extends TestPlanTestCase {
private List<String> planIds;
private List<String> projectIds;
private String workspaceId;
private String name;

View File

@ -72,7 +72,4 @@ public class TestCaseReportService {
testPlanMapper.updateByPrimaryKeySelective(testPlan);
return report.getId();
}
}

View File

@ -6,6 +6,7 @@ import io.metersphere.base.mapper.TestCaseMapper;
import io.metersphere.base.mapper.TestCaseNodeMapper;
import io.metersphere.base.mapper.TestPlanMapper;
import io.metersphere.base.mapper.TestPlanTestCaseMapper;
import io.metersphere.base.mapper.ext.ExtProjectMapper;
import io.metersphere.base.mapper.ext.ExtTestPlanMapper;
import io.metersphere.base.mapper.ext.ExtTestPlanTestCaseMapper;
import io.metersphere.commons.constants.TestPlanStatus;
@ -13,6 +14,8 @@ import io.metersphere.commons.constants.TestPlanTestCaseStatus;
import io.metersphere.commons.exception.MSException;
import io.metersphere.commons.user.SessionUser;
import io.metersphere.commons.utils.SessionUtils;
import io.metersphere.controller.request.ProjectRequest;
import io.metersphere.dto.ProjectDTO;
import io.metersphere.track.dto.*;
import io.metersphere.track.request.testcase.PlanCaseRelevanceRequest;
import io.metersphere.track.request.testcase.QueryTestPlanRequest;
@ -58,6 +61,9 @@ public class TestPlanService {
@Resource
TestCaseNodeService testCaseNodeService;
@Resource
ExtProjectMapper extProjectMapper;
public void addTestPlan(TestPlan testPlan) {
testPlan.setId(UUID.randomUUID().toString());
testPlan.setStatus(TestPlanStatus.Prepare.name());
@ -149,13 +155,70 @@ public class TestPlanService {
return testPlanMapper.selectByExample(testPlanExample);
}
public List<TestPlanDTO> listRelateAllPlan() {
public List<TestPlanDTOWithMetric> listRelateAllPlan() {
SessionUser user = SessionUtils.getUser();
QueryTestPlanRequest request = new QueryTestPlanRequest();
request.setPrincipal(user.getId());
request.setWorkspaceId(SessionUtils.getCurrentWorkspaceId());
request.setPlanIds(extTestPlanTestCaseMapper.findRelateTestPlanId(user.getId()));
return extTestPlanMapper.listRelate(request);
List<String> projectIds = extProjectMapper.getProjectIdByWorkspaceId(SessionUtils.getCurrentOrganizationId());
List<TestPlanDTOWithMetric> testPlans = extTestPlanMapper.listRelate(request);
Map<String, List<TestPlanCaseDTO>> testCaseMap = new HashMap<>();
listTestCaseByProjectIds(projectIds).forEach(testCase -> {
List<TestPlanCaseDTO> list = testCaseMap.get(testCase.getPlanId());
if (list == null) {
list = new ArrayList<>();
list.add(testCase);
testCaseMap.put(testCase.getPlanId(), list);
} else {
list.add(testCase);
}
});
testPlans.forEach(testPlan -> {
List<TestPlanCaseDTO> testCases = testCaseMap.get(testPlan.getId());
testPlan.setTested(0);
testPlan.setPassed(0);
testPlan.setTotal(0);
if (testCases != null) {
testPlan.setTotal(testCases.size());
testCases.forEach(testCase -> {
if (!StringUtils.equals(testCase.getStatus(), TestPlanTestCaseStatus.Prepare.name())
&& !StringUtils.equals(testCase.getStatus(), TestPlanTestCaseStatus.Underway.name())) {
testPlan.setTested(testPlan.getTested() + 1);
if (StringUtils.equals(testCase.getStatus(), TestPlanTestCaseStatus.Pass.name())) {
testPlan.setPassed(testPlan.getPassed() + 1);
}
}
});
}
testPlan.setPassRate(getPercentWithTwoDecimals(testPlan.getTested() == 0 ? 0 : testPlan.getPassed()*1.0/testPlan.getTested()));
testPlan.setTestRate(getPercentWithTwoDecimals(testPlan.getTotal() == 0 ? 0 : testPlan.getTested()*1.0/testPlan.getTotal()));
});
return testPlans;
}
private double getPercentWithTwoDecimals(double value) {
return new BigDecimal(value)
.setScale(4, BigDecimal.ROUND_HALF_UP)
.doubleValue() * 100;
}
public List<TestPlanCaseDTO> listTestCaseByPlanId(String planId) {
QueryTestPlanCaseRequest request = new QueryTestPlanCaseRequest();
request.setPlanId(planId);
return extTestPlanTestCaseMapper.list(request);
}
public List<TestPlanCaseDTO> listTestCaseByProjectIds(List<String> projectIds) {
QueryTestPlanCaseRequest request = new QueryTestPlanCaseRequest();
request.setProjectIds(projectIds);
return extTestPlanTestCaseMapper.list(request);
}
public TestCaseReportMetricDTO getMetric(String planId) {
@ -180,9 +243,7 @@ public class TestPlanService {
childIdMap.put(item.getId(), childIds);
});
QueryTestPlanCaseRequest request = new QueryTestPlanCaseRequest();
request.setPlanId(planId);
List<TestPlanCaseDTO> testPlanTestCases = extTestPlanTestCaseMapper.list(request);
List<TestPlanCaseDTO> testPlanTestCases = listTestCaseByPlanId(planId);
Map<String, TestCaseReportModuleResultDTO> moduleResultMap = new HashMap<>();
@ -192,7 +253,6 @@ public class TestPlanService {
getModuleResultMap(childIdMap, moduleResultMap, testCase, nodeTrees);
}
nodeTrees.forEach(rootNode -> {
TestCaseReportModuleResultDTO moduleResult = moduleResultMap.get(rootNode.getId());
if (moduleResult != null) {
@ -201,9 +261,7 @@ public class TestPlanService {
});
for (TestCaseReportModuleResultDTO moduleResult : moduleResultMap.values()) {
moduleResult.setPassRate(new BigDecimal(moduleResult.getPassCount()*1.0f/moduleResult.getCaseCount())
.setScale(2, BigDecimal.ROUND_HALF_UP)
.doubleValue() * 100);
moduleResult.setPassRate(getPercentWithTwoDecimals(moduleResult.getPassCount()*1.0f/moduleResult.getCaseCount()));
if (moduleResult.getCaseCount() <= 0) {
moduleResultMap.remove(moduleResult.getModuleId());
}

View File

@ -3,15 +3,15 @@
<div class="main-content">
<el-row>
<el-col :span="15">
<related-test-plan-list/>
<related-test-plan-list ref="relatedTestPlanList"/>
</el-col>
<el-col :span="9">
<el-row>
<el-col>
<test-case-side-list :title="'最近测试'" :type="'recent'"/>
<test-case-side-list :title="'最近测试'" :type="'recent'" ref="testCaseRecentList"/>
</el-col>
<el-col>
<test-case-side-list :title="'待完成'" :type="'pending'"/>
<test-case-side-list :title="'待完成'" :type="'pending'" ref="testCasePendingList"/>
</el-col>
</el-row>
</el-col>
@ -25,7 +25,21 @@
import TestCaseSideList from "./components/TestCaseSideList";
export default {
name: "TrackHome",
components: {TestCaseSideList, RelatedTestPlanList}
components: {TestCaseSideList, RelatedTestPlanList},
watch: {
'$route'(to,from) {
if (to.path.indexOf('/track/home') > -1) {
this.innitData();
}
}
},
methods: {
innitData() {
this.$refs.relatedTestPlanList.initTableData();
this.$refs.testCaseRecentList.initTableData();
this.$refs.testCasePendingList.initTableData();
}
}
}
</script>

View File

@ -1,9 +1,9 @@
<template>
<home-base-component :title="'我的计划'">
<home-base-component :title="'我的计划'" v-loading>
<el-table
:data="tableData"
@row-click="intoPlan">
@row-click="intoPlan"
v-loading="result.loading">
<el-table-column
prop="name"
fixed
@ -24,22 +24,28 @@
prop="projectName"
:label="'通过率'"
show-overflow-tooltip>
20%
<template v-slot:default="scope">
{{scope.row.passRate}}%
</template>
</el-table-column>
<el-table-column
prop="projectName"
:label="'已测用例'"
show-overflow-tooltip>
14/16
<template v-slot:default="scope">
{{scope.row.tested}}/{{scope.row.total}}
</template>
</el-table-column>
<el-table-column
prop="projectName"
:label="'测试进度'"
min-width="120"
min-width="100"
show-overflow-tooltip>
<el-progress :percentage="50"></el-progress>
<template v-slot:default="scope">
<el-progress :percentage="scope.row.testRate"></el-progress>
</template>
</el-table-column>
<el-table-column
@ -56,7 +62,6 @@
show-overflow-tooltip>
</el-table-column>
</el-table>
</home-base-component>
@ -72,6 +77,7 @@
components: {MsTableOperator, PlanStageTableItem, PlanStatusTableItem, HomeBaseComponent},
data() {
return {
result: {},
tableData: []
}
},

View File

@ -5,7 +5,8 @@
<el-table
row-key="id"
@row-click="editTestCase"
:data="tableData">
:data="tableData"
v-loading="result.loading">
<el-table-column
prop="name"
@ -54,6 +55,7 @@
components: {PriorityTableItem, TypeTableItem, StatusTableItem, HomeBaseComponent},
data() {
return {
result: {},
tableData: [],
}
},