From 59728e02e0662e6410b22383d73d95215b12fdd2 Mon Sep 17 00:00:00 2001 From: song-tianyang Date: Thu, 21 Apr 2022 18:32:19 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E6=8E=A5=E5=8F=A3=E6=B5=8B=E8=AF=95):=20?= =?UTF-8?q?=E9=87=8D=E6=96=B0=E8=AE=BE=E8=AE=A1=E6=8E=A5=E5=8F=A3=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E9=A6=96=E9=A1=B5=E5=9C=BA=E6=99=AF=E9=9D=A2=E6=9D=BF?= =?UTF-8?q?=E8=A6=86=E7=9B=96=E7=8E=87=E7=9A=84=E7=BB=9F=E8=AE=A1=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --bug=1012386 --user=宋天阳 [接口测试]github#12735场景的接口覆盖率不能按照api_scenario_reference_id 的api 的id 统计 https://www.tapd.cn/55049933/s/1143296 --- .../api/controller/APITestController.java | 9 +- .../api/mock/utils/MockApiUtils.java | 44 ++++++ .../api/service/ApiAutomationService.java | 58 ++++++-- .../api/service/ApiDefinitionService.java | 2 - .../ApiScenarioReferenceIdService.java | 94 +++++++++--- .../base/domain/ApiScenarioReferenceId.java | 4 + .../domain/ApiScenarioReferenceIdExample.java | 140 ++++++++++++++++++ .../mapper/ApiScenarioReferenceIdMapper.xml | 43 +++++- .../base/mapper/ext/ExtApiScenarioMapper.java | 2 + .../base/mapper/ext/ExtApiScenarioMapper.xml | 3 + .../ext/ExtApiScenarioReferenceIdMapper.java | 3 +- .../ext/ExtApiScenarioReferenceIdMapper.xml | 11 +- .../listener/AppStartListener.java | 2 +- .../db/migration/V115__1.20__release.sql | 9 +- .../track/plan/components/TestPlanList.vue | 8 - 15 files changed, 368 insertions(+), 64 deletions(-) diff --git a/backend/src/main/java/io/metersphere/api/controller/APITestController.java b/backend/src/main/java/io/metersphere/api/controller/APITestController.java index 2270bb28a7..de7a527caf 100644 --- a/backend/src/main/java/io/metersphere/api/controller/APITestController.java +++ b/backend/src/main/java/io/metersphere/api/controller/APITestController.java @@ -28,10 +28,7 @@ import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.List; +import java.util.*; import static io.metersphere.commons.utils.JsonPathUtils.getListJson; @@ -294,10 +291,10 @@ public class APITestController { * 接口覆盖率 * 复制的接口定义/复制或引用的单接口用例/ 添加的自定义请求 url 路径与现有的接口定义一致的请求 */ - List allScenarioIdList = apiAutomationService.selectIdsByProjectId(projectId); + Map> scenarioUrlList = apiAutomationService.selectScenarioUseUrlByProjectId(projectId); List allEffectiveApiIdList = apiDefinitionService.selectEffectiveIdByProjectId(projectId); try { - float intetfaceCoverageRageNumber = apiAutomationService.countInterfaceCoverage(allScenarioIdList, allEffectiveApiIdList); + float intetfaceCoverageRageNumber = apiAutomationService.countInterfaceCoverage(scenarioUrlList, allEffectiveApiIdList); DecimalFormat df = new DecimalFormat("0.0"); returnStr = df.format(intetfaceCoverageRageNumber) + "%"; }catch (Exception e){ diff --git a/backend/src/main/java/io/metersphere/api/mock/utils/MockApiUtils.java b/backend/src/main/java/io/metersphere/api/mock/utils/MockApiUtils.java index 8fc7115838..ef101e7edf 100644 --- a/backend/src/main/java/io/metersphere/api/mock/utils/MockApiUtils.java +++ b/backend/src/main/java/io/metersphere/api/mock/utils/MockApiUtils.java @@ -772,4 +772,48 @@ public class MockApiUtils { return false; } } + + public static boolean isUrlInList(String url,List urlList){ + if(CollectionUtils.isEmpty(urlList)){ + return false; + } + String urlSuffix = url; + if(urlSuffix.startsWith("/")){ + urlSuffix = urlSuffix.substring(1); + } + String[] urlParams = urlSuffix.split("/"); + for (String path : urlList) { + if (StringUtils.equalsAny(path, url, "/" + url)) { + return true; + } else { + if (StringUtils.isEmpty(path)) { + continue; + } + if (path.startsWith("/")) { + path = path.substring(1); + } + if (StringUtils.isNotEmpty(path)) { + String[] pathArr = path.split("/"); + if (pathArr.length == urlParams.length) { + boolean isFetch = true; + for (int i = 0; i < urlParams.length; i++) { + String pathItem = pathArr[i]; + String urlItem = urlParams[i]; + if (!(pathItem.startsWith("{") && pathItem.endsWith("}")) && !(urlItem.startsWith("{") && urlItem.endsWith("}"))) { + if (!StringUtils.equals(pathArr[i], urlParams[i])) { + isFetch = false; + break; + } + } + + } + if (isFetch) { + return true; + } + } + } + } + } + return false; + } } diff --git a/backend/src/main/java/io/metersphere/api/service/ApiAutomationService.java b/backend/src/main/java/io/metersphere/api/service/ApiAutomationService.java index a9dcdbf524..6458165df3 100644 --- a/backend/src/main/java/io/metersphere/api/service/ApiAutomationService.java +++ b/backend/src/main/java/io/metersphere/api/service/ApiAutomationService.java @@ -18,6 +18,7 @@ import io.metersphere.api.dto.definition.request.unknown.MsJmeterElement; import io.metersphere.api.exec.scenario.ApiScenarioEnvService; import io.metersphere.api.exec.scenario.ApiScenarioExecuteService; import io.metersphere.api.exec.utils.GenerateHashTreeUtil; +import io.metersphere.api.mock.utils.MockApiUtils; import io.metersphere.api.parse.ApiImportParser; import io.metersphere.base.domain.*; import io.metersphere.base.mapper.*; @@ -46,6 +47,7 @@ import io.metersphere.track.request.testcase.QueryTestPlanRequest; import io.metersphere.track.request.testplan.FileOperationRequest; import io.metersphere.track.service.TestPlanScenarioCaseService; import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.EnumUtils; import org.apache.commons.lang3.StringUtils; @@ -56,6 +58,7 @@ import org.apache.jorphan.collections.HashTree; import org.apache.jorphan.collections.ListedHashTree; import org.mybatis.spring.SqlSessionUtils; import org.springframework.context.annotation.Lazy; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; @@ -515,7 +518,7 @@ public class ApiAutomationService { apiScenarioFollowMapper.deleteByExample(example); } - public void preDelete(String scenarioId,String scenarioDefinition) { + public void preDelete(String scenarioId, String scenarioDefinition) { //删除引用 apiScenarioReferenceIdService.deleteByScenarioId(scenarioId); @@ -1552,8 +1555,8 @@ public class ApiAutomationService { @Override public void run() { Thread.currentThread().setName("PRE_DELETE:" + System.currentTimeMillis()); - scenarioIdDefinitionMap.forEach((scenarioId,scenarioDefinition)->{ - preDelete(scenarioId,scenarioDefinition); + scenarioIdDefinitionMap.forEach((scenarioId, scenarioDefinition) -> { + preDelete(scenarioId, scenarioDefinition); scheduleService.deleteByResourceId(scenarioId, ScheduleGroup.API_SCENARIO_TEST.name()); }); } @@ -1569,23 +1572,22 @@ public class ApiAutomationService { *

