1
0
Просмотр исходного кода

feat: 接口测试创建、获取、删除api完成

zhaoxingrui 5 лет назад
Родитель
Сommit
301885e5d4

+ 33 - 5
web/src/main/java/seecoder/devcloud/web/controller/APITest/APITestController.java

@@ -1,9 +1,16 @@
 package seecoder.devcloud.web.controller.APITest;
 package seecoder.devcloud.web.controller.APITest;
 
 
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
-import seecoder.devcloud.web.model.po.APITest.APITestBody;
+import seecoder.devcloud.web.model.vo.APITest.APITestBodyVO;
+import seecoder.devcloud.web.model.vo.APITest.APITestInfoVO;
+import seecoder.devcloud.web.model.vo.Response;
+import seecoder.devcloud.web.service.APITest.APITestService;
+
+import java.util.List;
 
 
 /**
 /**
  * @Author zxr
  * @Author zxr
@@ -14,11 +21,32 @@ import seecoder.devcloud.web.model.po.APITest.APITestBody;
 @RequestMapping("/test")
 @RequestMapping("/test")
 public class APITestController {
 public class APITestController {
 
 
+    private final APITestService apiTestService;
+
+    @Autowired
+    public APITestController(APITestService apiTestService) {
+        this.apiTestService = apiTestService;
+    }
+
     @GetMapping("/create")
     @GetMapping("/create")
-    @ApiOperation(value = "创建一个新的测试任务", httpMethod = "GET")
-    public void test() {
-//        System.out.println(apiTestBody.getUrl());
+    @ApiOperation(value = "创建一个新的测试任务", httpMethod = "POST")
+    public Response createAPITestMission(@RequestBody APITestBodyVO apiTestBodyVO) {
+        apiTestService.createAPITest(apiTestBodyVO);
+        return Response.buildSuccess();
+    }
+
+    @GetMapping("/list/{projectId}")
+    @ApiOperation(value = "获取指定项目的所有测试任务", httpMethod = "GET")
+    @ApiImplicitParam(name = "projectId", dataType ="int",paramType = "query")
+    public Response<List<APITestInfoVO>> getAPITestInfosByProjectId(@PathVariable("projectId") Integer projectId) {
+        return Response.buildSuccess(apiTestService.getAPITestsByProjectId(projectId));
+    }
 
 
-        System.out.println("测试");
+    @GetMapping("/delete/{testId}")
+    @ApiOperation(value = "删除指定测试任务", httpMethod = "DELETE")
+    @ApiImplicitParam(name = "testId", dataType = "int", paramType = "query")
+    public Response deleteAPITestInfoByTestId(@PathVariable("testId") Integer testId) {
+        apiTestService.deleteAPITest(testId);
+        return Response.buildSuccess();
     }
     }
 }
 }

+ 26 - 0
web/src/main/java/seecoder/devcloud/web/dao/APITest/APITestMapper.java

@@ -0,0 +1,26 @@
+package seecoder.devcloud.web.dao.APITest;
+
+import org.apache.ibatis.annotations.*;
+import seecoder.devcloud.web.dao.provider.GeneralInsertUpdateSqlProvider;
+import seecoder.devcloud.web.model.po.APITest.APITest;
+
+import java.util.List;
+
+/**
+ * @author zhaoxingrui
+ * @date 2021/3/20
+ * @description:
+ */
+@Mapper
+public interface APITestMapper {
+
+    @InsertProvider(type = GeneralInsertUpdateSqlProvider.class, method = "insert")
+    @Options(useGeneratedKeys = true, keyProperty = "param1.testId")
+    boolean insert(APITest apiTest, String... ignoredCols);
+
+    @Select("select * from api_test where project_id = #{id}")
+    List<APITest> selectByProjectId(Integer id);
+
+    @Delete("delete from api_test where test_id = #{id}")
+    boolean delete(Integer id);
+}

+ 1 - 0
web/src/main/java/seecoder/devcloud/web/dao/pipeline/PipelineMapper.java

