370774330@qq.com 5 лет назад
Родитель
Сommit
d0b161da0a

+ 117 - 0
web/src/main/java/seecoder/devcloud/web/controller/project/TestCaseController.java

@@ -0,0 +1,117 @@
+package seecoder.devcloud.web.controller.project;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import seecoder.devcloud.web.model.vo.Response;
+import seecoder.devcloud.web.model.vo.project.TestCaseVO;
+import seecoder.devcloud.web.model.vo.project.TestStepVO;
+import seecoder.devcloud.web.service.project.TestCaseService;
+
+import java.util.List;
+
+/**
+ * @author PuHong Weng
+ * @date 2021/4/10
+ * @description:
+ */
+@Api(tags = "测试用例相关 API")
+@RestController
+@RequestMapping("/test_cases")
+public class TestCaseController {
+
+    private final TestCaseService testCaseService;
+
+    @Autowired
+    public TestCaseController(TestCaseService testCaseService) {
+        this.testCaseService = testCaseService;
+    }
+
+    @ApiOperation(value = "获取项目的测试用例列表", httpMethod = "GET")
+    @ApiImplicitParam(name = "projectId",dataType ="int", paramType = "query")
+    @GetMapping
+    public Response<List<TestCaseVO>> getTestCases(@RequestParam("projectId") Integer projectId){
+        return Response.buildSuccess(testCaseService.getTestCases(projectId));
+    }
+
+    @GetMapping("/steps")
+    @ApiOperation(value = "获取测试用例的步骤列表", httpMethod = "GET")
+    @ApiImplicitParam(name = "testCaseId",dataType ="int", paramType = "query")
+    public Response<List<TestStepVO>> getTestSteps(@RequestParam("testCaseId")Integer testCaseId){
+        return Response.buildSuccess(testCaseService.getTestSteps(testCaseId));
+    }
+
+
+
+    @ApiOperation(value = "创建一个测试用例", httpMethod = "POST")
+    @PostMapping
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "projectId",dataType ="int", paramType = "query"),
+            @ApiImplicitParam(name = "title",dataType ="string", paramType = "query")
+    })
+    public Response createTestCase(@RequestParam("projectId") Integer projectId,@RequestParam("title") String title){
+        testCaseService.createTestCase(projectId, title);
+        return Response.buildSuccess();
+    }
+
+    @ApiOperation(value = "更新测试用例标题", httpMethod = "PUT")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "testCaseId",dataType ="int", paramType = "query"),
+            @ApiImplicitParam(name = "title",dataType ="string", paramType = "query")
+    })
+    @PutMapping
+    public Response updateTestCaseTitle(@RequestParam("testCaseId") Integer testCaseId,@RequestParam("title") String title){
+        testCaseService.updateTestCaseTitle(testCaseId, title);
+        return Response.buildSuccess();
+    }
+
+    @ApiOperation(value = "更新测试用例测试状态", httpMethod = "PUT")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "testCaseId",dataType ="int", paramType = "query"),
+            @ApiImplicitParam(name = "pass",dataType ="boolean", paramType = "query")
+    })
+    @PutMapping("/pass")
+    public Response updateTestCaseState(@RequestParam("testCaseId") Integer testCaseId,@RequestParam("pass") Boolean pass){
+        testCaseService.updateTestCaseState(testCaseId, pass);
+        return Response.buildSuccess();
+    }
+
+    @ApiOperation(value = "删除测试用例", httpMethod = "DELETE")
+    @ApiImplicitParam(name = "testCaseId",dataType ="int", paramType = "query")
+    @DeleteMapping
+    public Response deleteTestCase(@RequestParam("testCaseId") Integer testCaseId){
+        testCaseService.deleteTestCase(testCaseId);
+        return Response.buildSuccess();
+    }
+
+    @ApiOperation(value = "创建空的测试用例步骤", httpMethod = "POST")
+    @ApiImplicitParam(name = "testCaseId",dataType ="int", paramType = "query")
+    @PostMapping("/steps")
+    public Response createEmptyTestStep(@RequestParam("testCaseId") Integer testCaseId){
+        testCaseService.createEmptyTestStep(testCaseId);
+        return Response.buildSuccess();
+    }
+
+
+    @ApiOperation(value = "更新测试用例步骤内容", httpMethod = "PUT")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "testStepId",dataType ="int", paramType = "query"),
+            @ApiImplicitParam(name = "description",dataType ="string", paramType = "query")
+    })
+    @PutMapping("/steps")
+    public Response updateTestStepDescription(@RequestParam("testStepId") Integer testStepId, @RequestParam("description") String description){
+        testCaseService.updateTestStepDescription(testStepId, description);
+        return Response.buildSuccess();
+    }
+
+    @ApiOperation(value = "删除测试用例步骤", httpMethod = "DELETE")
+    @ApiImplicitParam(name = "testStepId",dataType ="int", paramType = "query")
+    @DeleteMapping("/steps")
+    public Response deleteTestStep(@RequestParam("testStepId") Integer testStepId){
+        testCaseService.deleteTestStep(testStepId);
+        return Response.buildSuccess();
+    }
+}

