feat(测试计划): 测试计划-用例详情-执行历史
This commit is contained in:
parent
d7257ddee8
commit
f24b54c9e9
|
@ -6,6 +6,7 @@ import io.metersphere.dto.BugProviderDTO;
|
|||
import io.metersphere.plan.constants.TestPlanResourceConfig;
|
||||
import io.metersphere.plan.dto.request.*;
|
||||
import io.metersphere.plan.dto.response.TestPlanAssociationResponse;
|
||||
import io.metersphere.plan.dto.response.TestPlanCaseExecHistoryResponse;
|
||||
import io.metersphere.plan.dto.response.TestPlanCasePageResponse;
|
||||
import io.metersphere.plan.dto.response.TestPlanResourceSortResponse;
|
||||
import io.metersphere.plan.service.TestPlanCaseLogService;
|
||||
|
@ -161,4 +162,12 @@ public class TestPlanFunctionalCaseController {
|
|||
}
|
||||
|
||||
|
||||
@PostMapping("/exec/history")
|
||||
@Operation(summary = "测试计划-计划详情-功能用例-执行历史")
|
||||
@RequiresPermissions(PermissionConstants.TEST_PLAN_READ)
|
||||
@CheckOwner(resourceId = "#request.getTestPlanId()", resourceType = "test_plan")
|
||||
public List<TestPlanCaseExecHistoryResponse> executeHistory(@Validated @RequestBody TestPlanCaseExecHistoryRequest request) {
|
||||
return testPlanFunctionalCaseService.getCaseExecHistory(request);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,30 @@
|
|||
package io.metersphere.plan.dto.request;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author wx
|
||||
*/
|
||||
@Data
|
||||
public class TestPlanCaseExecHistoryRequest implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@Schema(description = "测试计划id",requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotBlank(message = "{test_plan.id.not_blank}")
|
||||
private String testPlanId;
|
||||
|
||||
@Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotBlank(message = "{id.not_blank}")
|
||||
private String id;
|
||||
|
||||
@Schema(description = "用例id")
|
||||
@NotBlank(message = "{case_id.not_blank}")
|
||||
private String caseId;
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
package io.metersphere.plan.dto.response;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author wx
|
||||
*/
|
||||
@Data
|
||||
public class TestPlanCaseExecHistoryResponse implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@Schema(description = "id")
|
||||
private String status;
|
||||
|
||||
@Schema(description = "评论内容")
|
||||
private byte[] content;
|
||||
|
||||
@Schema(description = "评审解析内容")
|
||||
private String contentText;
|
||||
|
||||
@Schema(description = "步骤结果")
|
||||
private String stepsExecResult;
|
||||
|
||||
@Schema(description = "执行人")
|
||||
private String createUser;
|
||||
|
||||
@Schema(description = "执行人姓名")
|
||||
private String userName;
|
||||
|
||||
@Schema(description = "执行人头像")
|
||||
private String userLogo;
|
||||
|
||||
@Schema(description = "执行人邮箱")
|
||||
private String email;
|
||||
|
||||
@Schema(description = "执行时间")
|
||||
private String steps;
|
||||
}
|
|
@ -1,5 +1,7 @@
|
|||
package io.metersphere.plan.mapper;
|
||||
|
||||
import io.metersphere.plan.dto.request.TestPlanCaseExecHistoryRequest;
|
||||
import io.metersphere.plan.dto.response.TestPlanCaseExecHistoryResponse;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.List;
|
||||
|
@ -7,4 +9,6 @@ import java.util.List;
|
|||
public interface ExtTestPlanCaseExecuteHistoryMapper {
|
||||
|
||||
void updateDeleted(@Param("testPlanCaseIds") List<String> testPlanCaseIds, @Param("deleted") boolean deleted);
|
||||
|
||||
List<TestPlanCaseExecHistoryResponse> getCaseExecHistory(@Param("request") TestPlanCaseExecHistoryRequest request);
|
||||
}
|
||||
|
|
|
@ -12,4 +12,25 @@
|
|||
</foreach>
|
||||
</update>
|
||||
|
||||
|
||||
<select id="getCaseExecHistory" resultType="io.metersphere.plan.dto.response.TestPlanCaseExecHistoryResponse">
|
||||
SELECT
|
||||
tpceh.status as status,
|
||||
tpceh.content as content,
|
||||
tpceh.steps as stepsExecResult,
|
||||
tpceh.create_user as createUser,
|
||||
u.name AS userName,
|
||||
ux.avatar AS userLogo,
|
||||
u.email AS email
|
||||
FROM
|
||||
test_plan_case_execute_history tpceh
|
||||
left JOIN user u ON tpceh.create_user = u.id
|
||||
left JOIN user_extend ux ON tpceh.create_user = ux.id
|
||||
WHERE
|
||||
tpceh.test_plan_case_id = #{request.id}
|
||||
AND tpceh.deleted = FALSE
|
||||
ORDER BY
|
||||
tpceh.create_time DESC
|
||||
</select>
|
||||
|
||||
</mapper>
|
|
@ -10,12 +10,14 @@ import io.metersphere.bug.mapper.ExtBugRelateCaseMapper;
|
|||
import io.metersphere.dto.BugProviderDTO;
|
||||
import io.metersphere.functional.constants.CaseFileSourceType;
|
||||
import io.metersphere.functional.domain.FunctionalCase;
|
||||
import io.metersphere.functional.domain.FunctionalCaseBlob;
|
||||
import io.metersphere.functional.domain.FunctionalCaseExample;
|
||||
import io.metersphere.functional.domain.FunctionalCaseModule;
|
||||
import io.metersphere.functional.dto.FunctionalCaseCustomFieldDTO;
|
||||
import io.metersphere.functional.dto.FunctionalCaseModuleCountDTO;
|
||||
import io.metersphere.functional.dto.FunctionalCaseModuleDTO;
|
||||
import io.metersphere.functional.dto.ProjectOptionDTO;
|
||||
import io.metersphere.functional.mapper.FunctionalCaseBlobMapper;
|
||||
import io.metersphere.functional.mapper.FunctionalCaseMapper;
|
||||
import io.metersphere.functional.service.FunctionalCaseAttachmentService;
|
||||
import io.metersphere.functional.service.FunctionalCaseModuleService;
|
||||
|
@ -29,6 +31,7 @@ import io.metersphere.plan.dto.ResourceLogInsertModule;
|
|||
import io.metersphere.plan.dto.TestPlanResourceAssociationParam;
|
||||
import io.metersphere.plan.dto.request.*;
|
||||
import io.metersphere.plan.dto.response.TestPlanAssociationResponse;
|
||||
import io.metersphere.plan.dto.response.TestPlanCaseExecHistoryResponse;
|
||||
import io.metersphere.plan.dto.response.TestPlanCasePageResponse;
|
||||
import io.metersphere.plan.dto.response.TestPlanResourceSortResponse;
|
||||
import io.metersphere.plan.mapper.*;
|
||||
|
@ -69,6 +72,7 @@ import org.springframework.stereotype.Service;
|
|||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
@ -116,6 +120,8 @@ public class TestPlanFunctionalCaseService extends TestPlanResourceService {
|
|||
private FunctionalCaseMapper functionalCaseMapper;
|
||||
@Resource
|
||||
private OperationLogService operationLogService;
|
||||
@Resource
|
||||
private FunctionalCaseBlobMapper functionalCaseBlobMapper;
|
||||
private static final String CASE_MODULE_COUNT_ALL = "all";
|
||||
|
||||
@Override
|
||||
|
@ -398,7 +404,7 @@ public class TestPlanFunctionalCaseService extends TestPlanResourceService {
|
|||
executeHistory.setCaseId(request.getCaseId());
|
||||
executeHistory.setStatus(request.getLastExecResult());
|
||||
executeHistory.setContent(request.getContent().getBytes());
|
||||
executeHistory.setSteps(request.getStepsExecResult().getBytes());
|
||||
executeHistory.setSteps(StringUtils.defaultIfBlank(request.getStepsExecResult(), StringUtils.EMPTY).getBytes(StandardCharsets.UTF_8));
|
||||
executeHistory.setDeleted(false);
|
||||
executeHistory.setNotifier(request.getNotifier());
|
||||
executeHistory.setCreateUser(operator);
|
||||
|
@ -522,4 +528,18 @@ public class TestPlanFunctionalCaseService extends TestPlanResourceService {
|
|||
extTestPlanFunctionalCaseMapper.batchUpdateExecutor(ids, request.getUserId());
|
||||
}
|
||||
}
|
||||
|
||||
public List<TestPlanCaseExecHistoryResponse> getCaseExecHistory(TestPlanCaseExecHistoryRequest request) {
|
||||
FunctionalCaseBlob caseBlob = functionalCaseBlobMapper.selectByPrimaryKey(request.getCaseId());
|
||||
List<TestPlanCaseExecHistoryResponse> list = extTestPlanCaseExecuteHistoryMapper.getCaseExecHistory(request);
|
||||
list.forEach(item -> {
|
||||
if (item.getContent() != null) {
|
||||
item.setContentText(new String(item.getContent(), StandardCharsets.UTF_8));
|
||||
}
|
||||
if (caseBlob.getSteps() != null) {
|
||||
item.setSteps(new String(caseBlob.getSteps(), StandardCharsets.UTF_8));
|
||||
}
|
||||
});
|
||||
return list;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -43,6 +43,7 @@ public class TestPlanCaseControllerTests extends BaseTest {
|
|||
public static final String FUNCTIONAL_CASE_RUN_URL = "/test-plan/functional/case/run";
|
||||
public static final String FUNCTIONAL_CASE_BATCH_RUN_URL = "/test-plan/functional/case/batch/run";
|
||||
public static final String FUNCTIONAL_CASE_BATCH_UPDATE_EXECUTOR_URL = "/test-plan/functional/case/batch/update/executor";
|
||||
public static final String FUNCTIONAL_CASE_EXEC_HISTORY_URL = "/test-plan/functional/case/exec/history";
|
||||
@Resource
|
||||
private TestPlanFunctionalCaseMapper testPlanFunctionalCaseMapper;
|
||||
@Resource
|
||||
|
@ -194,7 +195,6 @@ public class TestPlanCaseControllerTests extends BaseTest {
|
|||
}
|
||||
|
||||
|
||||
|
||||
@Test
|
||||
@Order(12)
|
||||
public void testFunctionalCaseBatchRun() throws Exception {
|
||||
|
@ -228,4 +228,15 @@ public class TestPlanCaseControllerTests extends BaseTest {
|
|||
this.requestPostWithOk(FUNCTIONAL_CASE_BATCH_UPDATE_EXECUTOR_URL, request);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
@Order(14)
|
||||
public void testExecHistory() throws Exception {
|
||||
TestPlanCaseExecHistoryRequest request = new TestPlanCaseExecHistoryRequest();
|
||||
request.setId("relate_case_1");
|
||||
request.setTestPlanId("plan_1");
|
||||
request.setCaseId("fc_1");
|
||||
this.requestPostWithOk(FUNCTIONAL_CASE_EXEC_HISTORY_URL, request);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -43,3 +43,8 @@ VALUES
|
|||
('t_1', '123', '计划模块', 'NONE', 256, 1714124231051, 1714124231051, '728495172886645', '728495172886645');
|
||||
|
||||
|
||||
INSERT INTO `test_plan_case_execute_history`(`id`, `test_plan_case_id`, `case_id`, `status`, `content`, `steps`, `deleted`, `notifier`, `create_user`, `create_time`)
|
||||
VALUES
|
||||
('123445', 'relate_case_1', 'fc_1', 'PASSED', '1234', '2132134', b'0', '', 'admin', 1715828421525);
|
||||
INSERT INTO functional_case_blob(id, steps, text_description, expected_result, prerequisite, description) VALUES ('fc_1', 'STEP', '1111', '', '', 'TEST');
|
||||
|
||||
|
|
Loading…
Reference in New Issue