@@ -19,6 +19,7 @@ public interface PipelineMapper {
     @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
     @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
     boolean insert(Pipeline pipeline, String... ignoredCols);
     boolean insert(Pipeline pipeline, String... ignoredCols);
 
 
+
     @Select("select * from pipeline where id = #{id}")
     @Select("select * from pipeline where id = #{id}")
     Pipeline selectById(Integer id);
     Pipeline selectById(Integer id);
 
 

+ 36 - 0
web/src/main/java/seecoder/devcloud/web/model/po/APITest/APITest.java

@@ -0,0 +1,36 @@
+package seecoder.devcloud.web.model.po.APITest;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.sql.Timestamp;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author zhaoxingrui
+ * @date 2021/3/20
+ * @description:
+ */
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class APITest {
+    private Integer testId;
+    private String testName;
+    private Integer projectId;
+    private Timestamp createTime;
+    private String username;
+    private String url;
+    private String params;
+    private Integer qps;
+    private String state;
+    private Timestamp executeTime;
+    private Integer success;
+    private Integer failure;
+    private String timeList;
+}

+ 4 - 3
web/src/main/java/seecoder/devcloud/web/model/po/APITest/APITestBody.java

@@ -16,9 +16,10 @@ import java.util.Map;
 @NoArgsConstructor
 @NoArgsConstructor
 @AllArgsConstructor
 @AllArgsConstructor
 public class APITestBody {
 public class APITestBody {
-    private Integer testId;
-    private String testName;
+    private Integer projectId;
+    private Timestamp createTime;
+    private String username;
     private String url;
     private String url;
-    private Map<String, String> params;
+    private Map<String, Object> params;
     private Integer qps;
     private Integer qps;
 }
 }

+ 11 - 31
web/src/main/java/seecoder/devcloud/web/model/po/APITest/APITestInfo.java

@@ -1,10 +1,13 @@
 package seecoder.devcloud.web.model.po.APITest;
 package seecoder.devcloud.web.model.po.APITest;
 
 
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
+import lombok.Builder;
 import lombok.Data;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.NoArgsConstructor;
 
 
 import java.sql.Timestamp;
 import java.sql.Timestamp;
+import java.util.List;
+import java.util.Map;
 
 
 /**
 /**
  * @author zhaoxingrui
  * @author zhaoxingrui
@@ -14,42 +17,19 @@ import java.sql.Timestamp;
 @Data
 @Data
 @NoArgsConstructor
 @NoArgsConstructor
 @AllArgsConstructor
 @AllArgsConstructor
+@Builder
 public class APITestInfo {
 public class APITestInfo {
-    /**
-     * 测试 id
-     */
     private Integer testId;
     private Integer testId;
-
-    /**
-     * 测试名称
-     */
     private String testName;
     private String testName;
-
-    /**
-     * 测试任务状态
-     */
-    private String state;
-
-    /**
-     * 测试任务创建时间
-     */
+    private Integer projectId;
     private Timestamp createTime;
     private Timestamp createTime;
-
-    /**
-     * 测试任务创建者
-     */
     private String username;
     private String username;
-
-    /**
-     * 测试并发数
-     */
+    private String url;
+    private Map<String, Object> params;
     private Integer qps;
     private Integer qps;
-
-    /**
-     * 测试任务执行时间
-     */
+    private String state;
     private Timestamp executeTime;
     private Timestamp executeTime;
-
-    //todo 测试结果还没想好定义为什么格式
-
+    private Integer success;
+    private Integer failure;
+    private List<Integer> timeList;
 }
 }

+ 10 - 3
web/src/main/java/seecoder/devcloud/web/model/vo/APITest/APITestBodyVO.java

@@ -8,6 +8,7 @@ import lombok.NoArgsConstructor;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.BeanUtils;
 import seecoder.devcloud.web.model.po.APITest.APITestBody;
 import seecoder.devcloud.web.model.po.APITest.APITestBody;
 
 
