refactor(接口测试): 场景增加执行历史查询

This commit is contained in:
wxg0103 2024-02-22 14:11:40 +08:00 committed by Craftsman
parent 074787aaee
commit 5a67c18bda
21 changed files with 344 additions and 66 deletions

View File

@ -1,6 +1,5 @@
package io.metersphere.sdk.file;
import io.metersphere.plugin.sdk.util.PluginUtils;
import io.metersphere.sdk.exception.MSException;
import io.metersphere.sdk.util.LogUtils;
import io.minio.*;
@ -50,7 +49,7 @@ public class MinioRepository implements FileRepository {
try {
Object serverUrl = minioConfig.get(ENDPOINT).toString();
if (ObjectUtils.isNotEmpty(serverUrl)) {
LogUtils.info("开始初始化MinIO插件。配置:{}", PluginUtils.toJSONString(minioConfig));
LogUtils.info("开始初始化MinIO插件");
// 创建 MinioClient 客户端
client = MinioClient.builder()
.endpoint(minioConfig.get(ENDPOINT).toString())

View File

@ -206,7 +206,7 @@ public class ApiTestCaseController {
@Operation(summary = "接口测试-接口管理-接口用例-获取执行历史")
@RequiresPermissions(logical = Logical.OR, value = {PermissionConstants.PROJECT_API_DEFINITION_CASE_READ, PermissionConstants.PROJECT_API_DEFINITION_CASE_UPDATE})
@CheckOwner(resourceId = "#request.getId()", resourceType = "api_test_case")
public Pager<List<ApiCaseReportDTO>> getExecuteList(@Validated @RequestBody ApiCaseExecutePageRequest request) {
public Pager<List<ExecuteReportDTO>> getExecuteList(@Validated @RequestBody ExecutePageRequest request) {
Page<Object> page = PageHelper.startPage(request.getCurrent(), request.getPageSize(),
StringUtils.isNotBlank(request.getSortString()) ? request.getSortString() : "start_time desc");
return PageUtils.setPageInfo(page, apiTestCaseService.getExecuteList(request));

View File

@ -4,12 +4,16 @@ import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import io.metersphere.api.constants.ApiResource;
import io.metersphere.api.domain.ApiScenario;
import io.metersphere.api.dto.definition.ExecutePageRequest;
import io.metersphere.api.dto.definition.ExecuteReportDTO;
import io.metersphere.api.dto.scenario.*;
import io.metersphere.api.service.ApiValidateService;
import io.metersphere.api.service.scenario.ApiScenarioLogService;
import io.metersphere.api.service.scenario.ApiScenarioNoticeService;
import io.metersphere.api.service.scenario.ApiScenarioService;
import io.metersphere.sdk.constants.PermissionConstants;
import io.metersphere.system.dto.OperationHistoryDTO;
import io.metersphere.system.dto.request.OperationHistoryRequest;
import io.metersphere.system.dto.sdk.request.PosRequest;
import io.metersphere.system.log.annotation.Log;
import io.metersphere.system.log.constants.OperationLogType;
@ -208,5 +212,24 @@ public class ApiScenarioController {
apiScenarioService.editPos(request);
}
@PostMapping("/execute/page")
@Operation(summary = "接口测试-接口场景管理-场景-获取执行历史")
@RequiresPermissions(logical = Logical.OR, value = {PermissionConstants.PROJECT_API_SCENARIO_READ, PermissionConstants.PROJECT_API_SCENARIO_UPDATE})
@CheckOwner(resourceId = "#request.getId()", resourceType = "api_scenario")
public Pager<List<ExecuteReportDTO>> getExecuteList(@Validated @RequestBody ExecutePageRequest request) {
Page<Object> page = PageHelper.startPage(request.getCurrent(), request.getPageSize(),
StringUtils.isNotBlank(request.getSortString()) ? request.getSortString() : "start_time desc");
return PageUtils.setPageInfo(page, apiScenarioService.getExecuteList(request));
}
@PostMapping("/operation-history/page")
@Operation(summary = "接口测试-接口场景管理-场景-接口变更历史")
@RequiresPermissions(logical = Logical.OR, value = {PermissionConstants.PROJECT_API_SCENARIO_READ, PermissionConstants.PROJECT_API_SCENARIO_UPDATE})
@CheckOwner(resourceId = "#request.getSourceId()", resourceType = "api_scenario")
public Pager<List<OperationHistoryDTO>> operationHistoryList(@Validated @RequestBody OperationHistoryRequest request) {
Page<Object> page = PageHelper.startPage(request.getCurrent(), request.getPageSize(),
StringUtils.isNotBlank(request.getSortString()) ? request.getSortString() : "create_time desc");
return PageUtils.setPageInfo(page, apiScenarioService.operationHistoryList(request));
}
}

View File

@ -12,12 +12,12 @@ import java.io.Serializable;
@Data
@EqualsAndHashCode(callSuper = false)
public class ApiCaseExecutePageRequest extends BasePageRequest implements Serializable {
public class ExecutePageRequest extends BasePageRequest implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@Schema(description = "用例pk")
@Schema(description = "用例id/场景id")
@NotBlank(message = "{api_test_case.id.not_blank}")
@Size(min = 1, max = 50, message = "{api_test_case.id.length_range}")
private String id;

View File

@ -6,7 +6,7 @@ import lombok.Data;
import java.io.Serializable;
@Data
public class ApiCaseReportDTO implements Serializable {
public class ExecuteReportDTO implements Serializable {
@Schema(description = "接口报告pk")
private String id;

View File

@ -23,10 +23,12 @@ public class DebugListener {
LogUtils.info("接收到执行结果:{}", record.key());
if (ObjectUtils.isNotEmpty(record.value()) && WebSocketUtils.has(record.key().toString())) {
SocketMsgDTO dto = JSON.parseObject(record.value(), SocketMsgDTO.class);
LogUtils.info("{} 推送执行结果类型【 {} 】", record.key(), dto.getMsgType());
WebSocketUtils.sendMessageSingle(dto);
}
} catch (Exception e) {
LogUtils.error("调试消息推送失败:{}", e);
LogUtils.error("{} 调试消息推送失败:{}", record.key(), e);
}
}
}

View File

@ -1,6 +1,8 @@
package io.metersphere.api.mapper;
import io.metersphere.api.domain.ApiScenario;
import io.metersphere.api.dto.definition.ExecutePageRequest;
import io.metersphere.api.dto.definition.ExecuteReportDTO;
import io.metersphere.api.dto.scenario.*;
import io.metersphere.dto.TestCaseProviderDTO;
import io.metersphere.project.dto.ModuleCountDTO;
@ -40,4 +42,5 @@ public interface ExtApiScenarioMapper {
Long getLastPosEdit(@Param("projectId") String projectId, @Param("basePos") Long basePos);
List<ExecuteReportDTO> getExecuteList(@Param("request") ExecutePageRequest request);
}

View File

@ -444,4 +444,47 @@
</if>
order by `pos` desc limit 1;
</select>
<select id="getExecuteList" resultType="io.metersphere.api.dto.definition.ExecuteReportDTO">
select
api_scenario_report.id,
api_scenario_report.name,
api_scenario_report.status,
api_scenario_report.start_time,
api_scenario_report.create_user,
api_scenario_report.trigger_mode,
api_scenario_report.test_plan_id
from api_scenario_report
left join api_scenario_record t1 on t1.api_scenario_report_id = api_scenario_report.id
where
<if test="request.id != null and request.id != ''">
t1.api_scenario_id = #{request.id}
</if>
<include refid="report_filters">
<property name="filter" value="request.filter"/>
</include>
</select>
<sql id="report_filters">
<if test="${filter} != null and ${filter}.size() > 0">
<foreach collection="${filter}.entrySet()" index="key" item="values">
<if test="values != null and values.size() > 0">
<choose>
<when test="key=='integrated'">
and api_scenario_report.integrated in
<include refid="io.metersphere.system.mapper.BaseMapper.filterInWrapper"/>
</when>
<when test="key=='status'">
and api_scenario_report.status in
<include refid="io.metersphere.system.mapper.BaseMapper.filterInWrapper"/>
</when>
<when test="key=='triggerMode'">
and api_scenario_report.trigger_mode in
<include refid="io.metersphere.system.mapper.BaseMapper.filterInWrapper"/>
</when>
</choose>
</if>
</foreach>
</if>
</sql>
</mapper>

View File

@ -10,12 +10,10 @@ import io.metersphere.request.AssociateOtherCaseRequest;
import io.metersphere.request.TestCasePageProviderRequest;
import io.metersphere.system.dto.sdk.BaseTreeNode;
import io.metersphere.system.dto.sdk.OptionDTO;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
* @author jianxing
@ -59,7 +57,7 @@ public interface ExtApiTestCaseMapper {
List<ApiTestCase> getTagsByIds(@Param("ids") List<String> ids, @Param("deleted") boolean deleted);
List<ApiCaseReportDTO> getExecuteList(@Param("request") ApiCaseExecutePageRequest request);
List<ExecuteReportDTO> getExecuteList(@Param("request") ExecutePageRequest request);
List<OptionDTO> selectVersionOptionByIds(@Param("ids") List<String> ids);

View File

@ -229,7 +229,7 @@
#{id}
</foreach>
</select>
<select id="getExecuteList" resultType="io.metersphere.api.dto.definition.ApiCaseReportDTO">
<select id="getExecuteList" resultType="io.metersphere.api.dto.definition.ExecuteReportDTO">
select
api_report.id,
api_report.name,

View File

@ -2,10 +2,7 @@ package io.metersphere.api.service.definition;
import io.metersphere.api.domain.*;
import io.metersphere.api.dto.definition.*;
import io.metersphere.api.mapper.ApiReportDetailMapper;
import io.metersphere.api.mapper.ApiReportMapper;
import io.metersphere.api.mapper.ApiReportStepMapper;
import io.metersphere.api.mapper.ExtApiReportMapper;
import io.metersphere.api.mapper.*;
import io.metersphere.api.utils.ApiDataUtils;
import io.metersphere.sdk.dto.api.result.RequestResult;
import io.metersphere.sdk.exception.MSException;
@ -47,17 +44,23 @@ public class ApiReportService {
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
public void insertApiReport(List<ApiReport> reports) {
public void insertApiReport(List<ApiReport> reports, List<ApiTestCaseRecord> records) {
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
if (CollectionUtils.isNotEmpty(reports)) {
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
ApiReportMapper reportMapper = sqlSession.getMapper(ApiReportMapper.class);
SubListUtils.dealForSubList(reports, 1000, subList -> {
subList.forEach(reportMapper::insertSelective);
});
sqlSession.flushStatements();
if (sqlSessionFactory != null) {
SqlSessionUtils.closeSqlSession(sqlSession, sqlSessionFactory);
}
}
if (CollectionUtils.isNotEmpty(records)) {
ApiTestCaseRecordMapper detailMapper = sqlSession.getMapper(ApiTestCaseRecordMapper.class);
SubListUtils.dealForSubList(records, 1000, subList -> {
subList.forEach(detailMapper::insertSelective);
});
}
sqlSession.flushStatements();
if (sqlSessionFactory != null) {
SqlSessionUtils.closeSqlSession(sqlSession, sqlSessionFactory);
}
}

View File

@ -560,8 +560,8 @@ public class ApiTestCaseService {
return apiTestCaseBlobMapper.selectByExampleWithBLOBs(example);
}
public List<ApiCaseReportDTO> getExecuteList(ApiCaseExecutePageRequest request) {
List<ApiCaseReportDTO> executeList = extApiTestCaseMapper.getExecuteList(request);
public List<ExecuteReportDTO> getExecuteList(ExecutePageRequest request) {
List<ExecuteReportDTO> executeList = extApiTestCaseMapper.getExecuteList(request);
if (CollectionUtils.isEmpty(executeList)) {
return new ArrayList<>();
}

View File

@ -6,10 +6,7 @@ import io.metersphere.api.dto.definition.ApiReportPageRequest;
import io.metersphere.api.dto.scenario.ApiScenarioReportDTO;
import io.metersphere.api.dto.scenario.ApiScenarioReportDetailDTO;
import io.metersphere.api.dto.scenario.ApiScenarioReportStepDTO;
import io.metersphere.api.mapper.ApiScenarioReportDetailMapper;
import io.metersphere.api.mapper.ApiScenarioReportMapper;
import io.metersphere.api.mapper.ApiScenarioReportStepMapper;
import io.metersphere.api.mapper.ExtApiScenarioReportMapper;
import io.metersphere.api.mapper.*;
import io.metersphere.api.utils.ApiDataUtils;
import io.metersphere.sdk.dto.api.result.RequestResult;
import io.metersphere.sdk.exception.MSException;
@ -50,17 +47,23 @@ public class ApiScenarioReportService {
private ApiScenarioReportDetailMapper apiScenarioReportDetailMapper;
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
public void insertApiScenarioReport(List<ApiScenarioReport> reports) {
public void insertApiScenarioReport(List<ApiScenarioReport> reports, List<ApiScenarioRecord> records) {
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
if (CollectionUtils.isNotEmpty(reports)) {
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
ApiScenarioReportMapper reportMapper = sqlSession.getMapper(ApiScenarioReportMapper.class);
SubListUtils.dealForSubList(reports, 1000, subList -> {
subList.forEach(reportMapper::insertSelective);
});
sqlSession.flushStatements();
if (sqlSessionFactory != null) {
SqlSessionUtils.closeSqlSession(sqlSession, sqlSessionFactory);
}
}
if (CollectionUtils.isNotEmpty(records)) {
ApiScenarioRecordMapper detailMapper = sqlSession.getMapper(ApiScenarioRecordMapper.class);
SubListUtils.dealForSubList(records, 1000, subList -> {
subList.forEach(detailMapper::insertSelective);
});
}
sqlSession.flushStatements();
if (sqlSessionFactory != null) {
SqlSessionUtils.closeSqlSession(sqlSession, sqlSessionFactory);
}
}

View File

@ -7,6 +7,8 @@ import io.metersphere.api.domain.*;
import io.metersphere.api.dto.*;
import io.metersphere.api.dto.debug.ApiFileResourceUpdateRequest;
import io.metersphere.api.dto.debug.ApiResourceRunRequest;
import io.metersphere.api.dto.definition.ExecutePageRequest;
import io.metersphere.api.dto.definition.ExecuteReportDTO;
import io.metersphere.api.dto.request.MsScenario;
import io.metersphere.api.dto.request.http.MsHTTPElement;
import io.metersphere.api.dto.response.ApiScenarioBatchOperationResponse;
@ -54,6 +56,8 @@ import io.metersphere.sdk.util.*;
import io.metersphere.system.domain.Schedule;
import io.metersphere.system.domain.ScheduleExample;
import io.metersphere.system.dto.LogInsertModule;
import io.metersphere.system.dto.OperationHistoryDTO;
import io.metersphere.system.dto.request.OperationHistoryRequest;
import io.metersphere.system.dto.request.ScheduleConfig;
import io.metersphere.system.dto.sdk.request.PosRequest;
import io.metersphere.system.log.constants.OperationLogModule;
@ -61,6 +65,7 @@ import io.metersphere.system.log.constants.OperationLogType;
import io.metersphere.system.mapper.ScheduleMapper;
import io.metersphere.system.schedule.ScheduleService;
import io.metersphere.system.service.ApiPluginService;
import io.metersphere.system.service.OperationHistoryService;
import io.metersphere.system.service.UserLoginService;
import io.metersphere.system.uid.IDGenerator;
import io.metersphere.system.uid.NumGenerator;
@ -86,11 +91,11 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static io.metersphere.api.controller.result.ApiResultCode.API_SCENARIO_EXIST;
@Service
@ -169,12 +174,16 @@ public class ApiScenarioService {
@Resource
private ApiDefinitionModuleService apiDefinitionModuleService;
@Resource
private OperationHistoryService operationHistoryService;
@Resource
private ApiCommonService apiCommonService;
public static final String PRIORITY = "Priority";
public static final String STATUS = "Status";
public static final String TAGS = "Tags";
public static final String ENVIRONMENT = "Environment";
private static final String SCENARIO_TABLE = "api_scenario";
public List<ApiScenarioDTO> getScenarioPage(ApiScenarioPageRequest request) {
@ -2057,6 +2066,28 @@ public class ApiScenarioService {
apiScenarioMapper::updateByPrimaryKeySelective);
}
public List<ExecuteReportDTO> getExecuteList(ExecutePageRequest request) {
List<ExecuteReportDTO> executeList = extApiScenarioMapper.getExecuteList(request);
if (CollectionUtils.isEmpty(executeList)) {
return new ArrayList<>();
}
Set<String> userSet = executeList.stream()
.flatMap(apiReport -> Stream.of(apiReport.getCreateUser()))
.collect(Collectors.toSet());
Map<String, String> userMap = userLoginService.getUserNameMap(new ArrayList<>(userSet));
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
executeList.forEach(apiReport -> {
apiReport.setOperationUser(userMap.get(apiReport.getCreateUser()));
Date date = new Date(apiReport.getStartTime());
apiReport.setNum(sdf.format(date));
});
return executeList;
}
public List<OperationHistoryDTO> operationHistoryList(OperationHistoryRequest request) {
return operationHistoryService.listWidthTable(request, SCENARIO_TABLE);
}
public void handleFileAssociationUpgrade(FileAssociation originFileAssociation, FileMetadata newFileMetadata) {
// 查询有步骤详情的请求类型的步骤
List<String> stepIds = extApiScenarioStepMapper.getHasBlobRequestStepIds(originFileAssociation.getSourceId());
@ -2085,4 +2116,4 @@ public class ApiScenarioService {
}
}
}
}
}

View File

@ -4,6 +4,7 @@ import io.metersphere.api.constants.ShareInfoType;
import io.metersphere.api.domain.ApiReport;
import io.metersphere.api.domain.ApiReportDetail;
import io.metersphere.api.domain.ApiReportStep;
import io.metersphere.api.domain.ApiTestCaseRecord;
import io.metersphere.api.dto.definition.ApiReportBatchRequest;
import io.metersphere.api.dto.definition.ApiReportDTO;
import io.metersphere.api.dto.definition.ApiReportDetailDTO;
@ -72,6 +73,7 @@ public class ApiReportControllerTests extends BaseTest {
@Order(1)
public void testInsert() {
List<ApiReport> reports = new ArrayList<>();
List<ApiTestCaseRecord> records = new ArrayList<>();
for (int i = 0; i < 2515; i++) {
ApiReport apiReport = new ApiReport();
apiReport.setId("api-report-id" + i);
@ -92,8 +94,12 @@ public class ApiReportControllerTests extends BaseTest {
apiReport.setTriggerMode("api-trigger-mode" + i);
apiReport.setVersionId("api-version-id" + i);
reports.add(apiReport);
ApiTestCaseRecord record = new ApiTestCaseRecord();
record.setApiTestCaseId("api-resource-id" + i);
record.setApiReportId(apiReport.getId());
records.add(record);
}
apiReportService.insertApiReport(reports);
apiReportService.insertApiReport(reports, records);
List<ApiReportStep> steps = new ArrayList<>();
for (int i = 0; i < 1515; i++) {
@ -240,7 +246,10 @@ public class ApiReportControllerTests extends BaseTest {
apiReport.setTriggerMode("api-trigger-mode");
apiReport.setVersionId("api-version-id");
reports.add(apiReport);
apiReportService.insertApiReport(reports);
ApiTestCaseRecord record = new ApiTestCaseRecord();
record.setApiTestCaseId("api-resource-id");
record.setApiReportId(apiReport.getId());
apiReportService.insertApiReport(reports, List.of(record));
List<ApiReportStep> steps = new ArrayList<>();
for (int i = 0; i < 5; i++) {
ApiReportStep apiReportStep = new ApiReportStep();
@ -294,7 +303,7 @@ public class ApiReportControllerTests extends BaseTest {
List<ApiReportDetailDTO> data = ApiDataUtils.parseArray(JSON.toJSONString(parseResponse(mvcResult).get("data")), ApiReportDetailDTO.class);
Assertions.assertNotNull(data);
mockMvc.perform(getRequestBuilder(DETAIL + "test"))
mockMvc.perform(getRequestBuilder(DETAIL + "test" + "/test"))
.andExpect(content().contentType(MediaType.APPLICATION_JSON))
.andExpect(status().is5xxServerError());

View File

@ -1,9 +1,6 @@
package io.metersphere.api.controller;
import io.metersphere.api.domain.ApiReport;
import io.metersphere.api.domain.ApiScenario;
import io.metersphere.api.domain.ApiScenarioReport;
import io.metersphere.api.domain.ApiTestCase;
import io.metersphere.api.domain.*;
import io.metersphere.api.mapper.ApiScenarioMapper;
import io.metersphere.api.mapper.ApiTestCaseMapper;
import io.metersphere.api.service.ApiReportSendNoticeService;
@ -78,6 +75,7 @@ public class ApiReportSendNoticeTests extends BaseTest {
apiTestCaseMapper.insert(apiTestCase);
List<ApiReport> reports = new ArrayList<>();
List<ApiTestCaseRecord> records = new ArrayList<>();
for (int i = 0; i < 3; i++) {
ApiReport apiReport = new ApiReport();
apiReport.setId("send-api-case-report-id" + i);
@ -100,8 +98,12 @@ public class ApiReportSendNoticeTests extends BaseTest {
apiReport.setTriggerMode("api-trigger-mode" + i);
apiReport.setVersionId("api-version-id" + i);
reports.add(apiReport);
ApiTestCaseRecord record = new ApiTestCaseRecord();
record.setApiTestCaseId("send-api-resource-id" + i);
record.setApiReportId(apiReport.getId());
records.add(record);
}
apiReportService.insertApiReport(reports);
apiReportService.insertApiReport(reports, records);
ApiNoticeDTO noticeDTO = new ApiNoticeDTO();
noticeDTO.setReportId("send-api-case-report-id0");
noticeDTO.setReportStatus(ApiReportStatus.SUCCESS.name());
@ -140,6 +142,7 @@ public class ApiReportSendNoticeTests extends BaseTest {
apiScenarioMapper.insertSelective(apiScenario);
List<ApiScenarioReport> scenarioReports = new ArrayList<>();
List<ApiScenarioRecord> scenarioRecords = new ArrayList<>();
for (int i = 0; i < 3; i++) {
ApiScenarioReport scenarioReport = new ApiScenarioReport();
scenarioReport.setId("send-scenario-report-id" + i);
@ -162,8 +165,12 @@ public class ApiReportSendNoticeTests extends BaseTest {
scenarioReport.setTriggerMode("api-trigger-mode" + i);
scenarioReport.setVersionId("api-version-id" + i);
scenarioReports.add(scenarioReport);
ApiScenarioRecord record = new ApiScenarioRecord();
record.setApiScenarioId("send-scenario-id" + i);
record.setApiScenarioReportId(scenarioReport.getId());
scenarioRecords.add(record);
}
apiScenarioReportService.insertApiScenarioReport(scenarioReports);
apiScenarioReportService.insertApiScenarioReport(scenarioReports, scenarioRecords);
noticeDTO = new ApiNoticeDTO();

View File

@ -5,9 +5,7 @@ import io.metersphere.api.domain.*;
import io.metersphere.api.dto.ApiFile;
import io.metersphere.api.dto.assertion.MsAssertionConfig;
import io.metersphere.api.dto.debug.ModuleCreateRequest;
import io.metersphere.api.dto.definition.ApiDefinitionAddRequest;
import io.metersphere.api.dto.definition.ApiTestCaseAddRequest;
import io.metersphere.api.dto.definition.HttpResponse;
import io.metersphere.api.dto.definition.*;
import io.metersphere.api.dto.request.http.Header;
import io.metersphere.api.dto.request.http.MsHTTPElement;
import io.metersphere.api.dto.request.http.QueryParam;
@ -23,6 +21,7 @@ import io.metersphere.api.service.BaseResourcePoolTestService;
import io.metersphere.api.service.definition.ApiDefinitionModuleService;
import io.metersphere.api.service.definition.ApiDefinitionService;
import io.metersphere.api.service.definition.ApiTestCaseService;
import io.metersphere.api.service.scenario.ApiScenarioReportService;
import io.metersphere.api.service.scenario.ApiScenarioService;
import io.metersphere.api.utils.ApiDataUtils;
import io.metersphere.plugin.api.spi.AbstractMsTestElement;
@ -31,6 +30,7 @@ import io.metersphere.project.api.assertion.MsResponseCodeAssertion;
import io.metersphere.project.api.assertion.MsScriptAssertion;
import io.metersphere.project.api.processor.MsProcessor;
import io.metersphere.project.api.processor.SQLProcessor;
import io.metersphere.project.domain.ProjectVersion;
import io.metersphere.project.dto.environment.EnvironmentConfig;
import io.metersphere.project.dto.environment.EnvironmentGroupProjectDTO;
import io.metersphere.project.dto.environment.EnvironmentGroupRequest;
@ -43,6 +43,7 @@ import io.metersphere.project.dto.environment.processors.EnvRequestScriptProcess
import io.metersphere.project.dto.environment.processors.EnvScenarioScriptProcessor;
import io.metersphere.project.dto.filemanagement.request.FileUploadRequest;
import io.metersphere.project.mapper.ExtBaseProjectVersionMapper;
import io.metersphere.project.mapper.ProjectVersionMapper;
import io.metersphere.project.service.EnvironmentGroupService;
import io.metersphere.project.service.EnvironmentService;
import io.metersphere.project.service.FileMetadataService;
@ -61,10 +62,13 @@ import io.metersphere.system.base.BaseTest;
import io.metersphere.system.controller.handler.ResultHolder;
import io.metersphere.system.domain.Plugin;
import io.metersphere.system.domain.Schedule;
import io.metersphere.system.dto.OperationHistoryDTO;
import io.metersphere.system.dto.request.OperationHistoryRequest;
import io.metersphere.system.dto.request.PluginUpdateRequest;
import io.metersphere.system.dto.sdk.request.PosRequest;
import io.metersphere.system.log.constants.OperationLogType;
import io.metersphere.system.mapper.ScheduleMapper;
import io.metersphere.system.service.OperationHistoryService;
import io.metersphere.system.service.PluginService;
import io.metersphere.system.uid.IDGenerator;
import io.metersphere.system.uid.NumGenerator;
@ -80,6 +84,7 @@ import org.springframework.http.MediaType;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.ResultMatcher;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import java.io.File;
import java.io.FileInputStream;
@ -90,6 +95,7 @@ import java.util.stream.Collectors;
import static io.metersphere.api.controller.result.ApiResultCode.API_SCENARIO_EXIST;
import static io.metersphere.sdk.constants.InternalUserRole.ADMIN;
import static io.metersphere.system.controller.handler.result.MsHttpResultCode.NOT_FOUND;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ -162,9 +168,16 @@ public class ApiScenarioControllerTests extends BaseTest {
@Resource
private ApiDefinitionModuleService apiDefinitionModuleService;
@Resource
private ApiScenarioReportService apiScenarioReportService;
@Resource
private ProjectVersionMapper projectVersionMapper;
@Resource
private OperationHistoryService operationHistoryService;
@Resource
private BaseFileManagementTestService baseFileManagementTestService;
@Resource
private ApiCommonService apiCommonService;
private static String fileMetadataId;
private static String localFileId;
private static ApiScenario addApiScenario;
@ -2194,6 +2207,125 @@ public class ApiScenarioControllerTests extends BaseTest {
}
@Test
@Order(10)
public void testExecuteList() throws Exception {
ApiScenario first = apiScenarioMapper.selectByExample(new ApiScenarioExample()).getFirst();
List<ApiScenarioReport> reports = new ArrayList<>();
List<ApiScenarioRecord> records = new ArrayList<>();
for (int i = 0; i < 10; i++) {
ApiScenarioReport apiReport = new ApiScenarioReport();
apiReport.setId(IDGenerator.nextStr());
apiReport.setProjectId(DEFAULT_PROJECT_ID);
apiReport.setName("api-scenario-name" + i);
apiReport.setStartTime(System.currentTimeMillis());
apiReport.setCreateUser("admin");
apiReport.setUpdateUser("admin");
apiReport.setUpdateTime(System.currentTimeMillis());
apiReport.setPoolId("api-pool-id" + i);
apiReport.setEnvironmentId("api-environment-id" + i);
apiReport.setRunMode("api-run-mode" + i);
if (i % 2 == 0) {
apiReport.setStatus(ApiReportStatus.SUCCESS.name());
} else {
apiReport.setStatus(ApiReportStatus.ERROR.name());
}
apiReport.setTriggerMode("api-trigger-mode" + i);
apiReport.setVersionId("api-version-id" + i);
reports.add(apiReport);
ApiScenarioRecord record = new ApiScenarioRecord();
record.setApiScenarioId(first.getId());
record.setApiScenarioReportId(apiReport.getId());
records.add(record);
}
apiScenarioReportService.insertApiScenarioReport(reports, records);
ExecutePageRequest request = new ExecutePageRequest();
request.setId(first.getId());
request.setPageSize(10);
request.setCurrent(1);
MvcResult mvcResult = responsePost(BASE_PATH + "execute/page", request);
Pager<?> returnPager = parseObjectFromMvcResult(mvcResult, Pager.class);
//返回值不为空
Assertions.assertNotNull(returnPager);
request.setFilter(new HashMap<>() {{
put("status", List.of(ApiReportStatus.SUCCESS.name()));
}});
request.setSort(new HashMap<>() {{
put("startTime", "desc");
}});
mvcResult = responsePost(BASE_PATH + "execute/page", request);
returnPager = parseObjectFromMvcResult(mvcResult, Pager.class);
//返回值不为空
Assertions.assertNotNull(returnPager);
Assertions.assertTrue(((List<ApiReport>) returnPager.getList()).size() <= request.getPageSize());
List<ExecuteReportDTO> reportDTOS = JSON.parseArray(JSON.toJSONString(returnPager.getList()), ExecuteReportDTO.class);
reportDTOS.forEach(apiReport -> {
Assertions.assertEquals(apiReport.getStatus(), ApiReportStatus.SUCCESS.name());
});
request.setId("data-is-null");
responsePost(BASE_PATH + "execute/page", request);
}
public static <T> T parseObjectFromMvcResult(MvcResult mvcResult, Class<T> parseClass) {
try {
String returnData = mvcResult.getResponse().getContentAsString(StandardCharsets.UTF_8);
ResultHolder resultHolder = JSON.parseObject(returnData, ResultHolder.class);
//返回请求正常
Assertions.assertNotNull(resultHolder);
return JSON.parseObject(JSON.toJSONString(resultHolder.getData()), parseClass);
} catch (Exception ignore) {
}
return null;
}
private MvcResult responsePost(String url, Object param) throws Exception {
return mockMvc.perform(MockMvcRequestBuilders.post(url)
.header(SessionConstants.HEADER_TOKEN, sessionId)
.header(SessionConstants.CSRF_TOKEN, csrfToken)
.content(JSON.toJSONString(param))
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON)).andReturn();
}
@Test
@Order(11)
public void testGetHistory() throws Exception {
ApiScenario first = apiScenarioMapper.selectByExample(new ApiScenarioExample()).getFirst();
OperationHistoryRequest request = new OperationHistoryRequest();
request.setProjectId(DEFAULT_PROJECT_ID);
request.setSourceId(first.getId());
request.setPageSize(10);
request.setCurrent(1);
projectVersionMapper.deleteByPrimaryKey("1.0");
ProjectVersion version = new ProjectVersion();
version.setId("1.0");
version.setName("1.0");
version.setProjectId(DEFAULT_PROJECT_ID);
version.setCreateTime(System.currentTimeMillis());
version.setLatest(true);
version.setCreateUser("admin");
projectVersionMapper.insertSelective(version);
MvcResult mvcResult = responsePost(BASE_PATH + "operation-history/page", request);
Pager<?> returnPager = parseObjectFromMvcResult(mvcResult, Pager.class);
//返回值不为空
Assertions.assertNotNull(returnPager);
List<OperationHistoryDTO> reportDTOS = JSON.parseArray(JSON.toJSONString(returnPager.getList()), OperationHistoryDTO.class);
reportDTOS.forEach(reportDTO -> Assertions.assertEquals(reportDTO.getSourceId(), first.getId()));
request = new OperationHistoryRequest();
request.setProjectId(DEFAULT_PROJECT_ID);
request.setSourceId("data-is-null");
request.setPageSize(10);
request.setCurrent(1);
request.setSort(new HashMap<>() {{
put("createTime", "desc");
}});
responsePost(BASE_PATH + "operation-history/page", request);
}
@Test
@Order(35)
public void testGetSystemRequest() throws Exception {

View File

@ -1,10 +1,7 @@
package io.metersphere.api.controller;
import io.metersphere.api.constants.ShareInfoType;
import io.metersphere.api.domain.ApiReport;
import io.metersphere.api.domain.ApiScenarioReport;
import io.metersphere.api.domain.ApiScenarioReportDetail;
import io.metersphere.api.domain.ApiScenarioReportStep;
import io.metersphere.api.domain.*;
import io.metersphere.api.dto.definition.ApiReportBatchRequest;
import io.metersphere.api.dto.definition.ApiReportPageRequest;
import io.metersphere.api.dto.scenario.ApiScenarioDTO;
@ -71,6 +68,7 @@ public class ApiScenarioReportControllerTests extends BaseTest {
@Order(1)
public void testInsert() {
List<ApiScenarioReport> reports = new ArrayList<>();
List<ApiScenarioRecord> records = new ArrayList<>();
for (int i = 0; i < 2515; i++) {
ApiScenarioReport scenarioReport = new ApiScenarioReport();
scenarioReport.setId("scenario-report-id" + i);
@ -91,8 +89,12 @@ public class ApiScenarioReportControllerTests extends BaseTest {
scenarioReport.setTriggerMode("api-trigger-mode" + i);
scenarioReport.setVersionId("api-version-id" + i);
reports.add(scenarioReport);
ApiScenarioRecord apiScenarioRecord = new ApiScenarioRecord();
apiScenarioRecord.setApiScenarioId("scenario-record-id" + i);
apiScenarioRecord.setApiScenarioReportId(scenarioReport.getId());
records.add(apiScenarioRecord);
}
apiScenarioReportService.insertApiScenarioReport(reports);
apiScenarioReportService.insertApiScenarioReport(reports, records);
List<ApiScenarioReportStep> steps = new ArrayList<>();
for (int i = 0; i < 1515; i++) {
@ -239,7 +241,10 @@ public class ApiScenarioReportControllerTests extends BaseTest {
scenarioReport.setTriggerMode("api-trigger-mode");
scenarioReport.setVersionId("api-version-id");
reports.add(scenarioReport);
apiScenarioReportService.insertApiScenarioReport(reports);
ApiScenarioRecord apiScenarioRecord = new ApiScenarioRecord();
apiScenarioRecord.setApiScenarioId("test-scenario-record-id");
apiScenarioRecord.setApiScenarioReportId(scenarioReport.getId());
apiScenarioReportService.insertApiScenarioReport(reports, List.of(apiScenarioRecord));
List<ApiScenarioReportStep> steps = new ArrayList<>();
for (int i = 0; i < 20; i++) {
ApiScenarioReportStep apiScenarioReportStep = new ApiScenarioReportStep();
@ -299,7 +304,7 @@ public class ApiScenarioReportControllerTests extends BaseTest {
List<ApiScenarioReportDTO> data = ApiDataUtils.parseArray(JSON.toJSONString(parseResponse(mvcResult).get("data")), ApiScenarioReportDTO.class);
Assertions.assertNotNull(data);
mockMvc.perform(getRequestBuilder(DETAIL + "test"))
mockMvc.perform(getRequestBuilder(DETAIL + "test" + "/" + "test"))
.andExpect(content().contentType(MediaType.APPLICATION_JSON))
.andExpect(status().is5xxServerError());
@ -349,9 +354,7 @@ public class ApiScenarioReportControllerTests extends BaseTest {
mockMvc.perform(getRequestBuilder(GET + shareId + "/" + "test-scenario-report-id"))
.andExpect(content().contentType(MediaType.APPLICATION_JSON))
.andExpect(status().is5xxServerError());
//TODO 过期的校验 未完成 需要补充
//项目当前设置了分享时间 并且没有过期
shareInfo = new ShareInfo();
shareInfo.setCustomData("test-scenario-report-id".getBytes());

View File

@ -1,7 +1,9 @@
package io.metersphere.api.controller;
import io.metersphere.api.domain.ApiReport;
import io.metersphere.api.domain.ApiScenarioRecord;
import io.metersphere.api.domain.ApiScenarioReport;
import io.metersphere.api.domain.ApiTestCaseRecord;
import io.metersphere.api.service.BaseResourcePoolTestService;
import io.metersphere.api.service.definition.ApiReportService;
import io.metersphere.api.service.scenario.ApiScenarioReportService;
@ -226,6 +228,7 @@ public class ApiTaskCenterControllerTests extends BaseTest {
public void testInsertData() {
List<ApiReport> reports = new ArrayList<>();
List<ApiTestCaseRecord> records = new ArrayList<>();
for (int i = 0; i < 10; i++) {
ApiReport apiReport = new ApiReport();
apiReport.setId("task-report-id" + i);
@ -246,10 +249,15 @@ public class ApiTaskCenterControllerTests extends BaseTest {
apiReport.setTriggerMode("task-MANUAL");
apiReport.setVersionId("api-version-id" + i);
reports.add(apiReport);
ApiTestCaseRecord record = new ApiTestCaseRecord();
record.setApiTestCaseId("task-api-resource-id" + i);
record.setApiReportId(apiReport.getId());
records.add(record);
}
apiReportService.insertApiReport(reports);
apiReportService.insertApiReport(reports, records);
List<ApiScenarioReport> scenarioReports = new ArrayList<>();
List<ApiScenarioRecord> scenarioRecords = new ArrayList<>();
for (int i = 0; i < 10; i++) {
ApiScenarioReport scenarioReport = new ApiScenarioReport();
scenarioReport.setId("task-report-id" + i);
@ -270,8 +278,12 @@ public class ApiTaskCenterControllerTests extends BaseTest {
scenarioReport.setTriggerMode("task-MANUAL");
scenarioReport.setVersionId("api-version-id" + i);
scenarioReports.add(scenarioReport);
ApiScenarioRecord scenarioRecord = new ApiScenarioRecord();
scenarioRecord.setApiScenarioId("task-api-resource-id" + i);
scenarioRecord.setApiScenarioReportId(scenarioReport.getId());
scenarioRecords.add(scenarioRecord);
}
apiScenarioReportService.insertApiScenarioReport(scenarioReports);
apiScenarioReportService.insertApiScenarioReport(scenarioReports, scenarioRecords);
TestResourcePoolDTO testResourcePool = new TestResourcePoolDTO();
testResourcePool.setId("api-pool-id");

View File

@ -624,9 +624,8 @@ public class ApiTestCaseControllerTests extends BaseTest {
record.setApiReportId(apiReport.getId());
records.add(record);
}
apiTestCaseRecordMapper.batchInsert(records);
apiReportService.insertApiReport(reports);
ApiCaseExecutePageRequest request = new ApiCaseExecutePageRequest();
apiReportService.insertApiReport(reports, records);
ExecutePageRequest request = new ExecutePageRequest();
request.setId(first.getId());
request.setPageSize(10);
request.setCurrent(1);
@ -642,7 +641,7 @@ public class ApiTestCaseControllerTests extends BaseTest {
//返回值不为空
Assertions.assertNotNull(returnPager);
Assertions.assertTrue(((List<ApiReport>) returnPager.getList()).size() <= request.getPageSize());
List<ApiCaseReportDTO> reportDTOS = JSON.parseArray(JSON.toJSONString(returnPager.getList()), ApiCaseReportDTO.class);
List<ExecuteReportDTO> reportDTOS = JSON.parseArray(JSON.toJSONString(returnPager.getList()), ExecuteReportDTO.class);
reportDTOS.forEach(apiReport -> {
Assertions.assertEquals(apiReport.getStatus(), ApiReportStatus.SUCCESS.name());
});
@ -849,6 +848,7 @@ public class ApiTestCaseControllerTests extends BaseTest {
request.setSourceId(first.getId());
request.setPageSize(10);
request.setCurrent(1);
projectVersionMapper.deleteByPrimaryKey("1.0");
ProjectVersion version = new ProjectVersion();
version.setId("1.0");
version.setName("1.0");

View File

@ -235,6 +235,7 @@ public class CleanupApiTests {
private void initReportData(String projectId) {
List<ApiReport> reports = new ArrayList<>();
List<ApiTestCaseRecord> records = new ArrayList<>();
for (int i = 0; i < 2515; i++) {
ApiReport apiReport = new ApiReport();
apiReport.setId("clean-report-id" + projectId + i);
@ -255,8 +256,12 @@ public class CleanupApiTests {
apiReport.setTriggerMode("api-trigger-mode" + i);
apiReport.setVersionId("api-version-id" + i);
reports.add(apiReport);
ApiTestCaseRecord record = new ApiTestCaseRecord();
record.setApiTestCaseId("clean-resource-id" + i);
record.setApiReportId(apiReport.getId());
records.add(record);
}
apiReportService.insertApiReport(reports);
apiReportService.insertApiReport(reports, records);
List<ApiReportStep> steps = new ArrayList<>();
for (int i = 0; i < 1515; i++) {
ApiReportStep apiReportStep = new ApiReportStep();
@ -269,6 +274,7 @@ public class CleanupApiTests {
apiReportService.insertApiReportStep(steps);
List<ApiScenarioReport> scenarioReports = new ArrayList<>();
List<ApiScenarioRecord> scenarioRecords = new ArrayList<>();
for (int i = 0; i < 2515; i++) {
ApiScenarioReport scenarioReport = new ApiScenarioReport();
scenarioReport.setId("clean-scenario-report-id" + projectId + i);
@ -289,8 +295,12 @@ public class CleanupApiTests {
scenarioReport.setTriggerMode("api-trigger-mode" + i);
scenarioReport.setVersionId("api-version-id" + i);
scenarioReports.add(scenarioReport);
ApiScenarioRecord record = new ApiScenarioRecord();
record.setApiScenarioId("clean-scenario-id" + i);
record.setApiScenarioReportId(scenarioReport.getId());
scenarioRecords.add(record);
}
apiScenarioReportService.insertApiScenarioReport(scenarioReports);
apiScenarioReportService.insertApiScenarioReport(scenarioReports, scenarioRecords);
List<ApiScenarioReportStep> scenarioReportSteps = new ArrayList<>();
for (int i = 0; i < 1515; i++) {