refactor(接口测试): 优化前后置和断言的解析

This commit is contained in:
AgAngle 2023-12-25 12:55:05 +08:00 committed by jianxing
parent 335e298b27
commit a6d3c97375
8 changed files with 129 additions and 47 deletions

View File

@ -47,7 +47,7 @@ public abstract class AbstractJmeterElementConverter<T extends MsTestElement> {
if (element != null && element.getChildren() != null) {
element.getChildren().forEach(child ->
getConverterFunc.apply(child.getClass())
.toHashTree(tree, element, config));
.toHashTree(tree, child, config));
}
}
}

View File

@ -0,0 +1,30 @@
package io.metersphere.api.dto.request;
import io.metersphere.api.dto.request.assertion.MsAssertionConfig;
import io.metersphere.api.dto.request.processors.MsProcessorConfig;
import io.metersphere.plugin.api.spi.AbstractMsTestElement;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 协议插件中通用的配置
* 添加到对应元素的 children 属性中
* @Author: jianxing
* @CreateTime: 2023-12-25 10:50
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class MsCommonElement extends AbstractMsTestElement {
/**
* 前置处理器配置
*/
private MsProcessorConfig preProcessorConfig;
/**
* 后置处理器配置
*/
private MsProcessorConfig postProcessorConfig;
/**
* 断言配置
*/
private MsAssertionConfig assertionConfig;
}

View File

@ -1,10 +1,8 @@
package io.metersphere.api.dto.request.http;
import io.metersphere.plugin.api.spi.AbstractMsTestElement;
import io.metersphere.api.dto.request.assertion.MsAssertionConfig;
import io.metersphere.api.dto.request.http.auth.HTTPAuth;
import io.metersphere.api.dto.request.http.body.Body;
import io.metersphere.api.dto.request.processors.MsProcessorConfig;
import io.metersphere.plugin.api.spi.AbstractMsTestElement;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -51,16 +49,4 @@ public class MsHTTPElement extends AbstractMsTestElement {
* 认证配置
*/
private HTTPAuth authConfig;
/**
* 前置处理器配置
*/
private MsProcessorConfig preProcessorConfig;
/**
* 后置处理器配置
*/
private MsProcessorConfig postProcessorConfig;
/**
* 断言配置
*/
private MsAssertionConfig assertionConfig;
}

View File

@ -0,0 +1,22 @@
package io.metersphere.api.parser.jmeter;
import io.metersphere.api.dto.request.MsCommonElement;
import io.metersphere.plugin.api.dto.ParameterConfig;
import io.metersphere.plugin.api.spi.AbstractJmeterElementConverter;
import org.apache.jorphan.collections.HashTree;
/**
* @Author: jianxing
* @CreateTime: 2023-10-27 10:07
* <p>
* 脚本解析器
*/
public class MsCommonElementConverter extends AbstractJmeterElementConverter<MsCommonElement> {
@Override
public void toHashTree(HashTree tree, MsCommonElement element, ParameterConfig config) {
// todo 解析前后置和断言
}
}

View File