+import java.sql.Timestamp;
 import java.util.Map;
 import java.util.Map;
 
 
 /**
 /**
@@ -21,17 +22,23 @@ import java.util.Map;
 @ApiModel("新建测试任务@")
 @ApiModel("新建测试任务@")
 public class APITestBodyVO {
 public class APITestBodyVO {
 
 
-    @ApiModelProperty("测试id")
-    private Integer testId;
+    @ApiModelProperty("测试任务所属的project Id")
+    private Integer projectId;
 
 
     @ApiModelProperty("测试名称")
     @ApiModelProperty("测试名称")
     private String testName;
     private String testName;
 
 
+    @ApiModelProperty("测试创建时间")
+    private Timestamp createTime;
+
+    @ApiModelProperty("测试创建者")
+    private String username;
+
     @ApiModelProperty("测试url")
     @ApiModelProperty("测试url")
     private String url;
     private String url;
 
 
     @ApiModelProperty("测试url中可能携带的参数")
     @ApiModelProperty("测试url中可能携带的参数")
-    private Map<String, String> params;
+    private Map<String, Object> params;
 
 
     @ApiModelProperty("测试并发数")
     @ApiModelProperty("测试并发数")
     private Integer qps;
     private Integer qps;

+ 42 - 0
web/src/main/java/seecoder/devcloud/web/model/vo/APITest/APITestInfoVO.java

@@ -5,6 +5,12 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.NoArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import seecoder.devcloud.web.model.po.APITest.APITestInfo;
+
+import java.sql.Timestamp;
+import java.util.List;
+import java.util.Map;
 
 
 /**
 /**
  * @author zhaoxingrui
  * @author zhaoxingrui
@@ -23,4 +29,40 @@ public class APITestInfoVO {
     @ApiModelProperty("测试名称")
     @ApiModelProperty("测试名称")
     private String testName;
     private String testName;
 
 
+    @ApiModelProperty("测试所属项目")
+    private Integer projectId;
+
+    @ApiModelProperty("创建时间")
+    private Timestamp createTime;
+
+    @ApiModelProperty("创建者")
+    private String username;
+
+    @ApiModelProperty("测试url")
+    private String url;
+
+    @ApiModelProperty("测试可能携带的参数")
+    private Map<String, Object> params;
+
+    @ApiModelProperty("测试并发数")
+    private Integer qps;
+
+    @ApiModelProperty("测试任务状态")
+    private String state;
+
+    @ApiModelProperty("测试执行时间")
+    private Timestamp executeTime;
+
+    @ApiModelProperty("测试成功次数")
+    private Integer success;
+
+    @ApiModelProperty("测试失败次数")
+    private Integer failure;
+
+    @ApiModelProperty("测试结果list")
+    private List<Integer> timeList;
+
+    public APITestInfoVO(APITestInfo apiTestInfo) {
+        BeanUtils.copyProperties(apiTestInfo, this);
+    }
 }
 }

+ 65 - 0
web/src/main/java/seecoder/devcloud/web/model/vo/APITest/APITestVO.java

@@ -0,0 +1,65 @@
+package seecoder.devcloud.web.model.vo.APITest;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import seecoder.devcloud.web.model.po.APITest.APITest;
+
+import java.sql.Timestamp;
+
+/**
+ * @author zhaoxingrui
+ * @date: 2021/3/20
+ * @description:
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor@ApiModel("测试任务在mysql数据库中的类型")
+public class APITestVO {
+    @ApiModelProperty("测试id")
+    private Integer testId;
+
+    @ApiModelProperty("测试名称")
+    private String testName;
+
+    @ApiModelProperty("测试所属项目")
+    private Integer projectId;
+
+    @ApiModelProperty("创建时间")
+    private Timestamp createTime;
+
+    @ApiModelProperty("创建者")
+    private String username;
+
+    @ApiModelProperty("测试url")
+    private String url;
+
+    @ApiModelProperty("测试可能携带的参数")
+    private String params;
+
+    @ApiModelProperty("测试并发数")
+    private Integer qps;
+
+    @ApiModelProperty("测试任务状态")
+    private String state;
+
+    @ApiModelProperty("测试执行时间")
+    private Timestamp executeTime;
+
+    @ApiModelProperty("测试成功次数")
+    private Integer success;
+
+    @ApiModelProperty("测试失败次数")
+    private Integer failure;
+
+    @ApiModelProperty("测试结果list")
+    private String timeList;
+
+    public APITestVO(APITest apiTest) {
+        BeanUtils.copyProperties(apiTest, this);
+    }
+
+}

+ 30 - 0
web/src/main/java/seecoder/devcloud/web/service/APITest/APITestService.java

@@ -1,4 +1,34 @@
 package seecoder.devcloud.web.service.APITest;
 package seecoder.devcloud.web.service.APITest;
 
 
+import seecoder.devcloud.web.model.vo.APITest.APITestBodyVO;
+import seecoder.devcloud.web.model.vo.APITest.APITestInfoVO;
+
+import java.util.List;
+
+/**
+ * @author zhaoxingrui
+ * @date 2021/3/19
+ * @description: 接口测试相关的service
+ */
 public interface APITestService {
 public interface APITestService {
+    /**
+     * 新建一个接口测试任务
+     */
+    void createAPITest(APITestBodyVO apiTestBodyVO);
+
+    /**
+     * 获取指定项目的所有测试任务
+     */
+    List<APITestInfoVO> getAPITestsByProjectId(Integer projectId);
+
+    /**
+     * 删除指定测试任务
+     */
+    void deleteAPITest(Integer projectId);
+
+//    /**
+//     * 运行指定测试任务
+//     */
+//    APITestBodyVO executeAPITest(Integer projectId);
+//
 }
 }

+ 104 - 1
web/src/main/java/seecoder/devcloud/web/service/impl/APITest/APITestServiceImpl.java

@@ -1,4 +1,107 @@
 package seecoder.devcloud.web.service.impl.APITest;
 package seecoder.devcloud.web.service.impl.APITest;
 
 