+ 30 - 0
web/src/main/java/seecoder/devcloud/web/dao/project/TestCaseMapper.java

@@ -0,0 +1,30 @@
+package seecoder.devcloud.web.dao.project;
+
+import org.apache.ibatis.annotations.*;
+import org.springframework.stereotype.Repository;
+import seecoder.devcloud.web.dao.provider.GeneralInsertUpdateSqlProvider;
+import seecoder.devcloud.web.model.po.project.TestCasePO;
+
+import java.util.List;
+
+/**
+ * @author PuHong Weng
+ * @date 2021/4/10
+ * @description:
+ */
+@Repository
+public interface TestCaseMapper {
+
+    @InsertProvider(type = GeneralInsertUpdateSqlProvider.class, method = "insert")
+    @Options(useGeneratedKeys = true, keyProperty = "param1.id", keyColumn = "id")
+    int insert(TestCasePO testCasePO, String... ignoredCols);
+
+    @UpdateProvider(type= GeneralInsertUpdateSqlProvider.class, method="updateById")
+    int update(TestCasePO testCasePO);
+
+    @Delete("delete from test_case where id = #{id}")
+    int delete(Integer id);
+
+    @Select("select * from test_case where project_id = #{projectId}")
+    List<TestCasePO> selectByProjectId(Integer projectId);
+}

+ 30 - 0
web/src/main/java/seecoder/devcloud/web/dao/project/TestStepMapper.java

@@ -0,0 +1,30 @@
+package seecoder.devcloud.web.dao.project;
+
+import org.apache.ibatis.annotations.*;
+import org.springframework.stereotype.Repository;
+import seecoder.devcloud.web.dao.provider.GeneralInsertUpdateSqlProvider;
+import seecoder.devcloud.web.model.po.project.TestStepPO;
+
+import java.util.List;
+
+/**
+ * @author PuHong Weng
+ * @date 2021/4/10
+ * @description:
+ */
+@Repository
+public interface TestStepMapper {
+
+    @InsertProvider(type = GeneralInsertUpdateSqlProvider.class, method = "insert")
+    @Options(useGeneratedKeys = true, keyProperty = "param1.id", keyColumn = "id")
+    int insert(TestStepPO testStepPO, String... ignoredCols);
+
+    @UpdateProvider(type= GeneralInsertUpdateSqlProvider.class, method="updateById")
+    int update(TestStepPO testStepPO);
+
+    @Delete("delete from test_step where id = #{id}")
+    int delete(Integer id);
+
+    @Select("select * from test_step where test_case_id = #{testCaseId}")
+    List<TestStepPO> selectByProjectId(Integer testCaseId);
+}

+ 30 - 0
web/src/main/java/seecoder/devcloud/web/model/po/project/TestCasePO.java

@@ -0,0 +1,30 @@
+package seecoder.devcloud.web.model.po.project;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author PuHong Weng
+ * @date 2021/4/10
+ * @description:
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class TestCasePO {
+
+    Integer id;
+
+    Integer projectId;
+
+    String title;
+
+    /**
+     * 代表这个测试用例是否通过
+     */
+    Boolean pass;
+
+}

+ 24 - 0
web/src/main/java/seecoder/devcloud/web/model/po/project/TestStepPO.java

@@ -0,0 +1,24 @@
+package seecoder.devcloud.web.model.po.project;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author PuHong Weng
+ * @date 2021/4/10
+ * @description:
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class TestStepPO {
+
+    Integer id;
+
+    Integer testCaseId;
+
+    String description;
+}

+ 3 - 0
web/src/main/java/seecoder/devcloud/web/model/po/tree/TreeNodePO.java

@@ -14,6 +14,9 @@ import seecoder.devcloud.web.model.enums.PriorityEnum;
 @AllArgsConstructor
 @AllArgsConstructor
 @NoArgsConstructor
 @NoArgsConstructor
 @EqualsAndHashCode
 @EqualsAndHashCode