@ -10,6 +10,7 @@ import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.json.JsonMapper;
import com.fasterxml.jackson.databind.jsontype.NamedType;
import com.fasterxml.jackson.databind.type.CollectionType;
import io.metersphere.api.dto.request.MsCommonElement;
import io.metersphere.api.dto.request.http.MsHTTPElement;
import io.metersphere.sdk.exception.MSException;
@ -32,6 +33,7 @@ public class ApiDataUtils {
static {
// 默认内置的子组件
namedTypes.add(new NamedType(MsHTTPElement.class, MsHTTPElement.class.getSimpleName()));
namedTypes.add(new NamedType(MsCommonElement.class, MsCommonElement.class.getSimpleName()));
setObjectMapper(objectMapper);
namedTypes.forEach(objectMapper::registerSubtypes);

View File

@ -1,5 +1,6 @@
package io.metersphere.api.utils;
import io.metersphere.api.parser.jmeter.MsCommonElementConverter;
import io.metersphere.api.parser.jmeter.MsHTTPElementConverter;
import io.metersphere.plugin.api.spi.AbstractJmeterElementConverter;
import io.metersphere.plugin.api.spi.MsTestElement;
@ -25,6 +26,7 @@ public class JmeterElementConverterRegister {
static {
// 注册默认的转换器 todo 注册插件的转换器
JmeterElementConverterRegister.register(MsHTTPElementConverter.class);
JmeterElementConverterRegister.register(MsCommonElementConverter.class);
}
/**

View File

@ -5,7 +5,9 @@ import io.metersphere.api.domain.ApiDebug;
import io.metersphere.api.domain.ApiDebugBlob;
import io.metersphere.api.domain.ApiFileResource;
import io.metersphere.api.dto.debug.*;
import io.metersphere.api.dto.request.MsCommonElement;
import io.metersphere.api.dto.request.MsScenario;
import io.metersphere.api.dto.request.assertion.MsAssertionConfig;
import io.metersphere.api.dto.request.http.MsHTTPElement;
import io.metersphere.api.dto.request.http.body.Body;
import io.metersphere.api.mapper.ApiDebugBlobMapper;
@ -61,6 +63,7 @@ import org.springframework.mock.web.MockMultipartFile;
import org.springframework.test.web.servlet.MvcResult;
import org.testcontainers.shaded.org.apache.commons.lang3.StringUtils;
import java.util.LinkedList;
import java.util.List;
import static io.metersphere.api.controller.result.ApiResultCode.API_DEBUG_EXIST;
@ -408,15 +411,51 @@ public class ApiDebugControllerTests extends BaseTest {
// @@请求成功
this.requestPostWithOk(DEBUG, request);
// 测试 FORM_DATA
// 测试断言
MsAssertionConfig msAssertionConfig = new MsAssertionConfig();
msAssertionConfig.setEnableGlobal(false);
msAssertionConfig.setAssertions(MsHTTPElementTest.getGeneralAssertions());
MsCommonElement msCommonElement = new MsCommonElement();
msCommonElement.setAssertionConfig(msAssertionConfig);
LinkedList linkedList = new LinkedList();
linkedList.add(msCommonElement);
msHTTPElement = MsHTTPElementTest.getMsHttpElement();
msHTTPElement.setChildren(linkedList);
msHTTPElement.setEnable(true);
request.setRequest(ApiDataUtils.toJSONString(msHTTPElement));
this.requestPostWithOk(DEBUG, request);
// 测试请求体
MockMultipartFile file = getMockMultipartFile();
String fileId = doUploadTempFile(file);
request.setTempFileIds(List.of(fileId, fileMetadataId));
msHTTPElement = MsHTTPElementTest.getMsHttpElement();
Body generalBody = MsHTTPElementTest.getGeneralBody();
generalBody.setBodyType(Body.BodyType.FORM_DATA.name());
msHTTPElement = MsHTTPElementTest.getMsHttpElement();
msHTTPElement.setBody(generalBody);
msHTTPElement.setEnable(true);
testBodyParse(request, msHTTPElement, generalBody);
// 增加覆盖率
msHTTPElement.setMethod("GET");
request.setRequest(ApiDataUtils.toJSONString(msHTTPElement));
this.requestPostWithOk(DEBUG, request);
msHTTPElement.setEnable(false);
request.setRequest(ApiDataUtils.toJSONString(msHTTPElement));
this.requestPostWithOk(DEBUG, request);
// 增加覆盖率
new TestElementParserFactory();
new ImportParserFactory();
MsScenarioConverter msScenarioConverter = new MsScenarioConverter();
msScenarioConverter.toHashTree(new ListedHashTree(), new MsScenario(), new ParameterConfig());
// @@校验权限
requestPostPermissionTest(PermissionConstants.PROJECT_API_DEBUG_EXECUTE, DEBUG, request);
}
private void testBodyParse(ApiDebugRunRequest request, MsHTTPElement msHTTPElement, Body generalBody) throws Exception {
// 测试 FORM_DATA
generalBody.setBodyType(Body.BodyType.FORM_DATA.name());
request.setRequest(ApiDataUtils.toJSONString(msHTTPElement));
this.requestPostWithOk(DEBUG, request);
@ -444,23 +483,6 @@ public class ApiDebugControllerTests extends BaseTest {
generalBody.setBodyType(Body.BodyType.RAW.name());
request.setRequest(ApiDataUtils.toJSONString(msHTTPElement));
this.requestPostWithOk(DEBUG, request);
// 增加覆盖率
msHTTPElement.setMethod("GET");
request.setRequest(ApiDataUtils.toJSONString(msHTTPElement));
this.requestPostWithOk(DEBUG, request);
msHTTPElement.setEnable(false);
request.setRequest(ApiDataUtils.toJSONString(msHTTPElement));
this.requestPostWithOk(DEBUG, request);
// 增加覆盖率
new TestElementParserFactory();
new ImportParserFactory();
MsScenarioConverter msScenarioConverter = new MsScenarioConverter();
msScenarioConverter.toHashTree(new ListedHashTree(), new MsScenario(), new ParameterConfig());
// @@校验权限
requestPostPermissionTest(PermissionConstants.PROJECT_API_DEBUG_EXECUTE, DEBUG, request);
}
private TestResourcePool insertResourcePool() {

View File

@ -1,6 +1,7 @@
package io.metersphere.api.controller;
import io.metersphere.api.dto.definition.HttpResponse;
import io.metersphere.api.dto.request.MsCommonElement;
import io.metersphere.api.dto.request.assertion.*;
import io.metersphere.api.dto.request.assertion.body.*;
import io.metersphere.api.dto.request.http.*;
@ -20,6 +21,7 @@ import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
/**
@ -172,8 +174,14 @@ public class MsHTTPElementTest {
MsProcessorConfig msProcessorConfig = new MsProcessorConfig();
msProcessorConfig.setProcessors(processors);
msHTTPElement.setPreProcessorConfig(msProcessorConfig);
msHTTPElement.setPostProcessorConfig(msProcessorConfig);
MsCommonElement msCommonElement = new MsCommonElement();
msCommonElement.setPreProcessorConfig(msProcessorConfig);
msCommonElement.setPostProcessorConfig(msProcessorConfig);
LinkedList linkedList = new LinkedList();
linkedList.add(msCommonElement);
msHTTPElement.setChildren(linkedList);
String json = ApiDataUtils.toJSONString(msHTTPElement);
Assertions.assertNotNull(json);
Assertions.assertEquals(ApiDataUtils.parseObject(json, AbstractMsTestElement.class), msHTTPElement);
@ -183,9 +191,26 @@ public class MsHTTPElementTest {
public void msAssertionTest() {
MsHTTPElement msHTTPElement = getMsHttpElement();
List<MsAssertion> assertions = getGeneralAssertions();
List assertions = new ArrayList<>();
MsAssertionConfig msAssertionConfig = new MsAssertionConfig();
msAssertionConfig.setEnableGlobal(false);
msAssertionConfig.setAssertions(assertions);
MsCommonElement msCommonElement = new MsCommonElement();
msCommonElement.setAssertionConfig(msAssertionConfig);
LinkedList linkedList = new LinkedList();
linkedList.add(msCommonElement);
msHTTPElement.setChildren(linkedList);
String json = ApiDataUtils.toJSONString(msHTTPElement);
Assertions.assertNotNull(json);
Assertions.assertEquals(ApiDataUtils.parseObject(json, AbstractMsTestElement.class), msHTTPElement);
}
public static List<MsAssertion> getGeneralAssertions() {
List<MsAssertion> assertions = new ArrayList<>();
ResponseCodeAssertion responseCodeAssertion = new ResponseCodeAssertion();
responseCodeAssertion.setCondition(MsAssertionCondition.EMPTY.name());
responseCodeAssertion.setValue("value");
@ -222,14 +247,7 @@ public class MsHTTPElementTest {
scriptAssertion.setDescription("1111");
scriptAssertion.setName("1111");
assertions.add(scriptAssertion);
MsAssertionConfig msAssertionConfig = new MsAssertionConfig();
msAssertionConfig.setEnableGlobal(false);
msAssertionConfig.setAssertions(assertions);
msHTTPElement.setAssertionConfig(msAssertionConfig);
String json = ApiDataUtils.toJSONString(msHTTPElement);
Assertions.assertNotNull(json);
Assertions.assertEquals(ApiDataUtils.parseObject(json, AbstractMsTestElement.class), msHTTPElement);
return assertions;
}
public static MsHTTPElement getMsHttpElement() {