* 匹配场景中用到的路径 * - * @param scenarioIdList 场景集合(id / scenario大字段 必须有数据) + * @param scenarioUrlMap 场景使用到的url key:method * @param allEffectiveApiList 接口集合(id / path 必须有数据) * @return */ - public float countInterfaceCoverage(List scenarioIdList, List allEffectiveApiList) { - if (CollectionUtils.isEmpty(scenarioIdList) || CollectionUtils.isEmpty(allEffectiveApiList)) { + public float countInterfaceCoverage(Map> scenarioUrlMap, List allEffectiveApiList) { + if (MapUtils.isEmpty(scenarioUrlMap) || CollectionUtils.isEmpty(allEffectiveApiList)) { return 0; } - List refIdList = apiScenarioReferenceIdService.findByScenarioIds(scenarioIdList); - int containsCount = 0; for (ApiDefinition model : allEffectiveApiList) { - if (refIdList.contains(model.getId())) { + List scenarioUrlList = scenarioUrlMap.get(model.getMethod()); + boolean matchedUrl = MockApiUtils.isUrlInList(model.getPath(), scenarioUrlList); + if (matchedUrl) { containsCount++; } } - float coverageRageNumber = (float) containsCount * 100 / allEffectiveApiList.size(); return coverageRageNumber; } @@ -1689,11 +1691,22 @@ public class ApiAutomationService { return null; } - public void checkApiScenarioReferenceId() { - List scenarioNoRefs = extApiScenarioMapper.selectByNoReferenceId(); - for (ApiScenarioWithBLOBs model : scenarioNoRefs) { - apiScenarioReferenceIdService.saveApiAndScenarioRelation(model); + @Async + public void resetApiScenarioReferenceId() { + LogUtil.info("Reset apiScenarioReferenceId is start."); + List scenarios = extApiScenarioMapper.selectByStatusIsNotTrash(); + Map> scenariosGroupByProjectId = + scenarios.stream().collect(Collectors.groupingBy(ApiScenarioWithBLOBs::getProjectId)); + for (Map.Entry> entry : scenariosGroupByProjectId.entrySet()) { + String projectId = entry.getKey(); + List list = entry.getValue(); + try { + apiScenarioReferenceIdService.saveApiAndScenarioRelation(list); + } catch (Exception e) { + LogUtil.error("Reset scenario reference id error. Project_id:" + projectId + "; error :" + e.getMessage()); + } } + LogUtil.info("Reset apiScenarioReferenceId is end."); } public List batchGenPerformanceTestJmx(ApiScenarioBatchRequest request) { @@ -2013,4 +2026,21 @@ public class ApiAutomationService { } } } + + public Map> selectScenarioUseUrlByProjectId(String projectId) { + List list = apiScenarioReferenceIdService.selectUrlByProjectId(projectId); + Map> returnMap = new HashMap<>(); + if (CollectionUtils.isNotEmpty(list)) { + list.forEach(item -> { + if (returnMap.containsKey(item.getMethod())) { + returnMap.get(item.getMethod()).add(item.getUrl()); + } else { + List urlList = new ArrayList<>(); + urlList.add(item.getUrl()); + returnMap.put(item.getMethod(), urlList); + } + }); + } + return returnMap; + } } diff --git a/backend/src/main/java/io/metersphere/api/service/ApiDefinitionService.java b/backend/src/main/java/io/metersphere/api/service/ApiDefinitionService.java index d8cdb3d23f..78dc5e5ae5 100644 --- a/backend/src/main/java/io/metersphere/api/service/ApiDefinitionService.java +++ b/backend/src/main/java/io/metersphere/api/service/ApiDefinitionService.java @@ -1705,14 +1705,12 @@ public class ApiDefinitionService { } public List preparedUrl(String projectId, String method, String baseUrlSuffix) { - if (StringUtils.isEmpty(baseUrlSuffix)) { return new ArrayList<>(); } else { ApiDefinitionExample example = new ApiDefinitionExample(); example.createCriteria().andMethodEqualTo(method).andProjectIdEqualTo(projectId).andStatusNotEqualTo("Trash").andProtocolEqualTo("HTTP"); List apiList = apiDefinitionMapper.selectByExample(example); - List apiIdList = new ArrayList<>(); boolean urlSuffixEndEmpty = false; String urlSuffix = baseUrlSuffix; diff --git a/backend/src/main/java/io/metersphere/api/service/ApiScenarioReferenceIdService.java b/backend/src/main/java/io/metersphere/api/service/ApiScenarioReferenceIdService.java index 31767c2b52..4119c07cb8 100644 --- a/backend/src/main/java/io/metersphere/api/service/ApiScenarioReferenceIdService.java +++ b/backend/src/main/java/io/metersphere/api/service/ApiScenarioReferenceIdService.java @@ -63,11 +63,50 @@ public class ApiScenarioReferenceIdService { return; } this.deleteByScenarioId(scenario.getId()); + List savedList = this.getApiAndScenarioRelation(scenario); + this.insertApiScenarioReferenceIds(savedList); + } + + public void saveApiAndScenarioRelation(List scenarios) { + if (CollectionUtils.isNotEmpty(scenarios)) { + List idList = new ArrayList<>(scenarios.size()); + LinkedList savedList = new LinkedList<>(); + scenarios.forEach(scenario -> { + if (StringUtils.isNotEmpty(scenario.getId())) { + idList.add(scenario.getId()); + savedList.addAll(this.getApiAndScenarioRelation(scenario)); + } + }); + if (CollectionUtils.isNotEmpty(idList)) { + ApiScenarioReferenceIdExample example = new ApiScenarioReferenceIdExample(); + example.createCriteria().andApiScenarioIdIn(idList); + apiScenarioReferenceIdMapper.deleteByExample(example); + } + this.insertApiScenarioReferenceIds(savedList); + } + } + + public void insertApiScenarioReferenceIds(List list) { + if (CollectionUtils.isNotEmpty(list)) { + SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH); + ApiScenarioReferenceIdMapper referenceIdMapper = sqlSession.getMapper(ApiScenarioReferenceIdMapper.class); + for (ApiScenarioReferenceId apiScenarioReferenceId : list) { + referenceIdMapper.insert(apiScenarioReferenceId); + } + sqlSession.flushStatements(); + if (sqlSession != null && sqlSessionFactory != null) { + SqlSessionUtils.closeSqlSession(sqlSession, sqlSessionFactory); + } + } + } + + public List getApiAndScenarioRelation(ApiScenarioWithBLOBs scenario) { + List returnList = new ArrayList<>(); Map referenceIdMap = new HashMap<>(); if (StringUtils.isNotEmpty(scenario.getScenarioDefinition())) { JSONObject jsonObject = JSONObject.parseObject(scenario.getScenarioDefinition(), Feature.DisableSpecialKeyDetect); if (!jsonObject.containsKey(MsHashTreeService.HASH_TREE)) { - return; + return returnList; } JSONArray hashTree = jsonObject.getJSONArray(MsHashTreeService.HASH_TREE); for (int index = 0; index < hashTree.size(); index++) { @@ -75,13 +114,28 @@ public class ApiScenarioReferenceIdService { if (item == null) { continue; } + if (item.containsKey(MsHashTreeService.ID) && item.containsKey(MsHashTreeService.REFERENCED)) { + String url = null; + String method = null; + if (item.containsKey(MsHashTreeService.PATH) && StringUtils.isNotEmpty(MsHashTreeService.PATH)) { + url = item.getString(MsHashTreeService.PATH); + } else if (item.containsKey(MsHashTreeService.URL)) { + url = item.getString(MsHashTreeService.URL); + } + if (item.containsKey(MsHashTreeService.METHOD)) { + method = item.getString(MsHashTreeService.METHOD); + } ApiScenarioReferenceId saveItem = new ApiScenarioReferenceId(); saveItem.setId(UUID.randomUUID().toString()); saveItem.setApiScenarioId(scenario.getId()); saveItem.setReferenceId(item.getString(MsHashTreeService.ID)); saveItem.setReferenceType(item.getString(MsHashTreeService.REFERENCED)); saveItem.setDataType(item.getString(MsHashTreeService.REF_TYPE)); + saveItem.setCreateTime(System.currentTimeMillis()); + saveItem.setCreateUserId(SessionUtils.getUserId()); + saveItem.setUrl(url); + saveItem.setMethod(method); referenceIdMap.put(item.getString(MsHashTreeService.ID), saveItem); } if (item.containsKey(MsHashTreeService.HASH_TREE)) { @@ -90,26 +144,16 @@ public class ApiScenarioReferenceIdService { } } if (MapUtils.isNotEmpty(referenceIdMap)) { - SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH); - ApiScenarioReferenceIdMapper referenceIdMapper = sqlSession.getMapper(ApiScenarioReferenceIdMapper.class); - for (ApiScenarioReferenceId apiScenarioReferenceId : referenceIdMap.values()) { - apiScenarioReferenceId.setCreateTime(System.currentTimeMillis()); - apiScenarioReferenceId.setCreateUserId(SessionUtils.getUserId()); - referenceIdMapper.insert(apiScenarioReferenceId); - } - sqlSession.flushStatements(); - if (sqlSession != null && sqlSessionFactory != null) { - SqlSessionUtils.closeSqlSession(sqlSession, sqlSessionFactory); - } + returnList.addAll(referenceIdMap.values()); } else { ApiScenarioReferenceId saveItem = new ApiScenarioReferenceId(); saveItem.setId(UUID.randomUUID().toString()); saveItem.setApiScenarioId(scenario.getId()); saveItem.setCreateTime(System.currentTimeMillis()); saveItem.setCreateUserId(SessionUtils.getUserId()); - apiScenarioReferenceIdMapper.insert(saveItem); + returnList.add(saveItem); } - + return returnList; } public Map deepElementRelation(String scenarioId, JSONArray hashTree) { @@ -118,12 +162,26 @@ public class ApiScenarioReferenceIdService { for (int index = 0; index < hashTree.size(); index++) { JSONObject item = hashTree.getJSONObject(index); if (item.containsKey(MsHashTreeService.ID) && item.containsKey(MsHashTreeService.REFERENCED)) { + String method = null; + String url = null; + if (item.containsKey(MsHashTreeService.PATH) && StringUtils.isNotEmpty(MsHashTreeService.PATH)) { + url = item.getString(MsHashTreeService.PATH); + } else if (item.containsKey(MsHashTreeService.URL)) { + url = item.getString(MsHashTreeService.URL); + } + if (item.containsKey(MsHashTreeService.METHOD)) { + method = item.getString(MsHashTreeService.METHOD); + } ApiScenarioReferenceId saveItem = new ApiScenarioReferenceId(); saveItem.setId(UUID.randomUUID().toString()); saveItem.setApiScenarioId(scenarioId); saveItem.setReferenceId(item.getString(MsHashTreeService.ID)); saveItem.setReferenceType(item.getString(MsHashTreeService.REFERENCED)); saveItem.setDataType(item.getString(MsHashTreeService.REF_TYPE)); + saveItem.setCreateTime(System.currentTimeMillis()); + saveItem.setCreateUserId(SessionUtils.getUserId()); + saveItem.setMethod(method); + saveItem.setUrl(url); deepRelations.put(item.getString(MsHashTreeService.ID), saveItem); } if (item.containsKey(MsHashTreeService.HASH_TREE)) { @@ -144,11 +202,7 @@ public class ApiScenarioReferenceIdService { } } - public List findByScenarioIds(List scenarioIdList) { - if(CollectionUtils.isEmpty(scenarioIdList)){ - return new ArrayList<>(); - }else { - return extApiScenarioReferenceIdMapper.selectRefIdsFromScenarioIds(scenarioIdList); - } + public List selectUrlByProjectId(String projectId) { + return extApiScenarioReferenceIdMapper.selectUrlByProjectId(projectId); } } diff --git a/backend/src/main/java/io/metersphere/base/domain/ApiScenarioReferenceId.java b/backend/src/main/java/io/metersphere/base/domain/ApiScenarioReferenceId.java index 1f998a3e62..9391e59a35 100644 --- a/backend/src/main/java/io/metersphere/base/domain/ApiScenarioReferenceId.java +++ b/backend/src/main/java/io/metersphere/base/domain/ApiScenarioReferenceId.java @@ -19,5 +19,9 @@ public class ApiScenarioReferenceId implements Serializable { private String dataType; + private String url; + + private String method; + private static final long serialVersionUID = 1L; } \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/domain/ApiScenarioReferenceIdExample.java b/backend/src/main/java/io/metersphere/base/domain/ApiScenarioReferenceIdExample.java index fcfc3ada10..7e577205e3 100644 --- a/backend/src/main/java/io/metersphere/base/domain/ApiScenarioReferenceIdExample.java +++ b/backend/src/main/java/io/metersphere/base/domain/ApiScenarioReferenceIdExample.java @@ -583,6 +583,146 @@ public class ApiScenarioReferenceIdExample { addCriterion("data_type not between", value1, value2, "dataType"); return (Criteria) this; } + + public Criteria andUrlIsNull() { + addCriterion("url is null"); + return (Criteria) this; + } + + public Criteria andUrlIsNotNull() { + addCriterion("url is not null"); + return (Criteria) this; + } + + public Criteria andUrlEqualTo(String value) { + addCriterion("url =", value, "url"); + return (Criteria) this; + } + + public Criteria andUrlNotEqualTo(String value) { + addCriterion("url <>", value, "url"); + return (Criteria) this; + } + + public Criteria andUrlGreaterThan(String value) { + addCriterion("url >", value, "url"); + return (Criteria) this; + } + + public Criteria andUrlGreaterThanOrEqualTo(String value) { + addCriterion("url >=", value, "url"); + return (Criteria) this; + } + + public Criteria andUrlLessThan(String value) { + addCriterion("url <", value, "url"); + return (Criteria) this; + } + + public Criteria andUrlLessThanOrEqualTo(String value) { + addCriterion("url <=", value, "url"); + return (Criteria) this; + } + + public Criteria andUrlLike(String value) { + addCriterion("url like", value, "url"); + return (Criteria) this; + } + + public Criteria andUrlNotLike(String value) { + addCriterion("url not like", value, "url"); + return (Criteria) this; + } + + public Criteria andUrlIn(List values) { + addCriterion("url in", values, "url"); + return (Criteria) this; + } + + public Criteria andUrlNotIn(List values) { + addCriterion("url not in", values, "url"); + return (Criteria) this; + } + + public Criteria andUrlBetween(String value1, String value2) { + addCriterion("url between", value1, value2, "url"); + return (Criteria) this; + } + + public Criteria andUrlNotBetween(String value1, String value2) { + addCriterion("url not between", value1, value2, "url"); + return (Criteria) this; + } + + public Criteria andMethodIsNull() { + addCriterion("`method` is null"); + return (Criteria) this; + } + + public Criteria andMethodIsNotNull() { + addCriterion("`method` is not null"); + return (Criteria) this; + } + + public Criteria andMethodEqualTo(String value) { + addCriterion("`method` =", value, "method"); + return (Criteria) this; + } + + public Criteria andMethodNotEqualTo(String value) { + addCriterion("`method` <>", value, "method"); + return (Criteria) this; + } + + public Criteria andMethodGreaterThan(String value) { + addCriterion("`method` >", value, "method"); + return (Criteria) this; + } + + public Criteria andMethodGreaterThanOrEqualTo(String value) { + addCriterion("`method` >=", value, "method"); + return (Criteria) this; + } + + public Criteria andMethodLessThan(String value) { + addCriterion("`method` <", value, "method"); + return (Criteria) this; + } + + public Criteria andMethodLessThanOrEqualTo(String value) { + addCriterion("`method` <=", value, "method"); + return (Criteria) this; + } + + public Criteria andMethodLike(String value) { + addCriterion("`method` like", value, "method"); + return (Criteria) this; + } + + public Criteria andMethodNotLike(String value) { + addCriterion("`method` not like", value, "method"); + return (Criteria) this; + } + + public Criteria andMethodIn(List values) { + addCriterion("`method` in", values, "method"); + return (Criteria) this; + } + + public Criteria andMethodNotIn(List values) { + addCriterion("`method` not in", values, "method"); + return (Criteria) this; + } + + public Criteria andMethodBetween(String value1, String value2) { + addCriterion("`method` between", value1, value2, "method"); + return (Criteria) this; + } + + public Criteria andMethodNotBetween(String value1, String value2) { + addCriterion("`method` not between", value1, value2, "method"); + return (Criteria) this; + } } public static class Criteria extends GeneratedCriteria { diff --git a/backend/src/main/java/io/metersphere/base/mapper/ApiScenarioReferenceIdMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ApiScenarioReferenceIdMapper.xml index b8df1e86cd..0645b5eb66 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ApiScenarioReferenceIdMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ApiScenarioReferenceIdMapper.xml @@ -9,6 +9,8 @@ + + @@ -69,7 +71,8 @@ - id, api_scenario_id, create_time, create_user_id, reference_id, reference_type, data_type + id, api_scenario_id, create_time, create_user_id, reference_id, reference_type, data_type, + url, `method` @@ -188,6 +205,12 @@ data_type = #{record.dataType,jdbcType=VARCHAR}, + + url = #{record.url,jdbcType=VARCHAR}, + + + `method` = #{record.method,jdbcType=VARCHAR}, + @@ -201,7 +224,9 @@ create_user_id = #{record.createUserId,jdbcType=VARCHAR}, reference_id = #{record.referenceId,jdbcType=VARCHAR}, reference_type = #{record.referenceType,jdbcType=VARCHAR}, - data_type = #{record.dataType,jdbcType=VARCHAR} + data_type = #{record.dataType,jdbcType=VARCHAR}, + url = #{record.url,jdbcType=VARCHAR}, + `method` = #{record.method,jdbcType=VARCHAR} @@ -227,6 +252,12 @@ data_type = #{dataType,jdbcType=VARCHAR}, + + url = #{url,jdbcType=VARCHAR}, + + + `method` = #{method,jdbcType=VARCHAR}, + where id = #{id,jdbcType=VARCHAR} @@ -237,7 +268,9 @@ create_user_id = #{createUserId,jdbcType=VARCHAR}, reference_id = #{referenceId,jdbcType=VARCHAR}, reference_type = #{referenceType,jdbcType=VARCHAR}, - data_type = #{dataType,jdbcType=VARCHAR} + data_type = #{dataType,jdbcType=VARCHAR}, + url = #{url,jdbcType=VARCHAR}, + `method` = #{method,jdbcType=VARCHAR} where id = #{id,jdbcType=VARCHAR} \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiScenarioMapper.java b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiScenarioMapper.java index 0e8d3c09c5..568e9010a9 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiScenarioMapper.java +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiScenarioMapper.java @@ -88,4 +88,6 @@ public interface ExtApiScenarioMapper { void addLatestVersion(String refId); List selectRefIdsForVersionChange(@Param("versionId") String versionId, @Param("projectId") String projectId); + + List selectByStatusIsNotTrash(); } diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiScenarioMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiScenarioMapper.xml index 24e7c31e55..3fc9928e8d 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiScenarioMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiScenarioMapper.xml @@ -713,4 +713,7 @@ ) + diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiScenarioReferenceIdMapper.java b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiScenarioReferenceIdMapper.java index e5af1d7cf1..f6d2dee0b0 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiScenarioReferenceIdMapper.java +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiScenarioReferenceIdMapper.java @@ -1,9 +1,10 @@ package io.metersphere.base.mapper.ext; +import io.metersphere.base.domain.ApiScenarioReferenceId; import org.apache.ibatis.annotations.Param; import java.util.List; public interface ExtApiScenarioReferenceIdMapper { - List selectRefIdsFromScenarioIds(@Param("ids") List scenarioIds); + List selectUrlByProjectId(String projectId); } diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiScenarioReferenceIdMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiScenarioReferenceIdMapper.xml index b93bbccd7e..3303b65c80 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiScenarioReferenceIdMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiScenarioReferenceIdMapper.xml @@ -1,11 +1,10 @@ - + SELECT method,url from api_scenario_reference_id WHERE api_scenario_id in ( + SELECT id from api_scenario WHERE project_id = #{0} + ) AND url IS NOT NULL AND method IS NOT NULL; + \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/listener/AppStartListener.java b/backend/src/main/java/io/metersphere/listener/AppStartListener.java index 81662db0c2..bbf9364d09 100644 --- a/backend/src/main/java/io/metersphere/listener/AppStartListener.java +++ b/backend/src/main/java/io/metersphere/listener/AppStartListener.java @@ -137,7 +137,7 @@ public class AppStartListener implements ApplicationListener - -