mirror of
https://gitee.com/fit2cloud-feizhiyun/MeterSphere.git
synced 2024-12-02 20:19:16 +08:00
feat(接口测试): 接口自动化场景导出再导入保留引用关系支持跨空间补充数据
--user=郭雨琦 接口自动化场景导出再导入保留引用关系 场景导入导出跨空间,增加数据 https://www.tapd.cn/55049933/prong/stories/view/1155049933001003780
This commit is contained in:
parent
2f7f2ecf3d
commit
de26483f74
@ -1,16 +1,28 @@
|
|||||||
package io.metersphere.api.dto.automation.parse;
|
package io.metersphere.api.dto.automation.parse;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSON;
|
||||||
|
import com.alibaba.fastjson.JSONArray;
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import io.metersphere.api.dto.automation.ApiScenarioModuleDTO;
|
import io.metersphere.api.dto.automation.ApiScenarioModuleDTO;
|
||||||
|
import io.metersphere.api.dto.definition.ApiDefinitionRequest;
|
||||||
|
import io.metersphere.api.dto.definition.ApiDefinitionResult;
|
||||||
|
import io.metersphere.api.dto.definition.SaveApiTestCaseRequest;
|
||||||
import io.metersphere.api.dto.definition.parse.ms.NodeTree;
|
import io.metersphere.api.dto.definition.parse.ms.NodeTree;
|
||||||
|
import io.metersphere.api.service.ApiDefinitionService;
|
||||||
import io.metersphere.api.service.ApiScenarioModuleService;
|
import io.metersphere.api.service.ApiScenarioModuleService;
|
||||||
import io.metersphere.base.domain.ApiScenarioModule;
|
import io.metersphere.api.service.ApiTestCaseService;
|
||||||
|
import io.metersphere.base.domain.*;
|
||||||
|
import io.metersphere.base.mapper.ApiDefinitionMapper;
|
||||||
|
import io.metersphere.base.mapper.ApiTestCaseMapper;
|
||||||
|
import io.metersphere.commons.constants.APITestStatus;
|
||||||
import io.metersphere.commons.utils.BeanUtils;
|
import io.metersphere.commons.utils.BeanUtils;
|
||||||
import io.metersphere.commons.utils.CommonBeanFactory;
|
import io.metersphere.commons.utils.CommonBeanFactory;
|
||||||
|
import io.metersphere.commons.utils.SessionUtils;
|
||||||
|
import io.metersphere.service.ProjectService;
|
||||||
import org.apache.commons.collections.CollectionUtils;
|
import org.apache.commons.collections.CollectionUtils;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
import java.util.Iterator;
|
import java.util.*;
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class ApiScenarioImportUtil {
|
public class ApiScenarioImportUtil {
|
||||||
|
|
||||||
@ -106,4 +118,189 @@ public class ApiScenarioImportUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean checkWorkSpace(String projectId, String currentProjectId) {
|
||||||
|
if(!Objects.equals(projectId, currentProjectId)){
|
||||||
|
ProjectService projectService = CommonBeanFactory.getBean(ProjectService.class);
|
||||||
|
Project project = projectService.getProjectById(projectId);
|
||||||
|
return Objects.equals(project.getWorkspaceId(), SessionUtils.getCurrentWorkspaceId());
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ApiDefinitionResult getApiDefinitionResult(JSONObject object, ApiDefinitionService apiDefinitionService) {
|
||||||
|
ApiDefinitionRequest apiDefinitionRequest = new ApiDefinitionRequest();
|
||||||
|
apiDefinitionRequest.setPath(object.getString("path"));
|
||||||
|
apiDefinitionRequest.setMethod(object.getString("method"));
|
||||||
|
apiDefinitionRequest.setPath(object.getString("protocol"));
|
||||||
|
return apiDefinitionService.getApiDefinitionResult(apiDefinitionRequest);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ApiTestCaseWithBLOBs getApiTestCase(JSONObject object, ApiTestCaseService testCaseService, ApiDefinitionResult apiDefinitionResult) {
|
||||||
|
SaveApiTestCaseRequest request = new SaveApiTestCaseRequest();
|
||||||
|
request.setName(object.getString("name"));
|
||||||
|
request.setApiDefinitionId(apiDefinitionResult.getId());
|
||||||
|
return testCaseService.getSameCaseWithBLOBs(request);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void checkCase(JSONObject object, String versionId, String projectId, ApiTestCaseMapper apiTestCaseMapper, ApiDefinitionMapper apiDefinitionMapper) {
|
||||||
|
ApiTestCaseService testCaseService = CommonBeanFactory.getBean(ApiTestCaseService.class);
|
||||||
|
ApiDefinitionService apiDefinitionService = CommonBeanFactory.getBean(ApiDefinitionService.class);
|
||||||
|
ApiTestCaseWithBLOBs bloBs = testCaseService.get(object.getString("id"));
|
||||||
|
if (bloBs != null) {
|
||||||
|
boolean isSameWorkSpace = checkWorkSpace(bloBs.getProjectId(),projectId);
|
||||||
|
if(!isSameWorkSpace){
|
||||||
|
ApiDefinitionResult apiDefinition = apiDefinitionService.getById(bloBs.getApiDefinitionId());
|
||||||
|
String apiDefinitionId = checkDefinition(apiDefinitionService,apiDefinition, versionId,projectId,apiDefinitionMapper);
|
||||||
|
structureCaseData(bloBs,apiDefinitionId,versionId,projectId,apiTestCaseMapper);
|
||||||
|
object.put("projectId", projectId);
|
||||||
|
object.put("id", bloBs.getId());
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
ApiDefinitionResult apiDefinition = getApiDefinitionResult(object,apiDefinitionService);
|
||||||
|
ApiTestCaseWithBLOBs testCase;
|
||||||
|
if(apiDefinition!=null){
|
||||||
|
testCase= getApiTestCase(object, testCaseService, apiDefinition);
|
||||||
|
if (testCase != null) {
|
||||||
|
boolean isSameWorkSpace = checkWorkSpace(testCase.getProjectId(),projectId);
|
||||||
|
if(!isSameWorkSpace){
|
||||||
|
String apiDefinitionId = checkDefinition(apiDefinitionService, apiDefinition, versionId,projectId,apiDefinitionMapper);
|
||||||
|
structureCaseData(testCase,apiDefinitionId,versionId,projectId,apiTestCaseMapper);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
String apiDefinitionId = checkDefinition(apiDefinitionService, apiDefinition, versionId,projectId,apiDefinitionMapper);
|
||||||
|
testCase= structureCaseByJson(object, versionId, projectId, apiDefinitionId,apiTestCaseMapper);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
ApiDefinitionResult apiDefinitionResult = structureApiDefinitionByJson(apiDefinitionService, object, versionId, projectId, apiDefinitionMapper);
|
||||||
|
testCase = structureCaseByJson(object, versionId, projectId, apiDefinitionResult.getId(),apiTestCaseMapper);
|
||||||
|
}
|
||||||
|
object.put("projectId", projectId);
|
||||||
|
object.put("id", testCase.getId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String checkDefinition(ApiDefinitionService apiDefinitionService, ApiDefinitionResult apiDefinition, String versionId, String projectId,ApiDefinitionMapper apiDefinitionMapper) {
|
||||||
|
boolean isSameWorkspace = checkWorkSpace(apiDefinition.getProjectId(),projectId);
|
||||||
|
if(!isSameWorkspace){
|
||||||
|
String requestStr = apiDefinition.getRequest();
|
||||||
|
JSONObject objectDefinition = JSONObject.parseObject(requestStr);
|
||||||
|
ApiDefinitionResult apiDefinitionResult1 = insertDefinitionByApiDefinition(apiDefinitionService,apiDefinition, objectDefinition, versionId, projectId,apiDefinitionMapper);
|
||||||
|
return apiDefinitionResult1.getId();
|
||||||
|
}else{
|
||||||
|
return apiDefinition.getId();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void structureCaseData(ApiTestCaseWithBLOBs testCase, String apiDefinitionId, String versionId, String projectId,ApiTestCaseMapper apiTestCaseMapper) {
|
||||||
|
String requestStr = testCase.getRequest();
|
||||||
|
JSONObject objectCase = JSONObject.parseObject(requestStr);
|
||||||
|
testCase.setApiDefinitionId(apiDefinitionId);
|
||||||
|
insertCaseByApiTestCase(testCase,objectCase,versionId,projectId,apiTestCaseMapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ApiDefinitionResult structureApiDefinitionByJson(ApiDefinitionService apiDefinitionService,JSONObject object, String versionId, String projectId,ApiDefinitionMapper apiDefinitionMapper) {
|
||||||
|
ApiDefinitionResult test = new ApiDefinitionResult();
|
||||||
|
apiDefinitionService.checkQuota();
|
||||||
|
String protocal = object.getString("protocal");
|
||||||
|
if (StringUtils.equals(protocal, "DUBBO")) {
|
||||||
|
test.setMethod("dubbo://");
|
||||||
|
}else{
|
||||||
|
test.setMethod(protocal);
|
||||||
|
}
|
||||||
|
apiDefinitionService.initModulePathAndId(projectId, test);
|
||||||
|
String id = UUID.randomUUID().toString();
|
||||||
|
test.setId(id);
|
||||||
|
test.setName(object.getString("name"));
|
||||||
|
test.setPath(object.getString("path"));
|
||||||
|
test.setCreateUser(SessionUtils.getUserId());
|
||||||
|
test.setProjectId(projectId);
|
||||||
|
test.setCreateTime(System.currentTimeMillis());
|
||||||
|
test.setUpdateTime(System.currentTimeMillis());
|
||||||
|
test.setStatus(APITestStatus.Underway.name());
|
||||||
|
test.setRefId(id);
|
||||||
|
test.setLatest(true);
|
||||||
|
test.setVersionId(versionId);
|
||||||
|
object.put("id", test.getId());
|
||||||
|
object.put("resourceId", test.getId());
|
||||||
|
object.put("projectId", projectId);
|
||||||
|
object.put("useEnvironment","");
|
||||||
|
test.setRequest(object.toJSONString());
|
||||||
|
test.setUserId(SessionUtils.getUserId());
|
||||||
|
test.setLatest(true);
|
||||||
|
test.setOrder(apiDefinitionService.getImportNextOrder(projectId));
|
||||||
|
apiDefinitionMapper.insert(test);
|
||||||
|
return test;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ApiDefinitionResult insertDefinitionByApiDefinition(ApiDefinitionService apiDefinitionService, ApiDefinitionResult apiDefinitionResult, JSONObject objectDefinition, String versionId, String projectId,ApiDefinitionMapper apiDefinitionMapper){
|
||||||
|
String id = UUID.randomUUID().toString();
|
||||||
|
apiDefinitionResult.setId(id);
|
||||||
|
apiDefinitionResult.setProjectId(projectId);
|
||||||
|
apiDefinitionResult.setVersionId(versionId);
|
||||||
|
apiDefinitionResult.setRefId(id);
|
||||||
|
apiDefinitionResult.setLatest(true);
|
||||||
|
objectDefinition.put("id", id);
|
||||||
|
objectDefinition.put("resourceId", id);
|
||||||
|
objectDefinition.put("projectId", projectId);
|
||||||
|
objectDefinition.put("useEnvironment","");
|
||||||
|
apiDefinitionService.initModulePathAndId(projectId, apiDefinitionResult);
|
||||||
|
apiDefinitionResult.setRequest(JSON.toJSONString(objectDefinition));
|
||||||
|
apiDefinitionResult.setOrder(apiDefinitionService.getImportNextOrder(projectId));
|
||||||
|
apiDefinitionMapper.insert(apiDefinitionResult);
|
||||||
|
return apiDefinitionResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ApiTestCaseWithBLOBs structureCaseByJson(JSONObject object, String versionId, String projectId, String apiDefinitionId,ApiTestCaseMapper apiTestCaseMapper) {
|
||||||
|
ApiDefinitionService apiDefinitionService = CommonBeanFactory.getBean(ApiDefinitionService.class);
|
||||||
|
ApiTestCaseWithBLOBs apiTestCase = new ApiTestCaseWithBLOBs();
|
||||||
|
String id = UUID.randomUUID().toString();
|
||||||
|
apiTestCase.setId(id);
|
||||||
|
apiTestCase.setName(object.getString("name"));
|
||||||
|
apiTestCase.setCaseStatus(APITestStatus.Underway.name());
|
||||||
|
apiTestCase.setApiDefinitionId(apiDefinitionId);
|
||||||
|
apiTestCase.setCreateUserId(Objects.requireNonNull(SessionUtils.getUser()).getId());
|
||||||
|
apiTestCase.setUpdateUserId(Objects.requireNonNull(SessionUtils.getUser()).getId());
|
||||||
|
apiTestCase.setProjectId(projectId);
|
||||||
|
apiTestCase.setCreateTime(System.currentTimeMillis());
|
||||||
|
apiTestCase.setUpdateTime(System.currentTimeMillis());
|
||||||
|
apiTestCase.setVersionId(versionId);
|
||||||
|
object.put("id", apiTestCase.getId());
|
||||||
|
object.put("resourceId", apiTestCase.getId());
|
||||||
|
object.put("projectId", projectId);
|
||||||
|
object.put("useEnvironment","");
|
||||||
|
apiTestCase.setRequest(object.toJSONString());
|
||||||
|
apiTestCase.setOrder(apiDefinitionService.getImportNextCaseOrder(projectId));
|
||||||
|
apiTestCaseMapper.insert(apiTestCase);
|
||||||
|
return apiTestCase;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void insertCaseByApiTestCase(ApiTestCaseWithBLOBs bloBs, JSONObject objectCase, String versionId, String projectId,ApiTestCaseMapper apiTestCaseMapper){
|
||||||
|
ApiDefinitionService apiDefinitionService = CommonBeanFactory.getBean(ApiDefinitionService.class);
|
||||||
|
String id = UUID.randomUUID().toString();
|
||||||
|
bloBs.setId(id);
|
||||||
|
bloBs.setProjectId(projectId);
|
||||||
|
bloBs.setVersionId(versionId);
|
||||||
|
objectCase.put("id", id);
|
||||||
|
objectCase.put("resourceId", id);
|
||||||
|
objectCase.put("projectId", projectId);
|
||||||
|
objectCase.put("useEnvironment","");
|
||||||
|
bloBs.setRequest(JSON.toJSONString(objectCase));
|
||||||
|
bloBs.setOrder(apiDefinitionService.getImportNextCaseOrder(projectId));
|
||||||
|
apiTestCaseMapper.insert(bloBs);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void formatHashTree(JSONArray hashTree) {
|
||||||
|
if (CollectionUtils.isNotEmpty(hashTree)) {
|
||||||
|
for (int i = 0; i < hashTree.size(); i++) {
|
||||||
|
JSONObject object = (JSONObject) hashTree.get(i);
|
||||||
|
object.put("index", i + 1);
|
||||||
|
object.put("resourceId", UUID.randomUUID().toString());
|
||||||
|
hashTree.set(i, object);
|
||||||
|
if (CollectionUtils.isNotEmpty(object.getJSONArray("hashTree"))) {
|
||||||
|
formatHashTree(object.getJSONArray("hashTree"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,21 +1,15 @@
|
|||||||
package io.metersphere.api.dto.automation.parse;
|
package io.metersphere.api.dto.automation.parse;
|
||||||
|
|
||||||
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSON;
|
||||||
import com.alibaba.fastjson.JSONArray;
|
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import com.alibaba.fastjson.parser.Feature;
|
import com.alibaba.fastjson.parser.Feature;
|
||||||
import io.metersphere.api.dto.ApiTestImportRequest;
|
import io.metersphere.api.dto.ApiTestImportRequest;
|
||||||
import io.metersphere.api.dto.EnvironmentType;
|
import io.metersphere.api.dto.EnvironmentType;
|
||||||
import io.metersphere.api.dto.definition.parse.ms.NodeTree;
|
import io.metersphere.api.dto.definition.parse.ms.NodeTree;
|
||||||
import io.metersphere.api.dto.definition.request.MsScenario;
|
import io.metersphere.api.dto.definition.request.MsScenario;
|
||||||
|
import io.metersphere.base.domain.*;
|
||||||
import io.metersphere.plugin.core.MsTestElement;
|
import io.metersphere.plugin.core.MsTestElement;
|
||||||
import io.metersphere.api.parse.MsAbstractParser;
|
import io.metersphere.api.parse.MsAbstractParser;
|
||||||
import io.metersphere.api.service.ApiAutomationService;
|
|
||||||
import io.metersphere.api.service.ApiTestCaseService;
|
|
||||||
import io.metersphere.base.domain.ApiScenarioModule;
|
|
||||||
import io.metersphere.base.domain.ApiScenarioWithBLOBs;
|
|
||||||
import io.metersphere.base.domain.ApiTestCaseWithBLOBs;
|
|
||||||
import io.metersphere.commons.utils.CommonBeanFactory;
|
|
||||||
import org.apache.commons.collections.CollectionUtils;
|
import org.apache.commons.collections.CollectionUtils;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
@ -66,20 +60,6 @@ public class MsScenarioParser extends MsAbstractParser<ScenarioImport> {
|
|||||||
return scenarioWithBLOBs;
|
return scenarioWithBLOBs;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void formatHashTree(JSONArray hashTree) {
|
|
||||||
if (CollectionUtils.isNotEmpty(hashTree)) {
|
|
||||||
for (int i = 0; i < hashTree.size(); i++) {
|
|
||||||
JSONObject object = (JSONObject) hashTree.get(i);
|
|
||||||
object.put("index", i + 1);
|
|
||||||
object.put("resourceId", UUID.randomUUID().toString());
|
|
||||||
hashTree.set(i, object);
|
|
||||||
if (CollectionUtils.isNotEmpty(object.getJSONArray("hashTree"))) {
|
|
||||||
formatHashTree(object.getJSONArray("hashTree"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private ScenarioImport parseMsFormat(String testStr, ApiTestImportRequest importRequest) {
|
private ScenarioImport parseMsFormat(String testStr, ApiTestImportRequest importRequest) {
|
||||||
ScenarioImport scenarioImport = JSON.parseObject(testStr, ScenarioImport.class);
|
ScenarioImport scenarioImport = JSON.parseObject(testStr, ScenarioImport.class);
|
||||||
List<ApiScenarioWithBLOBs> data = scenarioImport.getData();
|
List<ApiScenarioWithBLOBs> data = scenarioImport.getData();
|
||||||
@ -102,9 +82,6 @@ public class MsScenarioParser extends MsAbstractParser<ScenarioImport> {
|
|||||||
if (StringUtils.isNotBlank(scenarioDefinitionStr)) {
|
if (StringUtils.isNotBlank(scenarioDefinitionStr)) {
|
||||||
JSONObject scenarioDefinition = JSONObject.parseObject(scenarioDefinitionStr);
|
JSONObject scenarioDefinition = JSONObject.parseObject(scenarioDefinitionStr);
|
||||||
if (scenarioDefinition != null) {
|
if (scenarioDefinition != null) {
|
||||||
JSONArray hashTree = scenarioDefinition.getJSONArray("hashTree");
|
|
||||||
formatHashTree(hashTree);
|
|
||||||
setCopy(hashTree);
|
|
||||||
JSONObject environmentMap = scenarioDefinition.getJSONObject("environmentMap");
|
JSONObject environmentMap = scenarioDefinition.getJSONObject("environmentMap");
|
||||||
if (environmentMap != null) {
|
if (environmentMap != null) {
|
||||||
scenarioDefinition.put("environmentMap", new HashMap<>());
|
scenarioDefinition.put("environmentMap", new HashMap<>());
|
||||||
@ -127,61 +104,18 @@ public class MsScenarioParser extends MsAbstractParser<ScenarioImport> {
|
|||||||
// 旧版本未导出模块
|
// 旧版本未导出模块
|
||||||
parseModule(item.getModulePath(), importRequest, item);
|
parseModule(item.getModulePath(), importRequest, item);
|
||||||
}
|
}
|
||||||
|
|
||||||
// item.setId(UUID.randomUUID().toString());
|
|
||||||
item.setProjectId(this.projectId);
|
item.setProjectId(this.projectId);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
return scenarioImport;
|
return scenarioImport;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setCopy(JSONArray hashTree) {
|
|
||||||
// 将引用转成复制
|
|
||||||
if (CollectionUtils.isNotEmpty(hashTree)) {
|
|
||||||
for (int i = 0; i < hashTree.size(); i++) {
|
|
||||||
JSONObject object = (JSONObject) hashTree.get(i);
|
|
||||||
String referenced = object.getString("referenced");
|
|
||||||
if (StringUtils.isNotBlank(referenced) && StringUtils.equals(referenced, "REF")) {
|
|
||||||
// 检测引用对象是否存在,若果不存在则改成复制对象
|
|
||||||
String refType = object.getString("refType");
|
|
||||||
boolean isCopy = true;
|
|
||||||
if (StringUtils.isNotEmpty(refType)) {
|
|
||||||
if (refType.equals("CASE")) {
|
|
||||||
ApiTestCaseService testCaseService = CommonBeanFactory.getBean(ApiTestCaseService.class);
|
|
||||||
ApiTestCaseWithBLOBs bloBs = testCaseService.get(object.getString("id"));
|
|
||||||
if (bloBs != null) {
|
|
||||||
isCopy = false;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
ApiAutomationService apiAutomationService = CommonBeanFactory.getBean(ApiAutomationService.class);
|
|
||||||
ApiScenarioWithBLOBs bloBs = apiAutomationService.getDto(object.getString("id"));
|
|
||||||
if (bloBs != null) {
|
|
||||||
isCopy = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (isCopy) {
|
|
||||||
object.put("referenced", "Copy");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
object.put("projectId", "");
|
|
||||||
JSONObject environmentMap = object.getJSONObject("environmentMap");
|
|
||||||
if (environmentMap != null) {
|
|
||||||
object.put("environmentMap", new HashMap<>());
|
|
||||||
}
|
|
||||||
if (CollectionUtils.isNotEmpty(object.getJSONArray("hashTree"))) {
|
|
||||||
setCopy(object.getJSONArray("hashTree"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void parseModule(String modulePath, ApiTestImportRequest importRequest, ApiScenarioWithBLOBs apiScenarioWithBLOBs) {
|
protected void parseModule(String modulePath, ApiTestImportRequest importRequest, ApiScenarioWithBLOBs apiScenarioWithBLOBs) {
|
||||||
if (StringUtils.isEmpty(modulePath)) {
|
if (StringUtils.isEmpty(modulePath)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (modulePath.startsWith("/")) {
|
if (modulePath.startsWith("/")) {
|
||||||
modulePath = modulePath.substring(1, modulePath.length());
|
modulePath = modulePath.substring(1);
|
||||||
}
|
}
|
||||||
if (modulePath.endsWith("/")) {
|
if (modulePath.endsWith("/")) {
|
||||||
modulePath = modulePath.substring(0, modulePath.length() - 1);
|
modulePath = modulePath.substring(0, modulePath.length() - 1);
|
||||||
|
@ -23,6 +23,8 @@ public class ApiDefinitionRequest extends BaseQueryRequest {
|
|||||||
private String reviewId;
|
private String reviewId;
|
||||||
private String refId;
|
private String refId;
|
||||||
private String versionId;
|
private String versionId;
|
||||||
|
private String path;
|
||||||
|
private String method;
|
||||||
|
|
||||||
// 测试计划是否允许重复
|
// 测试计划是否允许重复
|
||||||
private boolean repeatCase;
|
private boolean repeatCase;
|
||||||
|
@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONArray;
|
|||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import io.metersphere.api.dto.*;
|
import io.metersphere.api.dto.*;
|
||||||
import io.metersphere.api.dto.automation.*;
|
import io.metersphere.api.dto.automation.*;
|
||||||
|
import io.metersphere.api.dto.automation.parse.ApiScenarioImportUtil;
|
||||||
import io.metersphere.api.dto.automation.parse.ScenarioImport;
|
import io.metersphere.api.dto.automation.parse.ScenarioImport;
|
||||||
import io.metersphere.api.dto.automation.parse.ScenarioImportParserFactory;
|
import io.metersphere.api.dto.automation.parse.ScenarioImportParserFactory;
|
||||||
import io.metersphere.api.dto.datacount.ApiDataCountResult;
|
import io.metersphere.api.dto.datacount.ApiDataCountResult;
|
||||||
@ -240,7 +241,14 @@ public class ApiAutomationService {
|
|||||||
request.setCustomNum(String.valueOf(nextNum));
|
request.setCustomNum(String.valueOf(nextNum));
|
||||||
}
|
}
|
||||||
checkScenarioNum(request);
|
checkScenarioNum(request);
|
||||||
final ApiScenarioWithBLOBs scenario = buildSaveScenario(request);
|
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
|
||||||
|
ApiTestCaseMapper apiTestCaseMapper = sqlSession.getMapper(ApiTestCaseMapper.class);
|
||||||
|
ApiDefinitionMapper apiDefinitionMapper = sqlSession.getMapper(ApiDefinitionMapper.class);
|
||||||
|
final ApiScenarioWithBLOBs scenario = buildSaveScenario(request,apiTestCaseMapper,apiDefinitionMapper);
|
||||||
|
sqlSession.flushStatements();
|
||||||
|
if (sqlSession != null && sqlSessionFactory != null) {
|
||||||
|
SqlSessionUtils.closeSqlSession(sqlSession, sqlSessionFactory);
|
||||||
|
}
|
||||||
scenario.setVersion(0);
|
scenario.setVersion(0);
|
||||||
|
|
||||||
scenario.setCreateTime(System.currentTimeMillis());
|
scenario.setCreateTime(System.currentTimeMillis());
|
||||||
@ -346,7 +354,16 @@ public class ApiAutomationService {
|
|||||||
//如果场景有TCP步骤的话,也要做参数计算处理
|
//如果场景有TCP步骤的话,也要做参数计算处理
|
||||||
tcpApiParamService.checkTestElement(request.getScenarioDefinition());
|
tcpApiParamService.checkTestElement(request.getScenarioDefinition());
|
||||||
|
|
||||||
final ApiScenarioWithBLOBs scenario = buildSaveScenario(request);
|
//检查是否要增加引用的步骤的CASE类型的数据
|
||||||
|
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
|
||||||
|
ApiTestCaseMapper apiTestCaseMapper = sqlSession.getMapper(ApiTestCaseMapper.class);
|
||||||
|
ApiDefinitionMapper apiDefinitionMapper = sqlSession.getMapper(ApiDefinitionMapper.class);
|
||||||
|
final ApiScenarioWithBLOBs scenario = buildSaveScenario(request,apiTestCaseMapper,apiDefinitionMapper);
|
||||||
|
|
||||||
|
sqlSession.flushStatements();
|
||||||
|
if (sqlSession != null && sqlSessionFactory != null) {
|
||||||
|
SqlSessionUtils.closeSqlSession(sqlSession, sqlSessionFactory);
|
||||||
|
}
|
||||||
|
|
||||||
ApiScenarioWithBLOBs beforeScenario = apiScenarioMapper.selectByPrimaryKey(request.getId());
|
ApiScenarioWithBLOBs beforeScenario = apiScenarioMapper.selectByPrimaryKey(request.getId());
|
||||||
Integer version = beforeScenario.getVersion();
|
Integer version = beforeScenario.getVersion();
|
||||||
@ -387,6 +404,8 @@ public class ApiAutomationService {
|
|||||||
extScheduleMapper.updateNameByResourceID(request.getId(), request.getName());// 修改场景name,同步到修改首页定时任务
|
extScheduleMapper.updateNameByResourceID(request.getId(), request.getName());// 修改场景name,同步到修改首页定时任务
|
||||||
uploadFiles(request, bodyFiles, scenarioFiles);
|
uploadFiles(request, bodyFiles, scenarioFiles);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// 存储依赖关系
|
// 存储依赖关系
|
||||||
ApiAutomationRelationshipEdgeService relationshipEdgeService = CommonBeanFactory.getBean(ApiAutomationRelationshipEdgeService.class);
|
ApiAutomationRelationshipEdgeService relationshipEdgeService = CommonBeanFactory.getBean(ApiAutomationRelationshipEdgeService.class);
|
||||||
if (relationshipEdgeService != null) {
|
if (relationshipEdgeService != null) {
|
||||||
@ -396,6 +415,19 @@ public class ApiAutomationService {
|
|||||||
return scenario;
|
return scenario;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void checkReferenceCase(ApiScenarioWithBLOBs scenario,ApiTestCaseMapper apiTestCaseMapper,ApiDefinitionMapper apiDefinitionMapper) {
|
||||||
|
if (scenario == null || StringUtils.isEmpty(scenario.getScenarioDefinition())) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (scenario.getScenarioDefinition().contains("\"referenced\":\"REF\"")) {
|
||||||
|
JSONObject element = JSON.parseObject(scenario.getScenarioDefinition());
|
||||||
|
JSONArray hashTree = element.getJSONArray("hashTree");
|
||||||
|
ApiScenarioImportUtil.formatHashTree(hashTree);
|
||||||
|
setReferenced(hashTree,scenario.getVersionId(),scenario.getProjectId(),apiTestCaseMapper,apiDefinitionMapper);
|
||||||
|
scenario.setScenarioDefinition(JSONObject.toJSONString(element));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void checkAndSetLatestVersion(String refId) {
|
private void checkAndSetLatestVersion(String refId) {
|
||||||
extApiScenarioMapper.clearLatestVersion(refId);
|
extApiScenarioMapper.clearLatestVersion(refId);
|
||||||
extApiScenarioMapper.addLatestVersion(refId);
|
extApiScenarioMapper.addLatestVersion(refId);
|
||||||
@ -424,7 +456,7 @@ public class ApiAutomationService {
|
|||||||
.map(MsHTTPSamplerProxy::getId).collect(Collectors.toSet());
|
.map(MsHTTPSamplerProxy::getId).collect(Collectors.toSet());
|
||||||
}
|
}
|
||||||
|
|
||||||
public ApiScenarioWithBLOBs buildSaveScenario(SaveApiScenarioRequest request) {
|
public ApiScenarioWithBLOBs buildSaveScenario(SaveApiScenarioRequest request,ApiTestCaseMapper apiTestCaseMapper,ApiDefinitionMapper apiDefinitionMapper) {
|
||||||
ApiScenarioWithBLOBs scenario = new ApiScenarioWithBLOBs();
|
ApiScenarioWithBLOBs scenario = new ApiScenarioWithBLOBs();
|
||||||
scenario.setId(request.getId());
|
scenario.setId(request.getId());
|
||||||
scenario.setName(request.getName());
|
scenario.setName(request.getName());
|
||||||
@ -473,6 +505,7 @@ public class ApiAutomationService {
|
|||||||
} else {
|
} else {
|
||||||
scenario.setVersionId(request.getVersionId());
|
scenario.setVersionId(request.getVersionId());
|
||||||
}
|
}
|
||||||
|
checkReferenceCase(scenario,apiTestCaseMapper,apiDefinitionMapper);
|
||||||
return scenario;
|
return scenario;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1112,7 +1145,7 @@ public class ApiAutomationService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void _importCreate(List<ApiScenarioWithBLOBs> sameRequest, ApiScenarioMapper batchMapper, ExtApiScenarioMapper extApiScenarioMapper,
|
private void _importCreate(List<ApiScenarioWithBLOBs> sameRequest, ApiScenarioMapper batchMapper, ExtApiScenarioMapper extApiScenarioMapper,
|
||||||
ApiScenarioWithBLOBs scenarioWithBLOBs, ApiTestImportRequest apiTestImportRequest) {
|
ApiScenarioWithBLOBs scenarioWithBLOBs, ApiTestImportRequest apiTestImportRequest,ApiTestCaseMapper apiTestCaseMapper, ApiDefinitionMapper apiDefinitionMapper) {
|
||||||
if (CollectionUtils.isEmpty(sameRequest)) {
|
if (CollectionUtils.isEmpty(sameRequest)) {
|
||||||
scenarioWithBLOBs.setId(UUID.randomUUID().toString());
|
scenarioWithBLOBs.setId(UUID.randomUUID().toString());
|
||||||
List<ApiMethodUrlDTO> useUrl = this.parseUrl(scenarioWithBLOBs);
|
List<ApiMethodUrlDTO> useUrl = this.parseUrl(scenarioWithBLOBs);
|
||||||
@ -1126,6 +1159,7 @@ public class ApiAutomationService {
|
|||||||
scenarioWithBLOBs.setVersionId(apiTestImportRequest.getDefaultVersion());
|
scenarioWithBLOBs.setVersionId(apiTestImportRequest.getDefaultVersion());
|
||||||
}
|
}
|
||||||
scenarioWithBLOBs.setLatest(true);
|
scenarioWithBLOBs.setLatest(true);
|
||||||
|
checkReferenceCase(scenarioWithBLOBs,apiTestCaseMapper,apiDefinitionMapper);
|
||||||
batchMapper.insert(scenarioWithBLOBs);
|
batchMapper.insert(scenarioWithBLOBs);
|
||||||
apiScenarioReferenceIdService.saveByApiScenario(scenarioWithBLOBs);
|
apiScenarioReferenceIdService.saveByApiScenario(scenarioWithBLOBs);
|
||||||
} else {
|
} else {
|
||||||
@ -1156,6 +1190,7 @@ public class ApiAutomationService {
|
|||||||
scenarioWithBLOBs.setUseUrl(JSONArray.toJSONString(useUrl));
|
scenarioWithBLOBs.setUseUrl(JSONArray.toJSONString(useUrl));
|
||||||
batchMapper.updateByPrimaryKeyWithBLOBs(scenarioWithBLOBs);
|
batchMapper.updateByPrimaryKeyWithBLOBs(scenarioWithBLOBs);
|
||||||
}
|
}
|
||||||
|
checkReferenceCase(scenarioWithBLOBs,apiTestCaseMapper,apiDefinitionMapper);
|
||||||
apiScenarioReferenceIdService.saveByApiScenario(scenarioWithBLOBs);
|
apiScenarioReferenceIdService.saveByApiScenario(scenarioWithBLOBs);
|
||||||
extApiScenarioMapper.clearLatestVersion(scenarioWithBLOBs.getRefId());
|
extApiScenarioMapper.clearLatestVersion(scenarioWithBLOBs.getRefId());
|
||||||
extApiScenarioMapper.addLatestVersion(scenarioWithBLOBs.getRefId());
|
extApiScenarioMapper.addLatestVersion(scenarioWithBLOBs.getRefId());
|
||||||
@ -1163,7 +1198,7 @@ public class ApiAutomationService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private ApiScenarioWithBLOBs importCreate(ApiScenarioWithBLOBs request, ApiScenarioMapper batchMapper, ExtApiScenarioMapper extApiScenarioMapper,
|
private ApiScenarioWithBLOBs importCreate(ApiScenarioWithBLOBs request, ApiScenarioMapper batchMapper, ExtApiScenarioMapper extApiScenarioMapper,
|
||||||
ApiTestImportRequest apiTestImportRequest) {
|
ApiTestImportRequest apiTestImportRequest,ApiTestCaseMapper apiTestCaseMapper, ApiDefinitionMapper apiDefinitionMapper) {
|
||||||
final ApiScenarioWithBLOBs scenarioWithBLOBs = new ApiScenarioWithBLOBs();
|
final ApiScenarioWithBLOBs scenarioWithBLOBs = new ApiScenarioWithBLOBs();
|
||||||
BeanUtils.copyBean(scenarioWithBLOBs, request);
|
BeanUtils.copyBean(scenarioWithBLOBs, request);
|
||||||
scenarioWithBLOBs.setCreateTime(System.currentTimeMillis());
|
scenarioWithBLOBs.setCreateTime(System.currentTimeMillis());
|
||||||
@ -1212,7 +1247,7 @@ public class ApiAutomationService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (StringUtils.equals("fullCoverage", apiTestImportRequest.getModeId())) {
|
if (StringUtils.equals("fullCoverage", apiTestImportRequest.getModeId())) {
|
||||||
_importCreate(sameRequest, batchMapper, extApiScenarioMapper, scenarioWithBLOBs, apiTestImportRequest);
|
_importCreate(sameRequest, batchMapper, extApiScenarioMapper, scenarioWithBLOBs, apiTestImportRequest,apiTestCaseMapper,apiDefinitionMapper);
|
||||||
} else if (StringUtils.equals("incrementalMerge", apiTestImportRequest.getModeId())) {
|
} else if (StringUtils.equals("incrementalMerge", apiTestImportRequest.getModeId())) {
|
||||||
if (CollectionUtils.isEmpty(sameRequest)) {
|
if (CollectionUtils.isEmpty(sameRequest)) {
|
||||||
List<ApiMethodUrlDTO> useUrl = this.parseUrl(scenarioWithBLOBs);
|
List<ApiMethodUrlDTO> useUrl = this.parseUrl(scenarioWithBLOBs);
|
||||||
@ -1226,8 +1261,8 @@ public class ApiAutomationService {
|
|||||||
scenarioWithBLOBs.setVersionId(apiTestImportRequest.getDefaultVersion());
|
scenarioWithBLOBs.setVersionId(apiTestImportRequest.getDefaultVersion());
|
||||||
}
|
}
|
||||||
scenarioWithBLOBs.setLatest(true);
|
scenarioWithBLOBs.setLatest(true);
|
||||||
|
checkReferenceCase(scenarioWithBLOBs,apiTestCaseMapper,apiDefinitionMapper);
|
||||||
batchMapper.insert(scenarioWithBLOBs);
|
batchMapper.insert(scenarioWithBLOBs);
|
||||||
|
|
||||||
// 存储依赖关系
|
// 存储依赖关系
|
||||||
ApiAutomationRelationshipEdgeService relationshipEdgeService = CommonBeanFactory.getBean(ApiAutomationRelationshipEdgeService.class);
|
ApiAutomationRelationshipEdgeService relationshipEdgeService = CommonBeanFactory.getBean(ApiAutomationRelationshipEdgeService.class);
|
||||||
if (relationshipEdgeService != null) {
|
if (relationshipEdgeService != null) {
|
||||||
@ -1237,7 +1272,7 @@ public class ApiAutomationService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
_importCreate(sameRequest, batchMapper, extApiScenarioMapper, scenarioWithBLOBs, apiTestImportRequest);
|
_importCreate(sameRequest, batchMapper, extApiScenarioMapper, scenarioWithBLOBs, apiTestImportRequest,apiTestCaseMapper,apiDefinitionMapper);
|
||||||
}
|
}
|
||||||
return scenarioWithBLOBs;
|
return scenarioWithBLOBs;
|
||||||
}
|
}
|
||||||
@ -1246,6 +1281,8 @@ public class ApiAutomationService {
|
|||||||
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
|
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
|
||||||
ApiScenarioMapper batchMapper = sqlSession.getMapper(ApiScenarioMapper.class);
|
ApiScenarioMapper batchMapper = sqlSession.getMapper(ApiScenarioMapper.class);
|
||||||
ExtApiScenarioMapper extApiScenarioMapper = sqlSession.getMapper(ExtApiScenarioMapper.class);
|
ExtApiScenarioMapper extApiScenarioMapper = sqlSession.getMapper(ExtApiScenarioMapper.class);
|
||||||
|
ApiTestCaseMapper apiTestCaseMapper = sqlSession.getMapper(ApiTestCaseMapper.class);
|
||||||
|
ApiDefinitionMapper apiDefinitionMapper = sqlSession.getMapper(ApiDefinitionMapper.class);
|
||||||
List<ApiScenarioWithBLOBs> data = apiImport.getData();
|
List<ApiScenarioWithBLOBs> data = apiImport.getData();
|
||||||
currentScenarioOrder.remove();
|
currentScenarioOrder.remove();
|
||||||
int num = 0;
|
int num = 0;
|
||||||
@ -1283,7 +1320,7 @@ public class ApiAutomationService {
|
|||||||
item.setId(UUID.randomUUID().toString());
|
item.setId(UUID.randomUUID().toString());
|
||||||
}
|
}
|
||||||
// 导入之后刷新latest
|
// 导入之后刷新latest
|
||||||
importCreate(item, batchMapper, extApiScenarioMapper, request);
|
importCreate(item, batchMapper, extApiScenarioMapper, request,apiTestCaseMapper,apiDefinitionMapper);
|
||||||
if (i % 300 == 0) {
|
if (i % 300 == 0) {
|
||||||
sqlSession.flushStatements();
|
sqlSession.flushStatements();
|
||||||
}
|
}
|
||||||
@ -1571,7 +1608,6 @@ public class ApiAutomationService {
|
|||||||
return urlList;
|
return urlList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public ScenarioEnv getApiScenarioProjectId(String id) {
|
public ScenarioEnv getApiScenarioProjectId(String id) {
|
||||||
ApiScenarioWithBLOBs scenario = apiScenarioMapper.selectByPrimaryKey(id);
|
ApiScenarioWithBLOBs scenario = apiScenarioMapper.selectByPrimaryKey(id);
|
||||||
ScenarioEnv scenarioEnv = new ScenarioEnv();
|
ScenarioEnv scenarioEnv = new ScenarioEnv();
|
||||||
@ -1953,4 +1989,45 @@ public class ApiAutomationService {
|
|||||||
});
|
});
|
||||||
return strings;
|
return strings;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void setReferenced(JSONArray hashTree,String versionId,String projectId, ApiTestCaseMapper apiTestCaseMapper,ApiDefinitionMapper apiDefinitionMapper) {
|
||||||
|
// 将引用转成复制
|
||||||
|
if (CollectionUtils.isNotEmpty(hashTree)) {
|
||||||
|
for (int i = 0; i < hashTree.size(); i++) {
|
||||||
|
JSONObject object = (JSONObject) hashTree.get(i);
|
||||||
|
String referenced = object.getString("referenced");
|
||||||
|
if (StringUtils.isNotBlank(referenced) && StringUtils.equals(referenced, "REF")) {
|
||||||
|
// 检测引用对象是否存在,若果不存在则改成复制对象
|
||||||
|
String refType = object.getString("refType");
|
||||||
|
if (StringUtils.isNotEmpty(refType)) {
|
||||||
|
if (refType.equals("CASE")) {
|
||||||
|
ApiScenarioImportUtil.checkCase(object,versionId,projectId,apiTestCaseMapper,apiDefinitionMapper);
|
||||||
|
} else {
|
||||||
|
checkAutomation(object,projectId);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
object.put("referenced", "Copy");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
JSONObject environmentMap = object.getJSONObject("environmentMap");
|
||||||
|
if (environmentMap != null) {
|
||||||
|
object.put("environmentMap", new HashMap<>());
|
||||||
|
}
|
||||||
|
if (CollectionUtils.isNotEmpty(object.getJSONArray("hashTree"))) {
|
||||||
|
setReferenced(object.getJSONArray("hashTree"),versionId,projectId,apiTestCaseMapper,apiDefinitionMapper);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void checkAutomation(JSONObject object, String projectId) {
|
||||||
|
ApiScenarioWithBLOBs bloBs = getDto(object.getString("id"));
|
||||||
|
if (bloBs != null) {
|
||||||
|
boolean isSameWorkSpace = ApiScenarioImportUtil.checkWorkSpace(bloBs.getProjectId(),projectId);
|
||||||
|
if(!isSameWorkSpace){
|
||||||
|
object.put("referenced", "Copy");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -325,7 +325,7 @@ public class ApiDefinitionService {
|
|||||||
return getBLOBs(returnModel.getId());
|
return getBLOBs(returnModel.getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkQuota() {
|
public void checkQuota() {
|
||||||
QuotaService quotaService = CommonBeanFactory.getBean(QuotaService.class);
|
QuotaService quotaService = CommonBeanFactory.getBean(QuotaService.class);
|
||||||
if (quotaService != null) {
|
if (quotaService != null) {
|
||||||
quotaService.checkAPIDefinitionQuota();
|
quotaService.checkAPIDefinitionQuota();
|
||||||
@ -688,13 +688,7 @@ public class ApiDefinitionService {
|
|||||||
test.setVersionId(request.getVersionId());
|
test.setVersionId(request.getVersionId());
|
||||||
test.setLatest(true); // 新建一定是最新的
|
test.setLatest(true); // 新建一定是最新的
|
||||||
if (StringUtils.isEmpty(request.getModuleId()) || "default-module".equals(request.getModuleId())) {
|
if (StringUtils.isEmpty(request.getModuleId()) || "default-module".equals(request.getModuleId())) {
|
||||||
ApiModuleExample example = new ApiModuleExample();
|
initModulePathAndId(test.getProjectId(), test);
|
||||||
example.createCriteria().andProjectIdEqualTo(test.getProjectId()).andProtocolEqualTo(test.getProtocol()).andNameEqualTo("未规划接口");
|
|
||||||
List<ApiModule> modules = apiModuleMapper.selectByExample(example);
|
|
||||||
if (CollectionUtils.isNotEmpty(modules)) {
|
|
||||||
test.setModuleId(modules.get(0).getId());
|
|
||||||
test.setModulePath("/未规划接口");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
test.setResponse(JSONObject.toJSONString(request.getResponse()));
|
test.setResponse(JSONObject.toJSONString(request.getResponse()));
|
||||||
test.setEnvironmentId(request.getEnvironmentId());
|
test.setEnvironmentId(request.getEnvironmentId());
|
||||||
@ -791,7 +785,7 @@ public class ApiDefinitionService {
|
|||||||
return apiDefinition;
|
return apiDefinition;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Long getImportNextOrder(String projectId) {
|
public Long getImportNextOrder(String projectId) {
|
||||||
Long order = currentApiOrder.get();
|
Long order = currentApiOrder.get();
|
||||||
if (order == null) {
|
if (order == null) {
|
||||||
order = ServiceUtils.getNextOrder(projectId, extApiDefinitionMapper::getLastOrder);
|
order = ServiceUtils.getNextOrder(projectId, extApiDefinitionMapper::getLastOrder);
|
||||||
@ -801,7 +795,7 @@ public class ApiDefinitionService {
|
|||||||
return order;
|
return order;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Long getImportNextCaseOrder(String projectId) {
|
public Long getImportNextCaseOrder(String projectId) {
|
||||||
Long order = currentApiCaseOrder.get();
|
Long order = currentApiCaseOrder.get();
|
||||||
if (order == null) {
|
if (order == null) {
|
||||||
order = ServiceUtils.getNextOrder(projectId, extApiTestCaseMapper::getLastOrder);
|
order = ServiceUtils.getNextOrder(projectId, extApiTestCaseMapper::getLastOrder);
|
||||||
@ -2002,4 +1996,23 @@ public class ApiDefinitionService {
|
|||||||
SqlSessionUtils.closeSqlSession(sqlSession, sqlSessionFactory);
|
SqlSessionUtils.closeSqlSession(sqlSession, sqlSessionFactory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ApiDefinitionResult getApiDefinitionResult(ApiDefinitionRequest request) {
|
||||||
|
List<ApiDefinitionResult> resList = extApiDefinitionMapper.list(request);
|
||||||
|
if(resList==null){
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return resList.get(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void initModulePathAndId(String projectId, ApiDefinitionWithBLOBs test) {
|
||||||
|
ApiModuleExample example = new ApiModuleExample();
|
||||||
|
example.createCriteria().andProjectIdEqualTo(projectId).andProtocolEqualTo(test.getProtocol()).andNameEqualTo("未规划接口");
|
||||||
|
List<ApiModule> modules = apiModuleMapper.selectByExample(example);
|
||||||
|
if (CollectionUtils.isNotEmpty(modules)) {
|
||||||
|
test.setModuleId(modules.get(0).getId());
|
||||||
|
test.setModulePath("/未规划接口");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -129,7 +129,6 @@ public class ApiTestCaseService {
|
|||||||
|
|
||||||
public List<ApiTestCaseDTO> listSimple(ApiTestCaseRequest request) {
|
public List<ApiTestCaseDTO> listSimple(ApiTestCaseRequest request) {
|
||||||
request = this.initRequest(request, true, true);
|
request = this.initRequest(request, true, true);
|
||||||
|
|
||||||
List<ApiTestCaseDTO> apiTestCases = extApiTestCaseMapper.listSimple(request);
|
List<ApiTestCaseDTO> apiTestCases = extApiTestCaseMapper.listSimple(request);
|
||||||
if (CollectionUtils.isEmpty(apiTestCases)) {
|
if (CollectionUtils.isEmpty(apiTestCases)) {
|
||||||
return apiTestCases;
|
return apiTestCases;
|
||||||
@ -1059,4 +1058,22 @@ public class ApiTestCaseService {
|
|||||||
List<ApiTestCaseFollow> follows = apiTestCaseFollowMapper.selectByExample(example);
|
List<ApiTestCaseFollow> follows = apiTestCaseFollowMapper.selectByExample(example);
|
||||||
return follows.stream().map(ApiTestCaseFollow::getFollowId).distinct().collect(Collectors.toList());
|
return follows.stream().map(ApiTestCaseFollow::getFollowId).distinct().collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ApiTestCaseWithBLOBs getSameCaseWithBLOBs(SaveApiTestCaseRequest request) {
|
||||||
|
ApiTestCaseExample example = new ApiTestCaseExample();
|
||||||
|
ApiTestCaseExample.Criteria criteria = example.createCriteria();
|
||||||
|
criteria.andStatusNotEqualTo("Trash").andNameEqualTo(request.getName()).andApiDefinitionIdEqualTo(request.getApiDefinitionId());
|
||||||
|
if (StringUtils.isNotBlank(request.getId())) {
|
||||||
|
criteria.andIdNotEqualTo(request.getId());
|
||||||
|
}
|
||||||
|
if (StringUtils.isNotBlank(request.getVersionId())) {
|
||||||
|
criteria.andVersionIdEqualTo(request.getVersionId());
|
||||||
|
}
|
||||||
|
List<ApiTestCaseWithBLOBs> apiTestCaseWithBLOBs = apiTestCaseMapper.selectByExampleWithBLOBs(example);
|
||||||
|
if (CollectionUtils.isNotEmpty(apiTestCaseWithBLOBs)) {
|
||||||
|
return apiTestCaseWithBLOBs.get(0);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -38,4 +38,7 @@ END
|
|||||||
DELIMITER ;
|
DELIMITER ;
|
||||||
|
|
||||||
CALL project_api_appl();
|
CALL project_api_appl();
|
||||||
DROP PROCEDURE IF EXISTS project_api_appl;
|
DROP PROCEDURE IF EXISTS project_api_appl;
|
||||||
|
|
||||||
|
ALTER TABLE `api_definition` ADD INDEX methodIndex ( `method` );
|
||||||
|
ALTER TABLE `api_definition` ADD INDEX protocolIndex ( `protocol` );
|
@ -261,7 +261,7 @@
|
|||||||
:scenario-definition="scenarioDefinition"/>
|
:scenario-definition="scenarioDefinition"/>
|
||||||
|
|
||||||
<!--接口列表-->
|
<!--接口列表-->
|
||||||
<scenario-api-relevance @save="pushApiOrCase" @close="setHideBtn" ref="scenarioApiRelevance" v-if="type!=='detail'"/>
|
<scenario-api-relevance @save="pushApiOrCase" @close="setHideBtn" ref="scenarioApiRelevance" :is-across-space="true" v-if="type!=='detail'"/>
|
||||||
|
|
||||||
<!--自定义接口-->
|
<!--自定义接口-->
|
||||||
<el-drawer v-if="type!=='detail'" :visible.sync="customizeVisible" :destroy-on-close="true" direction="ltr"
|
<el-drawer v-if="type!=='detail'" :visible.sync="customizeVisible" :destroy-on-close="true" direction="ltr"
|
||||||
@ -270,7 +270,7 @@
|
|||||||
<ms-api-customize :request="customizeRequest" @addCustomizeApi="addCustomizeApi"/>
|
<ms-api-customize :request="customizeRequest" @addCustomizeApi="addCustomizeApi"/>
|
||||||
</el-drawer>
|
</el-drawer>
|
||||||
<!--场景导入 -->
|
<!--场景导入 -->
|
||||||
<scenario-relevance v-if="type!=='detail'" @save="addScenario" @close="setHideBtn" ref="scenarioRelevance"/>
|
<scenario-relevance v-if="type!=='detail'" @save="addScenario" @close="setHideBtn" :is-across-space="true" ref="scenarioRelevance"/>
|
||||||
|
|
||||||
<!-- 环境 -->
|
<!-- 环境 -->
|
||||||
<api-environment-config v-if="type!=='detail'" ref="environmentConfig" @close="environmentConfigClose"/>
|
<api-environment-config v-if="type!=='detail'" ref="environmentConfig" @close="environmentConfigClose"/>
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<test-case-relevance-base
|
<test-case-relevance-base
|
||||||
|
:is-across-space="isAcrossSpace"
|
||||||
@setProject="setProject"
|
@setProject="setProject"
|
||||||
:dialog-title="$t('api_test.definition.api_import')"
|
:dialog-title="$t('api_test.definition.api_import')"
|
||||||
ref="baseRelevance">
|
ref="baseRelevance">
|
||||||
@ -81,6 +82,14 @@ export default {
|
|||||||
ScenarioRelevanceApiList,
|
ScenarioRelevanceApiList,
|
||||||
MsMainContainer, MsAsideContainer, MsContainer, MsApiModule, ScenarioRelevanceCaseList
|
MsMainContainer, MsAsideContainer, MsContainer, MsApiModule, ScenarioRelevanceCaseList
|
||||||
},
|
},
|
||||||
|
props:{
|
||||||
|
isAcrossSpace:{
|
||||||
|
type:Boolean,
|
||||||
|
default() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
buttonIsWorking: false,
|
buttonIsWorking: false,
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<test-case-relevance-base
|
<test-case-relevance-base
|
||||||
|
:is-across-space="isAcrossSpace"
|
||||||
:dialog-title="$t('api_test.automation.scenario_import')"
|
:dialog-title="$t('api_test.automation.scenario_import')"
|
||||||
@setProject="setProject"
|
@setProject="setProject"
|
||||||
ref="baseRelevance">
|
ref="baseRelevance">
|
||||||
@ -56,6 +57,14 @@ const VersionSelect = requireComponent.keys().length > 0 ? requireComponent("./v
|
|||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "ScenarioRelevance",
|
name: "ScenarioRelevance",
|
||||||
|
props:{
|
||||||
|
isAcrossSpace:{
|
||||||
|
type:Boolean,
|
||||||
|
default() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
components: {
|
components: {
|
||||||
'VersionSelect': VersionSelect.default,
|
'VersionSelect': VersionSelect.default,
|
||||||
TestCaseRelevanceBase,
|
TestCaseRelevanceBase,
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
:envMap="envMap"
|
:envMap="envMap"
|
||||||
:title="$t('commons.scenario')">
|
:title="$t('commons.scenario')">
|
||||||
|
|
||||||
<template v-slot:afterTitle v-if="isSameSpace">
|
<template v-slot:afterTitle >
|
||||||
<span v-if="isShowNum" @click="clickResource(scenario)">{{ "( ID: " + scenario.num + ")" }}</span>
|
<span v-if="isShowNum" @click="clickResource(scenario)">{{ "( ID: " + scenario.num + ")" }}</span>
|
||||||
<span v-else>
|
<span v-else>
|
||||||
<el-tooltip class="ms-num" effect="dark" :content="$t('api_test.automation.scenario.num_none')" placement="top">
|
<el-tooltip class="ms-num" effect="dark" :content="$t('api_test.automation.scenario.num_none')" placement="top">
|
||||||
@ -67,9 +67,8 @@ import MsTcpBasisParameters from "../../../definition/components/request/tcp/Tcp
|
|||||||
import MsDubboBasisParameters from "../../../definition/components/request/dubbo/BasisParameters";
|
import MsDubboBasisParameters from "../../../definition/components/request/dubbo/BasisParameters";
|
||||||
import MsApiRequestForm from "../../../definition/components/request/http/ApiHttpRequestForm";
|
import MsApiRequestForm from "../../../definition/components/request/http/ApiHttpRequestForm";
|
||||||
import ApiBaseComponent from "../common/ApiBaseComponent";
|
import ApiBaseComponent from "../common/ApiBaseComponent";
|
||||||
import {getCurrentProjectID, getCurrentWorkspaceId, getUUID, strMapToObj} from "@/common/js/utils";
|
import {getCurrentProjectID, getUUID, strMapToObj} from "@/common/js/utils";
|
||||||
import {ELEMENT_TYPE, STEP, TYPE_TO_C} from "@/business/components/api/automation/scenario/Setting";
|
import {STEP} from "@/business/components/api/automation/scenario/Setting";
|
||||||
import {KeyValue} from "@/business/components/api/definition/model/ApiTestModel";
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "ApiScenarioComponent",
|
name: "ApiScenarioComponent",
|
||||||
@ -113,15 +112,14 @@ export default {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
if (this.scenario.num) {
|
|
||||||
this.isShowNum = true;
|
|
||||||
this.getWorkspaceId(this.scenario.projectId);
|
|
||||||
} else {
|
|
||||||
this.isShowNum = false;
|
|
||||||
}
|
|
||||||
if (!this.scenario.projectId) {
|
if (!this.scenario.projectId) {
|
||||||
this.scenario.projectId = getCurrentProjectID();
|
this.scenario.projectId = getCurrentProjectID();
|
||||||
}
|
}
|
||||||
|
if (this.scenario.num) {
|
||||||
|
this.isShowNum = true;
|
||||||
|
} else {
|
||||||
|
this.isShowNum = false;
|
||||||
|
}
|
||||||
if (this.scenario.id && this.scenario.referenced === 'REF' && !this.scenario.loaded && this.scenario.hashTree) {
|
if (this.scenario.id && this.scenario.referenced === 'REF' && !this.scenario.loaded && this.scenario.hashTree) {
|
||||||
this.setDisabled(this.scenario.hashTree, this.scenario.projectId);
|
this.setDisabled(this.scenario.hashTree, this.scenario.projectId);
|
||||||
}
|
}
|
||||||
@ -132,16 +130,14 @@ export default {
|
|||||||
loading: false,
|
loading: false,
|
||||||
isShowInput: false,
|
isShowInput: false,
|
||||||
isShowNum: false,
|
isShowNum: false,
|
||||||
isSameSpace: true,
|
|
||||||
stepFilter: new STEP,
|
stepFilter: new STEP,
|
||||||
|
dataWorkspaceId:'',
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
isDeletedOrRef() {
|
isDeletedOrRef() {
|
||||||
if (this.scenario.referenced != undefined && this.scenario.referenced === 'Deleted' || this.scenario.referenced === 'REF') {
|
return this.scenario.referenced !== undefined && this.scenario.referenced === 'Deleted' || this.scenario.referenced === 'REF';
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
},
|
},
|
||||||
projectId() {
|
projectId() {
|
||||||
return getCurrentProjectID();
|
return getCurrentProjectID();
|
||||||
@ -225,7 +221,7 @@ export default {
|
|||||||
for (let i in arr) {
|
for (let i in arr) {
|
||||||
arr[i].disabled = true;
|
arr[i].disabled = true;
|
||||||
arr[i].projectId = this.calcProjectId(arr[i].projectId, id);
|
arr[i].projectId = this.calcProjectId(arr[i].projectId, id);
|
||||||
if (arr[i].hashTree != undefined && arr[i].hashTree.length > 0) {
|
if (arr[i].hashTree !== undefined && arr[i].hashTree.length > 0) {
|
||||||
this.recursive(arr[i].hashTree, arr[i].projectId);
|
this.recursive(arr[i].hashTree, arr[i].projectId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -234,7 +230,7 @@ export default {
|
|||||||
for (let i in scenarioDefinition) {
|
for (let i in scenarioDefinition) {
|
||||||
scenarioDefinition[i].disabled = true;
|
scenarioDefinition[i].disabled = true;
|
||||||
scenarioDefinition[i].projectId = this.calcProjectId(scenarioDefinition[i].projectId, id);
|
scenarioDefinition[i].projectId = this.calcProjectId(scenarioDefinition[i].projectId, id);
|
||||||
if (scenarioDefinition[i].hashTree != undefined && scenarioDefinition[i].hashTree.length > 0) {
|
if (scenarioDefinition[i].hashTree !== undefined && scenarioDefinition[i].hashTree.length > 0) {
|
||||||
this.recursive(scenarioDefinition[i].hashTree, scenarioDefinition[i].projectId);
|
this.recursive(scenarioDefinition[i].hashTree, scenarioDefinition[i].projectId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -263,17 +259,6 @@ export default {
|
|||||||
params: {redirectID: getUUID(), dataType: "scenario", dataSelectRange: 'edit:' + resource.id, projectId: resource.projectId}
|
params: {redirectID: getUUID(), dataType: "scenario", dataSelectRange: 'edit:' + resource.id, projectId: resource.projectId}
|
||||||
});
|
});
|
||||||
window.open(automationData.href, '_blank');
|
window.open(automationData.href, '_blank');
|
||||||
},
|
|
||||||
getWorkspaceId(projectId) {
|
|
||||||
this.$get("/project/get/" + projectId, response => {
|
|
||||||
if (response.data) {
|
|
||||||
if (response.data.workspaceId === getCurrentWorkspaceId()) {
|
|
||||||
this.isShowNum = true;
|
|
||||||
} else {
|
|
||||||
this.isSameSpace = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -294,7 +279,7 @@ export default {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.ms-tag {
|
.ms-tag {
|
||||||
margin-left: 0px;
|
margin-left: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ms-req-error {
|
.ms-req-error {
|
||||||
|
@ -18,6 +18,10 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template v-slot:aside>
|
<template v-slot:aside>
|
||||||
|
<el-select v-if="isAcrossSpace" filterable slot="prepend" v-model="workspaceId" @change="changeWorkspace" style="width: 160px"
|
||||||
|
size="small">
|
||||||
|
<el-option v-for="(item,index) in workspaceList" :key="index" :label="item.name" :value="item.id"/>
|
||||||
|
</el-select>
|
||||||
<select-menu
|
<select-menu
|
||||||
:data="projects"
|
:data="projects"
|
||||||
v-if="multipleProject"
|
v-if="multipleProject"
|
||||||
@ -68,7 +72,9 @@ import SelectMenu from "../../../../common/SelectMenu";
|
|||||||
projectId: '',
|
projectId: '',
|
||||||
projectName: '',
|
projectName: '',
|
||||||
projects: [],
|
projects: [],
|
||||||
|
workspaceId:'',
|
||||||
|
workspaceList:[],
|
||||||
|
currentWorkSpaceId:''
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
@ -91,16 +97,18 @@ import SelectMenu from "../../../../common/SelectMenu";
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
isAcrossSpace:{
|
||||||
|
type:Boolean,
|
||||||
|
default() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
},
|
||||||
multipleProject: {
|
multipleProject: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: true
|
default: true
|
||||||
}
|
}
|
||||||
},
|
|
||||||
watch: {
|
|
||||||
|
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
|
||||||
refreshNode() {
|
refreshNode() {
|
||||||
this.$emit('refresh');
|
this.$emit('refresh');
|
||||||
},
|
},
|
||||||
@ -119,7 +127,8 @@ import SelectMenu from "../../../../common/SelectMenu";
|
|||||||
},
|
},
|
||||||
|
|
||||||
getProject() {
|
getProject() {
|
||||||
this.result = this.$post("/project/list/related", {userId: getCurrentUserId(), workspaceId: getCurrentWorkspaceId()}, res => {
|
let realWorkSpaceId = this.isAcrossSpace?this.workspaceId:this.currentWorkSpaceId;
|
||||||
|
this.result = this.$post("/project/list/related", {userId: getCurrentUserId(), workspaceId: realWorkSpaceId}, res => {
|
||||||
let data = res.data;
|
let data = res.data;
|
||||||
if (data) {
|
if (data) {
|
||||||
const index = data.findIndex(d => d.id === getCurrentProjectID());
|
const index = data.findIndex(d => d.id === getCurrentProjectID());
|
||||||
@ -142,6 +151,23 @@ import SelectMenu from "../../../../common/SelectMenu";
|
|||||||
this.$emit('setProject', project.id);
|
this.$emit('setProject', project.id);
|
||||||
// 获取项目时刷新该项目模块
|
// 获取项目时刷新该项目模块
|
||||||
this.$emit('refreshNode');
|
this.$emit('refreshNode');
|
||||||
|
},
|
||||||
|
|
||||||
|
getWorkSpaceList(){
|
||||||
|
this.$get("/workspace/list/userworkspace/" + encodeURIComponent(getCurrentUserId()), response => {
|
||||||
|
this.workspaceList = response.data;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
changeWorkspace(){
|
||||||
|
this.getProject();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.currentWorkSpaceId = getCurrentWorkspaceId();
|
||||||
|
this.workspaceId = this.currentWorkSpaceId;
|
||||||
|
if(this.isAcrossSpace){
|
||||||
|
this.getWorkSpaceList();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user