fix(接口测试): 修复多版本情况下场景引用复制问题
--bug=1009777 --user=赵勇 【接口自动化】-场景A中引用v1版本的场景B,删除场景B后场景A仍成功执行引用的场景B https://www.tapd.cn/55049933/s/1094931
This commit is contained in:
parent
3baef16d16
commit
4f6f06108f
|
@ -70,7 +70,7 @@ public class ApiAutomationController {
|
|||
|
||||
@PostMapping("/list/all")
|
||||
@RequiresPermissions("PROJECT_API_SCENARIO:READ")
|
||||
public List<ApiScenarioWithBLOBs> listAll(@RequestBody ApiScenarioBatchRequest request) {
|
||||
public List<ApiScenarioDTO> listAll(@RequestBody ApiScenarioBatchRequest request) {
|
||||
return apiAutomationService.listAll(request);
|
||||
}
|
||||
|
||||
|
@ -194,7 +194,7 @@ public class ApiAutomationController {
|
|||
}
|
||||
|
||||
@PostMapping("/getApiScenarios")
|
||||
public List<ApiScenarioWithBLOBs> getApiScenarios(@RequestBody List<String> ids) {
|
||||
public List<ApiScenarioDTO> getApiScenarios(@RequestBody List<String> ids) {
|
||||
return apiAutomationService.getApiScenarios(ids);
|
||||
}
|
||||
|
||||
|
|
|
@ -495,6 +495,75 @@ public class ElementUtil {
|
|||
}
|
||||
}
|
||||
|
||||
public static void mergeHashTree(JSONObject element, JSONArray targetHashTree) {
|
||||
try {
|
||||
JSONArray sourceHashTree = element.getJSONArray("hashTree");
|
||||
if (CollectionUtils.isNotEmpty(sourceHashTree) && CollectionUtils.isNotEmpty(targetHashTree) && sourceHashTree.size() < targetHashTree.size()) {
|
||||
element.put("hashTree", targetHashTree);
|
||||
return;
|
||||
}
|
||||
List<String> sourceIds = new ArrayList<>();
|
||||
List<String> delIds = new ArrayList<>();
|
||||
Map<String, JSONObject> updateMap = new HashMap<>();
|
||||
if (CollectionUtils.isEmpty(sourceHashTree)) {
|
||||
if (CollectionUtils.isNotEmpty(targetHashTree)) {
|
||||
element.put("hashTree", targetHashTree);
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (CollectionUtils.isNotEmpty(targetHashTree)) {
|
||||
for (int i = 0; i < targetHashTree.size(); i++) {
|
||||
JSONObject item = targetHashTree.getJSONObject(i);
|
||||
if (StringUtils.isNotEmpty(item.getString("id"))) {
|
||||
updateMap.put(item.getString("id"), item);
|
||||
}
|
||||
}
|
||||
}
|
||||
// 找出待更新内容和源已经被删除的内容
|
||||
if (CollectionUtils.isNotEmpty(sourceHashTree)) {
|
||||
for (int i = 0; i < sourceHashTree.size(); i++) {
|
||||
JSONObject source = sourceHashTree.getJSONObject(i);
|
||||
if (source != null) {
|
||||
sourceIds.add(source.getString("id"));
|
||||
if (!StringUtils.equals(source.getString("label"), "SCENARIO-REF-STEP") && StringUtils.isNotEmpty(source.getString("id"))) {
|
||||
if (updateMap.containsKey(source.getString("id"))) {
|
||||
sourceHashTree.set(i, updateMap.get(source.getString("id")));
|
||||
} else {
|
||||
delIds.add(source.getString("id"));
|
||||
}
|
||||
}
|
||||
// 历史数据兼容
|
||||
if (StringUtils.isEmpty(source.getString("id")) && !StringUtils.equals(source.getString("label"), "SCENARIO-REF-STEP") && i < targetHashTree.size()) {
|
||||
sourceHashTree.set(i, targetHashTree.get(i));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 删除多余的步骤
|
||||
for (int i = 0; i < sourceHashTree.size(); i++) {
|
||||
JSONObject source = sourceHashTree.getJSONObject(i);
|
||||
if (delIds.contains(source.getString("id"))) {
|
||||
sourceHashTree.remove(i);
|
||||
}
|
||||
}
|
||||
// 补充新增的源引用步骤
|
||||
if (CollectionUtils.isNotEmpty(targetHashTree)) {
|
||||
for (int i = 0; i < targetHashTree.size(); i++) {
|
||||
JSONObject item = sourceHashTree.getJSONObject(i);
|
||||
if (!sourceIds.contains(item.getString("id"))) {
|
||||
sourceHashTree.add(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (CollectionUtils.isNotEmpty(sourceHashTree)) {
|
||||
element.put("hashTree", sourceHashTree);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
element.put("hashTree", targetHashTree);
|
||||
}
|
||||
}
|
||||
|
||||
public static String hashTreeToString(HashTree hashTree) {
|
||||
try (ByteArrayOutputStream bas = new ByteArrayOutputStream()) {
|
||||
SaveService.saveTree(hashTree, bas);
|
||||
|
|
|
@ -123,6 +123,8 @@ public class MsScenario extends MsTestElement {
|
|||
}
|
||||
this.setHashTree(sourceHashTree);
|
||||
hashTree = sourceHashTree;
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
|
||||
} catch (Exception ex) {
|
||||
|
|
|
@ -26,6 +26,7 @@ import io.metersphere.commons.utils.CommonBeanFactory;
|
|||
import io.metersphere.commons.utils.LogUtil;
|
||||
import io.metersphere.plugin.core.MsParameter;
|
||||
import io.metersphere.plugin.core.MsTestElement;
|
||||
import io.metersphere.utils.LoggerUtil;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
|
@ -88,7 +89,11 @@ public class MsDubboSampler extends MsTestElement {
|
|||
return;
|
||||
}
|
||||
if (this.getReferenced() != null && MsTestElementConstants.REF.name().equals(this.getReferenced())) {
|
||||
this.setRefElement();
|
||||
boolean ref = this.setRefElement();
|
||||
if (!ref) {
|
||||
LoggerUtil.debug("引用对象已经被删除:" + this.getId());
|
||||
return;
|
||||
}
|
||||
hashTree = this.getHashTree();
|
||||
}
|
||||
|
||||
|
@ -100,7 +105,7 @@ public class MsDubboSampler extends MsTestElement {
|
|||
}
|
||||
}
|
||||
|
||||
private void setRefElement() {
|
||||
private boolean setRefElement() {
|
||||
try {
|
||||
ApiDefinitionService apiDefinitionService = CommonBeanFactory.getBean(ApiDefinitionService.class);
|
||||
ObjectMapper mapper = new ObjectMapper();
|
||||
|
@ -139,11 +144,12 @@ public class MsDubboSampler extends MsTestElement {
|
|||
this.setConsumerAndService(proxy.getConsumerAndService());
|
||||
this.setRegistryCenter(proxy.getRegistryCenter());
|
||||
this.setConfigCenter(proxy.getConfigCenter());
|
||||
return true;
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
LogUtil.error(ex);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private DubboSample dubboSample(ParameterConfig config) {
|
||||
|
|
|
@ -45,6 +45,7 @@ import io.metersphere.jmeter.utils.ScriptEngineUtils;
|
|||
import io.metersphere.plugin.core.MsParameter;
|
||||
import io.metersphere.plugin.core.MsTestElement;
|
||||
import io.metersphere.track.service.TestPlanApiCaseService;
|
||||
import io.metersphere.utils.LoggerUtil;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
|
@ -133,7 +134,7 @@ public class MsHTTPSamplerProxy extends MsTestElement {
|
|||
@JSONField(ordinal = 39)
|
||||
private boolean customizeReq;
|
||||
|
||||
private void setRefElement() {
|
||||
private boolean setRefElement() {
|
||||
try {
|
||||
ApiDefinitionService apiDefinitionService = CommonBeanFactory.getBean(ApiDefinitionService.class);
|
||||
ObjectMapper mapper = new ObjectMapper();
|
||||
|
@ -171,11 +172,12 @@ public class MsHTTPSamplerProxy extends MsTestElement {
|
|||
this.setRest(proxy.getRest());
|
||||
this.setArguments(proxy.getArguments());
|
||||
this.setHeaders(proxy.getHeaders());
|
||||
return true;
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
LogUtil.error(ex);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -189,7 +191,11 @@ public class MsHTTPSamplerProxy extends MsTestElement {
|
|||
return;
|
||||
}
|
||||
if (this.getReferenced() != null && MsTestElementConstants.REF.name().equals(this.getReferenced())) {
|
||||
this.setRefElement();
|
||||
boolean ref = this.setRefElement();
|
||||
if (!ref) {
|
||||
LoggerUtil.debug("引用对象已经被删除:" + this.getId());
|
||||
return;
|
||||
}
|
||||
hashTree = this.getHashTree();
|
||||
}
|
||||
HTTPSamplerProxy sampler = new HTTPSamplerProxy();
|
||||
|
@ -749,22 +755,22 @@ public class MsHTTPSamplerProxy extends MsTestElement {
|
|||
list.stream().
|
||||
filter(KeyValue::isValid).
|
||||
filter(KeyValue::isEnable).forEach(keyValue -> {
|
||||
try {
|
||||
String value = StringUtils.isNotEmpty(keyValue.getValue()) && keyValue.getValue().startsWith("@") ? ScriptEngineUtils.buildFunctionCallString(keyValue.getValue()) : keyValue.getValue();
|
||||
HTTPArgument httpArgument = new HTTPArgument(keyValue.getName(), value);
|
||||
if (keyValue.getValue() == null) {
|
||||
httpArgument.setValue("");
|
||||
}
|
||||
httpArgument.setAlwaysEncoded(keyValue.isUrlEncode());
|
||||
if (StringUtils.isNotBlank(keyValue.getContentType())) {
|
||||
httpArgument.setContentType(keyValue.getContentType());
|
||||
}
|
||||
arguments.addArgument(httpArgument);
|
||||
} catch (Exception e) {
|
||||
|
||||
}
|
||||
try {
|
||||
String value = StringUtils.isNotEmpty(keyValue.getValue()) && keyValue.getValue().startsWith("@") ? ScriptEngineUtils.buildFunctionCallString(keyValue.getValue()) : keyValue.getValue();
|
||||
HTTPArgument httpArgument = new HTTPArgument(keyValue.getName(), value);
|
||||
if (keyValue.getValue() == null) {
|
||||
httpArgument.setValue("");
|
||||
}
|
||||
);
|
||||
httpArgument.setAlwaysEncoded(keyValue.isUrlEncode());
|
||||
if (StringUtils.isNotBlank(keyValue.getContentType())) {
|
||||
httpArgument.setContentType(keyValue.getContentType());
|
||||
}
|
||||
arguments.addArgument(httpArgument);
|
||||
} catch (Exception e) {
|
||||
|
||||
}
|
||||
}
|
||||
);
|
||||
return arguments;
|
||||
}
|
||||
|
||||
|
|
|
@ -29,6 +29,7 @@ import io.metersphere.commons.utils.LogUtil;
|
|||
import io.metersphere.constants.RunModeConstants;
|
||||
import io.metersphere.plugin.core.MsParameter;
|
||||
import io.metersphere.plugin.core.MsTestElement;
|
||||
import io.metersphere.utils.LoggerUtil;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
|
@ -86,7 +87,11 @@ public class MsJDBCSampler extends MsTestElement {
|
|||
return;
|
||||
}
|
||||
if (this.getReferenced() != null && MsTestElementConstants.REF.name().equals(this.getReferenced())) {
|
||||
this.setRefElement();
|
||||
boolean ref = this.setRefElement();
|
||||
if (!ref) {
|
||||
LoggerUtil.debug("引用对象已经被删除:" + this.getId());
|
||||
return;
|
||||
}
|
||||
hashTree = this.getHashTree();
|
||||
}
|
||||
if (config != null && config.getConfig() == null) {
|
||||
|
@ -172,12 +177,12 @@ public class MsJDBCSampler extends MsTestElement {
|
|||
}
|
||||
|
||||
//处理全局前后置脚本(步骤内)
|
||||
String enviromentId = this.getEnvironmentId();
|
||||
if (enviromentId == null) {
|
||||
enviromentId = this.useEnvironment;
|
||||
String environmentId = this.getEnvironmentId();
|
||||
if (environmentId == null) {
|
||||
environmentId = this.useEnvironment;
|
||||
}
|
||||
//根据配置将脚本放置在私有脚本之前
|
||||
JMeterScriptUtil.setScript(envConfig, samplerHashTree, GlobalScriptFilterRequest.JDBC.name(), enviromentId, config, false);
|
||||
JMeterScriptUtil.setScript(envConfig, samplerHashTree, GlobalScriptFilterRequest.JDBC.name(), environmentId, config, false);
|
||||
|
||||
HashTreeUtil hashTreeUtil = new HashTreeUtil();
|
||||
|
||||
|
@ -192,7 +197,7 @@ public class MsJDBCSampler extends MsTestElement {
|
|||
});
|
||||
}
|
||||
//根据配置将脚本放置在私有脚本之后
|
||||
JMeterScriptUtil.setScript(envConfig, samplerHashTree, GlobalScriptFilterRequest.JDBC.name(), enviromentId, config, true);
|
||||
JMeterScriptUtil.setScript(envConfig, samplerHashTree, GlobalScriptFilterRequest.JDBC.name(), environmentId, config, true);
|
||||
|
||||
}
|
||||
|
||||
|
@ -239,7 +244,7 @@ public class MsJDBCSampler extends MsTestElement {
|
|||
return "";
|
||||
}
|
||||
|
||||
private void setRefElement() {
|
||||
private boolean setRefElement() {
|
||||
try {
|
||||
ApiDefinitionService apiDefinitionService = CommonBeanFactory.getBean(ApiDefinitionService.class);
|
||||
ObjectMapper mapper = new ObjectMapper();
|
||||
|
@ -278,11 +283,12 @@ public class MsJDBCSampler extends MsTestElement {
|
|||
this.setVariableNames(proxy.getVariableNames());
|
||||
this.setResultVariable(proxy.getResultVariable());
|
||||
this.setQueryTimeout(proxy.getQueryTimeout());
|
||||
return true;
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
LogUtil.error(ex);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private EnvironmentConfig initDataSource() {
|
||||
|
|
|
@ -28,6 +28,7 @@ import io.metersphere.commons.utils.LogUtil;
|
|||
import io.metersphere.jmeter.utils.ScriptEngineUtils;
|
||||
import io.metersphere.plugin.core.MsParameter;
|
||||
import io.metersphere.plugin.core.MsTestElement;
|
||||
import io.metersphere.utils.LoggerUtil;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
|
@ -123,7 +124,11 @@ public class MsTCPSampler extends MsTestElement {
|
|||
return;
|
||||
}
|
||||
if (this.getReferenced() != null && MsTestElementConstants.REF.name().equals(this.getReferenced())) {
|
||||
this.setRefElement();
|
||||
boolean ref = this.setRefElement();
|
||||
if (!ref) {
|
||||
LoggerUtil.debug("引用对象已经被删除:" + this.getId());
|
||||
return;
|
||||
}
|
||||
hashTree = this.getHashTree();
|
||||
}
|
||||
if (config.getConfig() == null) {
|
||||
|
@ -154,7 +159,7 @@ public class MsTCPSampler extends MsTestElement {
|
|||
//增加误报、全局断言
|
||||
if (envConfig != null) {
|
||||
if (envConfig.isUseErrorCode()) {
|
||||
List<MsAssertions> errorReportAssertion =HashTreeUtil.getErrorReportByProjectId(this.getProjectId());
|
||||
List<MsAssertions> errorReportAssertion = HashTreeUtil.getErrorReportByProjectId(this.getProjectId());
|
||||
for (MsAssertions assertion : errorReportAssertion) {
|
||||
assertion.toHashTree(samplerHashTree, assertion.getHashTree(), config);
|
||||
}
|
||||
|
@ -167,12 +172,12 @@ public class MsTCPSampler extends MsTestElement {
|
|||
}
|
||||
|
||||
//处理全局前后置脚本(步骤内)
|
||||
String enviromentId = this.getEnvironmentId();
|
||||
if (enviromentId == null) {
|
||||
enviromentId = this.useEnvironment;
|
||||
String environmentId = this.getEnvironmentId();
|
||||
if (environmentId == null) {
|
||||
environmentId = this.useEnvironment;
|
||||
}
|
||||
//根据配置将脚本放置在私有脚本之前
|
||||
JMeterScriptUtil.setScript(envConfig, samplerHashTree, GlobalScriptFilterRequest.TCP.name(), enviromentId, config, false);
|
||||
JMeterScriptUtil.setScript(envConfig, samplerHashTree, GlobalScriptFilterRequest.TCP.name(), environmentId, config, false);
|
||||
|
||||
HashTreeUtil hashTreeUtil = new HashTreeUtil();
|
||||
|
||||
|
@ -187,23 +192,10 @@ public class MsTCPSampler extends MsTestElement {
|
|||
});
|
||||
}
|
||||
//根据配置将脚本放置在私有脚本之后
|
||||
JMeterScriptUtil.setScript(envConfig, samplerHashTree, GlobalScriptFilterRequest.TCP.name(), enviromentId, config, true);
|
||||
JMeterScriptUtil.setScript(envConfig, samplerHashTree, GlobalScriptFilterRequest.TCP.name(), environmentId, config, true);
|
||||
}
|
||||
|
||||
private void addItemHashTree(MsTestElement element, HashTree samplerHashTree, ParameterConfig config) {
|
||||
if (element != null) {
|
||||
if (element.getEnvironmentId() == null) {
|
||||
if (this.getEnvironmentId() == null) {
|
||||
element.setEnvironmentId(useEnvironment);
|
||||
} else {
|
||||
element.setEnvironmentId(this.getEnvironmentId());
|
||||
}
|
||||
}
|
||||
element.toHashTree(samplerHashTree, element.getHashTree(), config);
|
||||
}
|
||||
}
|
||||
|
||||
private void setRefElement() {
|
||||
private boolean setRefElement() {
|
||||
try {
|
||||
ApiDefinitionService apiDefinitionService = CommonBeanFactory.getBean(ApiDefinitionService.class);
|
||||
ObjectMapper mapper = new ObjectMapper();
|
||||
|
@ -239,11 +231,12 @@ public class MsTCPSampler extends MsTestElement {
|
|||
this.setServer(proxy.getServer());
|
||||
this.setPort(proxy.getPort());
|
||||
this.setRequest(proxy.getRequest());
|
||||
return true;
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
LogUtil.error(ex);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private void parseEnvironment(EnvironmentConfig config) {
|
||||
|
|
|
@ -9,6 +9,8 @@ import io.metersphere.api.dto.automation.parse.ScenarioImport;
|
|||
import io.metersphere.api.dto.automation.parse.ScenarioImportParserFactory;
|
||||
import io.metersphere.api.dto.datacount.ApiDataCountResult;
|
||||
import io.metersphere.api.dto.datacount.ApiMethodUrlDTO;
|
||||
import io.metersphere.api.dto.definition.ApiDefinitionResult;
|
||||
import io.metersphere.api.dto.definition.ApiTestCaseInfo;
|
||||
import io.metersphere.api.dto.definition.RunDefinitionRequest;
|
||||
import io.metersphere.api.dto.definition.request.*;
|
||||
import io.metersphere.api.dto.definition.request.sampler.MsHTTPSamplerProxy;
|
||||
|
@ -39,7 +41,10 @@ import io.metersphere.log.vo.DetailColumn;
|
|||
import io.metersphere.log.vo.OperatingLogDetails;
|
||||
import io.metersphere.log.vo.api.AutomationReference;
|
||||
import io.metersphere.plugin.core.MsTestElement;
|
||||
import io.metersphere.service.*;
|
||||
import io.metersphere.service.EnvironmentGroupProjectService;
|
||||
import io.metersphere.service.QuotaService;
|
||||
import io.metersphere.service.RelationshipEdgeService;
|
||||
import io.metersphere.service.ScheduleService;
|
||||
import io.metersphere.track.dto.TestPlanDTO;
|
||||
import io.metersphere.track.request.testcase.ApiCaseRelevanceRequest;
|
||||
import io.metersphere.track.request.testcase.QueryTestPlanRequest;
|
||||
|
@ -166,10 +171,10 @@ public class ApiAutomationService {
|
|||
return list;
|
||||
}
|
||||
|
||||
public List<ApiScenarioWithBLOBs> listAll(ApiScenarioBatchRequest request) {
|
||||
public List<ApiScenarioDTO> listAll(ApiScenarioBatchRequest request) {
|
||||
ServiceUtils.getSelectAllIds(request, request.getCondition(),
|
||||
(query) -> extApiScenarioMapper.selectIdsByQuery(query));
|
||||
List<ApiScenarioWithBLOBs> list = extApiScenarioMapper.selectIds(request.getIds());
|
||||
List<ApiScenarioDTO> list = extApiScenarioMapper.selectIds(request.getIds());
|
||||
return list;
|
||||
}
|
||||
|
||||
|
@ -675,25 +680,84 @@ public class ApiAutomationService {
|
|||
return scenarioWithBLOBs;
|
||||
}
|
||||
|
||||
private final static List<String> requests = new ArrayList<String>() {{
|
||||
this.add("HTTPSamplerProxy");
|
||||
this.add("DubboSampler");
|
||||
this.add("JDBCSampler");
|
||||
this.add("TCPSampler");
|
||||
}};
|
||||
|
||||
private void setElement(JSONObject element, Integer num, boolean enable, String versionName, boolean versionEnable) {
|
||||
element.put("num", num);
|
||||
element.put("enable", enable);
|
||||
element.put("versionName", versionName);
|
||||
element.put("versionEnable", versionEnable);
|
||||
}
|
||||
|
||||
private JSONObject setRequest(JSONObject element) {
|
||||
boolean enable = element.getBoolean("enable");
|
||||
boolean isExist = false;
|
||||
if (StringUtils.equalsIgnoreCase(element.getString("refType"), "CASE")) {
|
||||
ApiTestCaseInfo apiTestCase = apiTestCaseService.get(element.getString("id"));
|
||||
if (apiTestCase != null) {
|
||||
JSONObject refElement = JSON.parseObject(apiTestCase.getRequest());
|
||||
ElementUtil.dataFormatting(refElement);
|
||||
if (refElement.get("hashTree") != null && StringUtils.equalsIgnoreCase(element.getString("referenced"), "REF")) {
|
||||
ElementUtil.mergeHashTree(element, refElement.getJSONArray("hashTree"));
|
||||
element.put("referenced", "REF");
|
||||
element.put("name", apiTestCase.getName());
|
||||
} else {
|
||||
element = refElement;
|
||||
}
|
||||
isExist = true;
|
||||
this.setElement(element, apiTestCase.getNum(), enable, apiTestCase.getVersionName(), apiTestCase.getVersionEnable());
|
||||
}
|
||||
} else {
|
||||
ApiDefinitionResult definitionWithBLOBs = apiDefinitionService.getById(element.getString("id"));
|
||||
if (definitionWithBLOBs != null) {
|
||||
this.setElement(element, definitionWithBLOBs.getNum(), enable, definitionWithBLOBs.getVersionName(), definitionWithBLOBs.getVersionEnable());
|
||||
isExist = true;
|
||||
}
|
||||
}
|
||||
if (!isExist) {
|
||||
if (StringUtils.equalsIgnoreCase(element.getString("referenced"), "REF")) {
|
||||
element.put("enable", false);
|
||||
}
|
||||
element.put("num", "");
|
||||
}
|
||||
return element;
|
||||
}
|
||||
|
||||
private JSONObject setRefScenario(JSONObject element) {
|
||||
boolean enable = element.getBoolean("enable");
|
||||
ApiScenarioDTO scenarioWithBLOBs = extApiScenarioMapper.selectById(element.getString("id"));
|
||||
if (scenarioWithBLOBs != null && StringUtils.isNotEmpty(scenarioWithBLOBs.getScenarioDefinition())) {
|
||||
boolean environmentEnable = element.getBoolean("environmentEnable");
|
||||
if (StringUtils.equalsIgnoreCase(element.getString("referenced"), "REF")) {
|
||||
element = JSON.parseObject(scenarioWithBLOBs.getScenarioDefinition());
|
||||
element.put("referenced", "REF");
|
||||
element.put("name", scenarioWithBLOBs.getName());
|
||||
}
|
||||
element.put("environmentEnable", environmentEnable);
|
||||
this.setElement(element, scenarioWithBLOBs.getNum(), enable, scenarioWithBLOBs.getVersionName(), scenarioWithBLOBs.getVersionEnable());
|
||||
} else {
|
||||
if (StringUtils.equalsIgnoreCase(element.getString("referenced"), "REF")) {
|
||||
element.put("enable", false);
|
||||
}
|
||||
element.put("num", "");
|
||||
}
|
||||
return element;
|
||||
}
|
||||
|
||||
public void dataFormatting(JSONArray hashTree) {
|
||||
for (int i = 0; i < hashTree.size(); i++) {
|
||||
JSONObject element = hashTree.getJSONObject(i);
|
||||
if (element != null && StringUtils.equalsIgnoreCase(element.getString("type"), "scenario")) {
|
||||
ApiScenarioDTO scenarioWithBLOBs = extApiScenarioMapper.selectById(element.getString("id"));
|
||||
if (scenarioWithBLOBs != null && StringUtils.isNotEmpty(scenarioWithBLOBs.getScenarioDefinition())) {
|
||||
boolean enable = element.getBoolean("enable");
|
||||
boolean environmentEnable = element.getBoolean("environmentEnable");
|
||||
if (StringUtils.equalsIgnoreCase(element.getString("referenced"), "REF")) {
|
||||
element = JSON.parseObject(scenarioWithBLOBs.getScenarioDefinition());
|
||||
element.put("referenced", "REF");
|
||||
}
|
||||
element.put("num", scenarioWithBLOBs.getNum());
|
||||
element.put("enable", enable);
|
||||
element.put("environmentEnable", environmentEnable);
|
||||
element.put("versionName", scenarioWithBLOBs.getVersionName());
|
||||
element.put("versionEnable", scenarioWithBLOBs.getVersionEnable());
|
||||
hashTree.set(i, element);
|
||||
}
|
||||
element = this.setRefScenario(element);
|
||||
hashTree.set(i, element);
|
||||
} else if (element != null && requests.contains(element.getString("type"))) {
|
||||
element = this.setRequest(element);
|
||||
hashTree.set(i, element);
|
||||
}
|
||||
if (element.containsKey("hashTree")) {
|
||||
JSONArray elementJSONArray = element.getJSONArray("hashTree");
|
||||
|
@ -704,20 +768,9 @@ public class ApiAutomationService {
|
|||
|
||||
public void dataFormatting(JSONObject element) {
|
||||
if (element != null && StringUtils.equalsIgnoreCase(element.getString("type"), "scenario")) {
|
||||
ApiScenarioDTO scenarioWithBLOBs = extApiScenarioMapper.selectById(element.getString("id"));
|
||||
if (scenarioWithBLOBs != null && StringUtils.isNotEmpty(scenarioWithBLOBs.getScenarioDefinition())) {
|
||||
boolean enable = element.getBoolean("enable");
|
||||
boolean environmentEnable = element.getBoolean("environmentEnable");
|
||||
if (StringUtils.equalsIgnoreCase(element.getString("referenced"), "REF")) {
|
||||
element = JSON.parseObject(scenarioWithBLOBs.getScenarioDefinition());
|
||||
element.put("referenced", "REF");
|
||||
}
|
||||
element.put("enable", enable);
|
||||
element.put("environmentEnable", environmentEnable);
|
||||
element.put("num", scenarioWithBLOBs.getNum());
|
||||
element.put("versionName", scenarioWithBLOBs.getVersionName());
|
||||
element.put("versionEnable", scenarioWithBLOBs.getVersionEnable());
|
||||
}
|
||||
element = this.setRefScenario(element);
|
||||
} else if (element != null && requests.contains(element.getString("type"))) {
|
||||
element = this.setRequest(element);
|
||||
}
|
||||
if (element != null && element.containsKey("hashTree")) {
|
||||
JSONArray elementJSONArray = element.getJSONArray("hashTree");
|
||||
|
@ -761,7 +814,7 @@ public class ApiAutomationService {
|
|||
}
|
||||
|
||||
|
||||
public List<ApiScenarioWithBLOBs> getApiScenarios(List<String> ids) {
|
||||
public List<ApiScenarioDTO> getApiScenarios(List<String> ids) {
|
||||
if (CollectionUtils.isNotEmpty(ids)) {
|
||||
return extApiScenarioMapper.selectIds(ids);
|
||||
}
|
||||
|
@ -1050,9 +1103,8 @@ public class ApiAutomationService {
|
|||
}
|
||||
|
||||
public JmxInfoDTO genPerformanceTestJmx(GenScenarioRequest request) {
|
||||
List<ApiScenarioWithBLOBs> apiScenarios = null;
|
||||
List<String> ids = request.getIds();
|
||||
apiScenarios = extApiScenarioMapper.selectIds(ids);
|
||||
List<ApiScenarioDTO> apiScenarios = extApiScenarioMapper.selectIds(ids);
|
||||
String testName = "";
|
||||
String id = "";
|
||||
if (!apiScenarios.isEmpty()) {
|
||||
|
@ -1821,7 +1873,7 @@ public class ApiAutomationService {
|
|||
List<JmxInfoDTO> returnList = new ArrayList<>();
|
||||
|
||||
List<String> ids = request.getIds();
|
||||
List<ApiScenarioWithBLOBs> apiScenarioList = extApiScenarioMapper.selectIds(ids);
|
||||
List<ApiScenarioDTO> apiScenarioList = extApiScenarioMapper.selectIds(ids);
|
||||
if (CollectionUtils.isEmpty(apiScenarioList)) {
|
||||
return returnList;
|
||||
} else {
|
||||
|
@ -1845,7 +1897,7 @@ public class ApiAutomationService {
|
|||
(query) -> extApiScenarioMapper.selectIdsByQuery(query));
|
||||
List<String> ids = request.getIds();
|
||||
if (CollectionUtils.isEmpty(ids)) return;
|
||||
List<ApiScenarioWithBLOBs> apiScenarioList = extApiScenarioMapper.selectIds(ids);
|
||||
List<ApiScenarioDTO> apiScenarioList = extApiScenarioMapper.selectIds(ids);
|
||||
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
|
||||
ApiScenarioMapper mapper = sqlSession.getMapper(ApiScenarioMapper.class);
|
||||
Long nextOrder = ServiceUtils.getNextOrder(request.getProjectId(), extApiScenarioMapper::getLastOrder);
|
||||
|
|
|
@ -89,12 +89,12 @@
|
|||
|
||||
<select id="selectByIds" resultType="io.metersphere.api.dto.definition.ApiComputeResult">
|
||||
SELECT t1.api_definition_id apiDefinitionId,count(t1.id) caseTotal,
|
||||
SUM(case when t2.status ='success' then 1 else 0 end) as success ,SUM(case when t2.status ='error' then 1 else 0 end) as error,
|
||||
CONCAT(FORMAT(SUM(IF (t2.`status`='success',1,0))/COUNT(t1.id)*100,2),'%') passRate
|
||||
SUM(case when t2.status ='success' then 1 else 0 end) as success ,SUM(case when t2.status ='error' then 1 else 0 end) as error,
|
||||
CONCAT(FORMAT(SUM(IF (t2.`status`='success',1,0))/COUNT(t1.id)*100,2),'%') passRate
|
||||
FROM api_test_case t1
|
||||
LEFT JOIN api_definition_exec_result t2 ON t1.last_result_id=t2.id
|
||||
LEFT JOIN api_definition_exec_result t2 ON t1.last_result_id=t2.id
|
||||
WHERE t1.project_id = #{projectId}
|
||||
group by t1.api_definition_id having t1.api_definition_id in
|
||||
group by t1.api_definition_id having t1.api_definition_id in
|
||||
<foreach collection="ids" item="v" separator="," open="(" close=")">
|
||||
#{v}
|
||||
</foreach>
|
||||
|
@ -182,9 +182,9 @@
|
|||
|
||||
<if test='${condition}.tags != null and ${objectKey}.operator == "not like"'>
|
||||
and (api_definition.tags is null or api_definition.tags
|
||||
<include refid="condition">
|
||||
<property name="object" value="${condition}.tags"/>
|
||||
</include>
|
||||
<include refid="condition">
|
||||
<property name="object" value="${condition}.tags"/>
|
||||
</include>
|
||||
)
|
||||
</if>
|
||||
<if test='${condition}.tags != null and ${objectKey}.operator == "like"'>
|
||||
|
@ -297,10 +297,13 @@
|
|||
api_definition.description,api_definition.request,api_definition.response,api_definition.environment_id,
|
||||
api_definition.status, api_definition.user_id, api_definition.create_time, api_definition.update_time,
|
||||
project.name as
|
||||
project_name, user.name as user_name
|
||||
project_name, user.name as user_name,
|
||||
api_definition.version_id versionId,
|
||||
project_version.name versionName,project.version_enable
|
||||
from api_definition
|
||||
left join project on api_definition.project_id = project.id
|
||||
left join user on api_definition.user_id = user.id
|
||||
left join project_version on api_definition.project_id = project_version.project_id and api_definition.version_id = project_version.id
|
||||
WHERE api_definition.id IN
|
||||
<foreach collection="ids" item="v" separator="," open="(" close=")">
|
||||
#{v}
|
||||
|
@ -320,7 +323,7 @@
|
|||
set original_state=status,
|
||||
status = 'Trash', delete_user_id = #{operator},delete_time = #{operationTime}
|
||||
<if test="_parameter != null">
|
||||
<include refid="Example_Where_Clause" />
|
||||
<include refid="Example_Where_Clause"/>
|
||||
</if>
|
||||
</update>
|
||||
|
||||
|
@ -409,7 +412,7 @@
|
|||
|
||||
<if test="request.name != null">
|
||||
and (api_definition.name like CONCAT('%', #{request.name},'%')
|
||||
or api_definition.num like CONCAT('%', #{request.name},'%')
|
||||
or api_definition.num like CONCAT('%', #{request.name},'%')
|
||||
)
|
||||
</if>
|
||||
<if test="request.protocol != null">
|
||||
|
@ -748,11 +751,11 @@
|
|||
<if test="request.versionId == null and request.refId == null and request.id == null">
|
||||
AND (
|
||||
version_id = (SELECT project_version.id
|
||||
FROM api_definition tmp
|
||||
JOIN project_version
|
||||
ON tmp.project_id = project_version.project_id AND tmp.version_id = project_version.id AND latest = TRUE
|
||||
WHERE ref_id = api_definition.ref_id
|
||||
LIMIT 1)
|
||||
FROM api_definition tmp
|
||||
JOIN project_version
|
||||
ON tmp.project_id = project_version.project_id AND tmp.version_id = project_version.id AND latest = TRUE
|
||||
WHERE ref_id = api_definition.ref_id
|
||||
LIMIT 1)
|
||||
OR
|
||||
version_id = (SELECT project_version.id
|
||||
FROM api_definition tmp
|
||||
|
@ -826,7 +829,7 @@
|
|||
and t3.`status`!='Trash'
|
||||
</select>
|
||||
<select id="countByIds" resultType="java.lang.Integer">
|
||||
select count(id) from api_definition
|
||||
select count(id) from api_definition
|
||||
where id in
|
||||
<foreach collection="ids" item="id" separator="," open="(" close=")">
|
||||
#{id}
|
||||
|
@ -837,7 +840,7 @@
|
|||
<select id="countByExample" parameterType="io.metersphere.base.domain.ApiDefinitionExample" resultType="java.lang.Long">
|
||||
select count(DISTINCT ref_id) from api_definition
|
||||
<if test="_parameter != null">
|
||||
<include refid="io.metersphere.base.mapper.ApiDefinitionMapper.Example_Where_Clause" />
|
||||
<include refid="io.metersphere.base.mapper.ApiDefinitionMapper.Example_Where_Clause"/>
|
||||
</if>
|
||||
</select>
|
||||
</mapper>
|
||||
|
|
|
@ -23,7 +23,7 @@ public interface ExtApiScenarioMapper {
|
|||
|
||||
List<ApiScenarioWithBLOBs> selectByTagId(@Param("id") String id);
|
||||
|
||||
List<ApiScenarioWithBLOBs> selectIds(@Param("ids") List<String> ids);
|
||||
List<ApiScenarioDTO> selectIds(@Param("ids") List<String> ids);
|
||||
|
||||
int selectTrash(@Param("projectId") String projectId);
|
||||
|
||||
|
|
|
@ -351,8 +351,12 @@
|
|||
select * from api_scenario where tags like CONCAT('%', #{id},'%')
|
||||
</select>
|
||||
|
||||
<select id="selectIds" resultType="io.metersphere.base.domain.ApiScenarioWithBLOBs">
|
||||
select * from api_scenario where id in
|
||||
<select id="selectIds" resultType="io.metersphere.api.dto.automation.ApiScenarioDTO">
|
||||
select api_scenario.*, project_version.name as version_name, project.version_enable
|
||||
from api_scenario
|
||||
LEFT JOIN project_version on project_version.project_id = api_scenario.project_id and project_version.id = version_id
|
||||
LEFT JOIN project on api_scenario.project_id = project.id
|
||||
WHERE api_scenario.id in
|
||||
<foreach collection="ids" item="v" separator="," open="(" close=")">
|
||||
#{v}
|
||||
</foreach>
|
||||
|
|
|
@ -600,9 +600,11 @@
|
|||
</if>
|
||||
</select>
|
||||
<select id="getCaseInfo" resultType="io.metersphere.api.dto.definition.ApiTestCaseInfo">
|
||||
select t1.*,a.method AS apiMethod
|
||||
select t1.*,a.method AS apiMethod,project_version.name as version_name, project.version_enable
|
||||
from api_test_case t1
|
||||
inner join api_definition a on t1.api_definition_id = a.id
|
||||
LEFT JOIN project ON t1.project_id = project.id
|
||||
LEFT JOIN project_version on a.project_id = project_version.project_id AND project_version.id = t1.version_id
|
||||
where 1
|
||||
<if test="request.id != null and request.id!=''">
|
||||
and t1.id = #{request.id}
|
||||
|
|
|
@ -1132,6 +1132,10 @@ export default {
|
|||
request.active = false;
|
||||
request.resourceId = getUUID();
|
||||
request.projectId = item.projectId;
|
||||
request.num = item.num;
|
||||
request.versionEnable = item.versionEnable;
|
||||
request.versionId = item.versionId;
|
||||
request.versionName = item.versionName;
|
||||
request.requestResult = [];
|
||||
if (!request.url) {
|
||||
request.url = "";
|
||||
|
|
|
@ -115,7 +115,10 @@ export default {
|
|||
referenced: referenced,
|
||||
resourceId: getUUID(),
|
||||
hashTree: scenarioDefinition.hashTree,
|
||||
projectId: item.projectId
|
||||
projectId: item.projectId,
|
||||
num: item.num,
|
||||
versionName: item.versionName,
|
||||
versionEnable: item.versionEnable
|
||||
};
|
||||
scenarios.push(obj);
|
||||
}
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
<i class="el-icon-warning"/>
|
||||
</el-tooltip>
|
||||
</span>
|
||||
<span v-xpack v-if="request.versionEnable&&showVersion">{{$t('project.version.name')}}: {{ request.versionName }}</span>
|
||||
<span v-xpack v-if="request.versionEnable&&showVersion">{{ $t('project.version.name') }}: {{ request.versionName }}</span>
|
||||
</template>
|
||||
|
||||
<template v-slot:behindHeaderLeft>
|
||||
|
@ -57,39 +57,39 @@
|
|||
<legend style="width: 100%">
|
||||
<div v-if="!ifFromVariableAdvance">
|
||||
|
||||
<customize-req-info :is-customize-req="isCustomizeReq" :request="request" @setDomain="setDomain"/>
|
||||
<p class="tip">{{ $t('api_test.definition.request.req_param') }} </p>
|
||||
<ms-api-request-form
|
||||
v-if="request.protocol==='HTTP' || request.type==='HTTPSamplerProxy'"
|
||||
:scenario-definition="scenarioDefinition"
|
||||
@editScenarioAdvance="editScenarioAdvance"
|
||||
:isShowEnable="true"
|
||||
:referenced="true"
|
||||
:headers="request.headers "
|
||||
:is-read-only="isCompReadOnly"
|
||||
:request="request"/>
|
||||
<esb-definition
|
||||
v-if="showXpackCompnent&&request.esbDataStruct!=null"
|
||||
v-xpack
|
||||
:request="request"
|
||||
:showScript="false"
|
||||
:is-read-only="isCompReadOnly" ref="esbDefinition"/>
|
||||
<ms-tcp-format-parameters
|
||||
v-if="(request.protocol==='TCP'|| request.type==='TCPSampler')&& request.esbDataStruct==null "
|
||||
:is-read-only="isCompReadOnly"
|
||||
:show-script="false" :request="request"/>
|
||||
<customize-req-info :is-customize-req="isCustomizeReq" :request="request" @setDomain="setDomain"/>
|
||||
<p class="tip">{{ $t('api_test.definition.request.req_param') }} </p>
|
||||
<ms-api-request-form
|
||||
v-if="request.protocol==='HTTP' || request.type==='HTTPSamplerProxy'"
|
||||
:scenario-definition="scenarioDefinition"
|
||||
@editScenarioAdvance="editScenarioAdvance"
|
||||
:isShowEnable="true"
|
||||
:referenced="true"
|
||||
:headers="request.headers "
|
||||
:is-read-only="isCompReadOnly"
|
||||
:request="request"/>
|
||||
<esb-definition
|
||||
v-if="showXpackCompnent&&request.esbDataStruct!=null"
|
||||
v-xpack
|
||||
:request="request"
|
||||
:showScript="false"
|
||||
:is-read-only="isCompReadOnly" ref="esbDefinition"/>
|
||||
<ms-tcp-format-parameters
|
||||
v-if="(request.protocol==='TCP'|| request.type==='TCPSampler')&& request.esbDataStruct==null "
|
||||
:is-read-only="isCompReadOnly"
|
||||
:show-script="false" :request="request"/>
|
||||
|
||||
<ms-sql-basis-parameters
|
||||
v-if="request.protocol==='SQL'|| request.type==='JDBCSampler'"
|
||||
:request="request"
|
||||
:is-read-only="isCompReadOnly"
|
||||
:showScript="false"/>
|
||||
<ms-sql-basis-parameters
|
||||
v-if="request.protocol==='SQL'|| request.type==='JDBCSampler'"
|
||||
:request="request"
|
||||
:is-read-only="isCompReadOnly"
|
||||
:showScript="false"/>
|
||||
|
||||
<ms-dubbo-basis-parameters
|
||||
v-if="request.protocol==='DUBBO' || request.protocol==='dubbo://'|| request.type==='DubboSampler'"
|
||||
:request="request"
|
||||
:is-read-only="isCompReadOnly"
|
||||
:showScript="false"/>
|
||||
<ms-dubbo-basis-parameters
|
||||
v-if="request.protocol==='DUBBO' || request.protocol==='dubbo://'|| request.type==='DubboSampler'"
|
||||
:request="request"
|
||||
:is-read-only="isCompReadOnly"
|
||||
:showScript="false"/>
|
||||
|
||||
</div>
|
||||
</legend>
|
||||
|
@ -228,11 +228,13 @@ export default {
|
|||
this.request.projectId = getCurrentProjectID();
|
||||
}
|
||||
this.request.customizeReq = this.isCustomizeReq;
|
||||
|
||||
if (this.request.num) {
|
||||
this.isShowNum = true;
|
||||
this.getWorkspaceId(this.request.projectId);
|
||||
} else {
|
||||
this.isShowNum = false;
|
||||
}
|
||||
// 加载引用对象数据
|
||||
this.getApiInfo();
|
||||
if (this.request.protocol === 'HTTP') {
|
||||
this.setUrl(this.request.url);
|
||||
this.setUrl(this.request.path);
|
||||
|
|
|
@ -121,7 +121,7 @@ export default {
|
|||
this.isShowNum = true;
|
||||
this.getWorkspaceId(this.scenario.projectId);
|
||||
} else {
|
||||
this.isSameSpace = false;
|
||||
this.isShowNum = false;
|
||||
}
|
||||
if (!this.scenario.projectId) {
|
||||
this.scenario.projectId = getCurrentProjectID();
|
||||
|
|
Loading…
Reference in New Issue