feat(接口测试): 更改测试计划首页接口数量统计卡片中已覆盖接口的计算方式
--bug=1015151 --user=宋天阳 【接口测试】未开启url可重复,场景里添加了自定义请求覆盖了用例url,首页-接口数量统计,已覆盖接口没有增加 https://www.tapd.cn/55049933/s/1208066
This commit is contained in:
parent
c6044ec193
commit
d5c34bb99e
|
@ -308,18 +308,28 @@ public class APITestController {
|
||||||
CoverageDTO coverage = new CoverageDTO();
|
CoverageDTO coverage = new CoverageDTO();
|
||||||
/**
|
/**
|
||||||
* 接口覆盖率
|
* 接口覆盖率
|
||||||
* 接口有案例/被场景引用 : 所有的接口
|
* 有案例的接口/没有案例确被场景引用 (apiHasCase + apiInScenario) : 所有的接口(effectiveApiCount)
|
||||||
*/
|
*/
|
||||||
long effectiveApiCount = apiDefinitionService.countEffectiveByProjectId(projectId);
|
long effectiveApiCount = apiDefinitionService.countEffectiveByProjectId(projectId);
|
||||||
long sourceIdCount = apiDefinitionService.countQuotedApiByProjectId(projectId);
|
long apiHasCase = apiDefinitionService.countApiByProjectIdAndHasCase(projectId);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 计算没有用例接口的覆盖数量
|
||||||
|
*/
|
||||||
|
List<ApiDefinition> apiNoCaseList = apiDefinitionService.selectEffectiveIdByProjectIdAndHaveNotCase(projectId);
|
||||||
|
Map<String, Map<String, String>> scenarioUrlList = apiAutomationService.selectScenarioUseUrlByProjectId(projectId);
|
||||||
|
int apiInScenario = apiAutomationService.countApiInScenario(projectId, scenarioUrlList, apiNoCaseList);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (effectiveApiCount == 0) {
|
if (effectiveApiCount == 0) {
|
||||||
coverage.setCoverate(0);
|
coverage.setCoverate(0);
|
||||||
coverage.setNotCoverate(0);
|
coverage.setNotCoverate(0);
|
||||||
} else {
|
} else {
|
||||||
coverage.setCoverate(sourceIdCount);
|
long quotedApiCount = apiHasCase + apiInScenario;
|
||||||
coverage.setNotCoverate(effectiveApiCount - sourceIdCount);
|
coverage.setCoverate(quotedApiCount);
|
||||||
float coverageRageNumber = (float) sourceIdCount * 100 / effectiveApiCount;
|
coverage.setNotCoverate(effectiveApiCount - quotedApiCount);
|
||||||
|
float coverageRageNumber = (float) quotedApiCount * 100 / effectiveApiCount;
|
||||||
DecimalFormat df = new DecimalFormat("0.0");
|
DecimalFormat df = new DecimalFormat("0.0");
|
||||||
coverage.setRateOfCoverage(df.format(coverageRageNumber) + "%");
|
coverage.setRateOfCoverage(df.format(coverageRageNumber) + "%");
|
||||||
}
|
}
|
||||||
|
|
|
@ -1768,19 +1768,29 @@ public class ApiAutomationService {
|
||||||
* 匹配场景中用到的路径
|
* 匹配场景中用到的路径
|
||||||
*
|
*
|
||||||
* @param scenarioUrlMap 场景使用到的url key:method
|
* @param scenarioUrlMap 场景使用到的url key:method
|
||||||
* @param allEffectiveApiList 接口集合(id / path 必须有数据)
|
* @param apiList 接口集合(id / path 必须有数据)
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public CoverageDTO countInterfaceCoverage(String projectId, Map<String, Map<String, String>> scenarioUrlMap, List<ApiDefinition> allEffectiveApiList) {
|
public CoverageDTO countInterfaceCoverage(String projectId, Map<String, Map<String, String>> scenarioUrlMap, List<ApiDefinition> apiList) {
|
||||||
CoverageDTO coverage = new CoverageDTO();
|
CoverageDTO coverage = new CoverageDTO();
|
||||||
if (CollectionUtils.isEmpty(allEffectiveApiList)) {
|
if (CollectionUtils.isEmpty(apiList)) {
|
||||||
return coverage;
|
return coverage;
|
||||||
}
|
}
|
||||||
|
int urlContainsCount = this.countApiInScenario(projectId, scenarioUrlMap, apiList);
|
||||||
|
coverage.setCoverate(urlContainsCount);
|
||||||
|
coverage.setNotCoverate(apiList.size() - urlContainsCount);
|
||||||
|
float coverageRageNumber = (float) urlContainsCount * 100 / apiList.size();
|
||||||
|
DecimalFormat df = new DecimalFormat("0.0");
|
||||||
|
coverage.setRateOfCoverage(df.format(coverageRageNumber) + "%");
|
||||||
|
return coverage;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int countApiInScenario(String projectId, Map<String, Map<String, String>> scenarioUrlMap, List<ApiDefinition> apiList) {
|
||||||
int urlContainsCount = 0;
|
int urlContainsCount = 0;
|
||||||
if (MapUtils.isNotEmpty(scenarioUrlMap)) {
|
if (MapUtils.isNotEmpty(scenarioUrlMap)) {
|
||||||
ProjectApplication urlRepeatableConfig = projectApplicationService.getProjectApplication(projectId, ProjectApplicationType.URL_REPEATABLE.name());
|
ProjectApplication urlRepeatableConfig = projectApplicationService.getProjectApplication(projectId, ProjectApplicationType.URL_REPEATABLE.name());
|
||||||
boolean isUrlRepeatable = BooleanUtils.toBoolean(urlRepeatableConfig.getTypeValue());
|
boolean isUrlRepeatable = BooleanUtils.toBoolean(urlRepeatableConfig.getTypeValue());
|
||||||
for (ApiDefinition model : allEffectiveApiList) {
|
for (ApiDefinition model : apiList) {
|
||||||
if (StringUtils.equalsIgnoreCase(model.getProtocol(), "http")) {
|
if (StringUtils.equalsIgnoreCase(model.getProtocol(), "http")) {
|
||||||
Map<String, String> stepIdAndUrlMap = scenarioUrlMap.get(model.getMethod());
|
Map<String, String> stepIdAndUrlMap = scenarioUrlMap.get(model.getMethod());
|
||||||
if (stepIdAndUrlMap != null) {
|
if (stepIdAndUrlMap != null) {
|
||||||
|
@ -1808,12 +1818,7 @@ public class ApiAutomationService {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
coverage.setCoverate(urlContainsCount);
|
return urlContainsCount;
|
||||||
coverage.setNotCoverate(allEffectiveApiList.size() - urlContainsCount);
|
|
||||||
float coverageRageNumber = (float) urlContainsCount * 100 / allEffectiveApiList.size();
|
|
||||||
DecimalFormat df = new DecimalFormat("0.0");
|
|
||||||
coverage.setRateOfCoverage(df.format(coverageRageNumber) + "%");
|
|
||||||
return coverage;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public ScenarioEnv getApiScenarioProjectId(String id) {
|
public ScenarioEnv getApiScenarioProjectId(String id) {
|
||||||
|
|
|
@ -2162,6 +2162,10 @@ public class ApiDefinitionService {
|
||||||
return extApiDefinitionMapper.selectEffectiveIdByProjectId(projectId);
|
return extApiDefinitionMapper.selectEffectiveIdByProjectId(projectId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<ApiDefinition> selectEffectiveIdByProjectIdAndHaveNotCase(String projectId) {
|
||||||
|
return extApiDefinitionMapper.selectEffectiveIdByProjectIdAndHaveNotCase(projectId);
|
||||||
|
}
|
||||||
|
|
||||||
public List<ApiDefinitionWithBLOBs> preparedUrl(String projectId, String method, String baseUrlSuffix) {
|
public List<ApiDefinitionWithBLOBs> preparedUrl(String projectId, String method, String baseUrlSuffix) {
|
||||||
if (StringUtils.isEmpty(baseUrlSuffix)) {
|
if (StringUtils.isEmpty(baseUrlSuffix)) {
|
||||||
return new ArrayList<>();
|
return new ArrayList<>();
|
||||||
|
@ -2372,8 +2376,8 @@ public class ApiDefinitionService {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public long countQuotedApiByProjectId(String projectId) {
|
public long countApiByProjectIdAndHasCase(String projectId) {
|
||||||
return extApiDefinitionMapper.countQuotedApiByProjectId(projectId);
|
return extApiDefinitionMapper.countApiByProjectIdAndHasCase(projectId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getRelationshipCount(String id) {
|
public int getRelationshipCount(String id) {
|
||||||
|
|
|
@ -75,7 +75,7 @@ public interface ExtApiDefinitionMapper {
|
||||||
|
|
||||||
Long getLastOrder(@Param("projectId") String projectId, @Param("baseOrder") Long baseOrder);
|
Long getLastOrder(@Param("projectId") String projectId, @Param("baseOrder") Long baseOrder);
|
||||||
|
|
||||||
long countQuotedApiByProjectId(String projectId);
|
long countApiByProjectIdAndHasCase(String projectId);
|
||||||
|
|
||||||
List<RelationshipGraphData.Node> getForGraph(@Param("ids") Set<String> ids);
|
List<RelationshipGraphData.Node> getForGraph(@Param("ids") Set<String> ids);
|
||||||
|
|
||||||
|
@ -100,4 +100,6 @@ public interface ExtApiDefinitionMapper {
|
||||||
List<ApiDefinitionWithBLOBs> selectRepeatByProtocol(@Param("names") List<String> names, @Param("protocol") String protocol, @Param("projectId") String projectId);
|
List<ApiDefinitionWithBLOBs> selectRepeatByProtocol(@Param("names") List<String> names, @Param("protocol") String protocol, @Param("projectId") String projectId);
|
||||||
|
|
||||||
int countById(String id);
|
int countById(String id);
|
||||||
|
|
||||||
|
List<ApiDefinition> selectEffectiveIdByProjectIdAndHaveNotCase(String projectId);
|
||||||
}
|
}
|
||||||
|
|
|
@ -658,6 +658,15 @@
|
||||||
AND status != 'Trash' AND latest = 1
|
AND status != 'Trash' AND latest = 1
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
<select id="selectEffectiveIdByProjectIdAndHaveNotCase" resultType="io.metersphere.base.domain.ApiDefinition">
|
||||||
|
select id, path, method, protocol
|
||||||
|
from api_definition
|
||||||
|
WHERE project_id = #{0}
|
||||||
|
AND status != 'Trash' AND latest = 1
|
||||||
|
AND id NOT IN (select api_definition_id FROM api_test_case WHERE project_id = #{0}
|
||||||
|
AND (status IS NULL
|
||||||
|
or status != 'Trash'))
|
||||||
|
</select>
|
||||||
<select id="moduleCount" resultType="java.lang.Integer">
|
<select id="moduleCount" resultType="java.lang.Integer">
|
||||||
select count(id) from api_definition
|
select count(id) from api_definition
|
||||||
<include refid="queryWhereCondition"/>
|
<include refid="queryWhereCondition"/>
|
||||||
|
@ -955,22 +964,15 @@
|
||||||
order by `order` desc limit 1;
|
order by `order` desc limit 1;
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<select id="countQuotedApiByProjectId" resultType="java.lang.Long">
|
<select id="countApiByProjectIdAndHasCase" resultType="java.lang.Long">
|
||||||
SELECT COUNT(id)
|
SELECT COUNT(id)
|
||||||
FROM api_definition
|
FROM api_definition
|
||||||
WHERE project_id = #{0}
|
WHERE project_id = #{0}
|
||||||
AND `status` != 'Trash'
|
AND `status` != 'Trash'
|
||||||
AND (
|
AND
|
||||||
id IN (
|
|
||||||
SELECT reference_id FROM api_scenario_reference_id WHERE api_scenario_id in (
|
|
||||||
SELECT id FROM api_scenario WHERE `status` is null or `status` != 'Trash'
|
|
||||||
)
|
|
||||||
)
|
|
||||||
OR
|
|
||||||
id IN (
|
id IN (
|
||||||
SELECT api_definition_id FROM api_test_case WHERE `status` is null or `status` != 'Trash'
|
SELECT api_definition_id FROM api_test_case WHERE `status` is null or `status` != 'Trash'
|
||||||
)
|
)
|
||||||
)
|
|
||||||
AND latest = 1
|
AND latest = 1
|
||||||
</select>
|
</select>
|
||||||
<select id="getForGraph" resultType="io.metersphere.dto.RelationshipGraphData$Node">
|
<select id="getForGraph" resultType="io.metersphere.dto.RelationshipGraphData$Node">
|
||||||
|
|
Loading…
Reference in New Issue