-public class APITestServiceImpl {
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import seecoder.devcloud.web.dao.APITest.APITestMapper;
+import seecoder.devcloud.web.model.po.APITest.APITestInfo;
+import seecoder.devcloud.web.model.po.APITest.APITest;
+import seecoder.devcloud.web.model.vo.APITest.APITestBodyVO;
+import seecoder.devcloud.web.model.vo.APITest.APITestInfoVO;
+import seecoder.devcloud.web.service.APITest.APITestService;
+
+import java.util.*;
+
+@Service
+public class APITestServiceImpl implements APITestService {
+
+    @Autowired
+    private APITestMapper apiTestMapper;
+
+
+    @Override
+    public void createAPITest(APITestBodyVO apiTestBodyVO) {
+        APITest apiTest = APITest.builder()
+             .testName(apiTestBodyVO.getTestName())
+             .projectId(apiTestBodyVO.getProjectId())
+             .createTime(apiTestBodyVO.getCreateTime())
+             .username(apiTestBodyVO.getUsername())
+             .url(apiTestBodyVO.getUrl())
+             .params("{}")
+             .qps(apiTestBodyVO.getQps())
+             .state("进行中")
+             .success(0)
+             .failure(0)
+             .timeList("")
+             .build();
+        apiTestMapper.insert(apiTest);
+    }
+
+    @Override
+    public void deleteAPITest(Integer projectId) {
+        apiTestMapper.delete(projectId);
+    }
+    @Override
+    public List<APITestInfoVO> getAPITestsByProjectId(Integer projectId) {
+        List<APITest> apiTestInfoVOs = apiTestMapper.selectByProjectId(projectId);
+        List<APITestInfoVO> apiTestInfoVOList = new ArrayList<>();
+        for (APITest apiTest : apiTestInfoVOs) {
+            apiTestInfoVOList.add(new APITestInfoVO(transform(apiTest)));
+        }
+        return apiTestInfoVOList;
+    }
+
+    // 将数据库中读取的 APITestInfoMysql 转为 APITestInfo
+    public APITestInfo transform(APITest apiTest) {
+        APITestInfo apiTestInfo = new APITestInfo();
+        apiTestInfo.setTestId(apiTest.getTestId());
+        apiTestInfo.setTestName(apiTest.getTestName());
+        apiTestInfo.setProjectId(apiTest.getProjectId());
+        apiTestInfo.setCreateTime(apiTest.getCreateTime());
+        apiTestInfo.setUsername(apiTest.getUsername());
+        apiTestInfo.setUrl(apiTest.getUrl());
+        apiTestInfo.setParams(parseJson2Map(apiTest.getParams()));
+        apiTestInfo.setQps(apiTest.getQps());
+        apiTestInfo.setState(apiTest.getState());
+        apiTestInfo.setExecuteTime(apiTest.getExecuteTime());
+        apiTestInfo.setSuccess(apiTest.getSuccess());
+        apiTestInfo.setFailure(apiTest.getFailure());
+        apiTestInfo.setTimeList(splitTimeList(apiTest.getTimeList()));
+        return apiTestInfo;
+    }
+
+    // 将JSON格式的字符串转为 Map类型
+    public Map<String, Object> parseJson2Map(String str) {
+        Map<String, Object> map = new HashMap<String, Object>();
+        JSONObject json = JSONObject.fromObject(str);
+        for (Object k:json.keySet()) {
+            Object v = json.get(k);
+            if (v instanceof JSONArray) {
+                List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
+                Iterator<JSONObject> it = ((JSONArray)v).iterator();
+                while (it.hasNext()) {
+                    JSONObject json2 = it.next();
+                    list.add(parseJson2Map(json2.toString()));
+                }
+                map.put(k.toString(), list);
+            } else {
+                map.put(k.toString(), v);
+            }
+        }
+        return map;
+    }
+
+    // 分隔字符串
+    public List<Integer> splitTimeList(String time) {
+        List<Integer> timeList = new ArrayList<Integer>();
+        if (time.length() == 0) {
+            return timeList;
+        }
+        String[] tl = time.split(",");
+        for (String t:tl) {
+            timeList.add(Integer.parseInt(t));
+        }
+        return timeList;
+    }
 }
 }

+ 0 - 0
web/src/main/resources/SQLScripts/apiTest.sql


+ 1 - 1
web/src/main/resources/application-wph.yml

@@ -56,4 +56,4 @@ seecoder:
     password: admin123
     password: admin123
     nexus-server: 192.168.68.79:18081
     nexus-server: 192.168.68.79:18081
     repo-name: sec-repo
     repo-name: sec-repo
-    clean-up-task: 83bb8249-71e8-4367-83b3-50c6f7518860
+    clean-up-task: 83bb8249-71e8-4367-83b3-50c6f7518860