+/**
+ * 需求节点
+ */
 public class TreeNodePO {
 public class TreeNodePO {
     private int id;
     private int id;
     private String title;
     private String title;

+ 39 - 0
web/src/main/java/seecoder/devcloud/web/model/vo/project/TestCaseVO.java

@@ -0,0 +1,39 @@
+package seecoder.devcloud.web.model.vo.project;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import seecoder.devcloud.web.model.po.project.TestCasePO;
+
+/**
+ * @author PuHong Weng
+ * @date 2021/4/10
+ * @description:
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@ApiModel
+public class TestCaseVO {
+
+    @ApiModelProperty("id")
+    Integer id;
+
+    @ApiModelProperty("所属项目id")
+    Integer projectId;
+
+    @ApiModelProperty("测试用例标题")
+    String title;
+
+    @ApiModelProperty("代表这个测试用例是否通过")
+    Boolean pass;
+
+    public TestCaseVO(TestCasePO po) {
+        BeanUtils.copyProperties(po,this);
+    }
+}

+ 28 - 0
web/src/main/java/seecoder/devcloud/web/model/vo/project/TestStepVO.java

@@ -0,0 +1,28 @@
+package seecoder.devcloud.web.model.vo.project;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author PuHong Weng
+ * @date 2021/4/10
+ * @description:
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class TestStepVO {
+
+    @ApiModelProperty("id")
+    Integer id;
+
+    @ApiModelProperty("所属测试用例id")
+    Integer testCaseId;
+
+    @ApiModelProperty("步骤描述")
+    String description;
+}

+ 87 - 0
web/src/main/java/seecoder/devcloud/web/service/impl/project/TestCaseServiceImpl.java

@@ -0,0 +1,87 @@
+package seecoder.devcloud.web.service.impl.project;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import seecoder.devcloud.web.dao.project.TestCaseMapper;
+import seecoder.devcloud.web.dao.project.TestStepMapper;
+import seecoder.devcloud.web.model.po.project.TestCasePO;
+import seecoder.devcloud.web.model.po.project.TestStepPO;
+import seecoder.devcloud.web.model.vo.project.TestCaseVO;
+import seecoder.devcloud.web.model.vo.project.TestStepVO;
+import seecoder.devcloud.web.service.project.TestCaseService;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author PuHong Weng
+ * @date 2021/4/10
+ * @description:
+ */
+@Service
+public class TestCaseServiceImpl implements TestCaseService {
+
+    private final TestCaseMapper testCaseMapper;
+
+    private final TestStepMapper testStepMapper;
+
+    @Autowired
+    public TestCaseServiceImpl(TestCaseMapper testCaseMapper, TestStepMapper testStepMapper) {
+        this.testCaseMapper = testCaseMapper;
+        this.testStepMapper = testStepMapper;
+    }
+
+    @Override
+    public List<TestCaseVO> getTestCases(Integer projectId) {
+        return testCaseMapper.selectByProjectId(projectId).stream()
+                .map(TestCaseVO::new).collect(Collectors.toList());
+    }
+
+    @Override
+    public List<TestStepVO> getTestSteps(Integer testCaseId) {
+        return null;
+    }
+
+    @Override
+    @Transactional
+    public void createTestCase(Integer projectId, String title) {
+        testCaseMapper.insert(TestCasePO.builder().projectId(projectId).title(title).build());
+    }
+
+    @Override
+    @Transactional
+    public void updateTestCaseTitle(Integer testCaseId, String title) {
+        testCaseMapper.update(TestCasePO.builder().id(testCaseId).title(title).build());
+    }
+
+    @Override
+    @Transactional
+    public void updateTestCaseState(Integer testCaseId, Boolean pass) {
+        testCaseMapper.update(TestCasePO.builder().id(testCaseId).pass(pass).build());
+    }
+
+    @Override
+    @Transactional
+    public void deleteTestCase(Integer testCaseId) {
+        testCaseMapper.delete(testCaseId);
+    }
+
+    @Override
+    @Transactional
+    public void createEmptyTestStep(Integer testCaseId) {
+        testStepMapper.insert(TestStepPO.builder().description("").testCaseId(testCaseId).build());
+    }
+
+    @Override
+    @Transactional
+    public void updateTestStepDescription(Integer testStepId, String description) {
+        testStepMapper.insert(TestStepPO.builder().description(description).id(testStepId).build());
+    }
+
+    @Override
+    @Transactional
+    public void deleteTestStep(Integer testStepId) {
+        testStepMapper.delete(testStepId);
+    }
+}

+ 33 - 0
web/src/main/java/seecoder/devcloud/web/service/project/TestCaseService.java

@@ -0,0 +1,33 @@
+package seecoder.devcloud.web.service.project;
+
+import seecoder.devcloud.web.model.vo.project.TestCaseVO;
+import seecoder.devcloud.web.model.vo.project.TestStepVO;
+
+import java.util.List;
+
+/**
+ * @author PuHong Weng
+ * @date 2021/4/10
+ * @description:
+ */
+public interface TestCaseService {
+
+    List<TestCaseVO> getTestCases(Integer projectId);
+
+    List<TestStepVO> getTestSteps(Integer testCaseId);
+
+    void createTestCase(Integer projectId, String title);
+
+    void updateTestCaseTitle(Integer testCaseId, String title);
+
+    void updateTestCaseState(Integer testCaseId, Boolean pass);
+
+    void deleteTestCase(Integer testCaseId);
+
+    void createEmptyTestStep(Integer testCaseId);
+
+    void updateTestStepDescription(Integer testStepId, String description);
+
+    void deleteTestStep(Integer testStepId);
+
+}