diff --git a/backend/pom.xml b/backend/pom.xml index edd70316fa..e3a2c2754e 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -541,6 +541,11 @@ + + + + + diff --git a/backend/src/main/java/io/metersphere/api/controller/APITestController.java b/backend/src/main/java/io/metersphere/api/controller/APITestController.java index 5cedaab099..36becbff0b 100644 --- a/backend/src/main/java/io/metersphere/api/controller/APITestController.java +++ b/backend/src/main/java/io/metersphere/api/controller/APITestController.java @@ -15,6 +15,7 @@ import io.metersphere.api.service.*; import io.metersphere.base.domain.ApiTest; import io.metersphere.base.domain.Schedule; import io.metersphere.commons.constants.RoleConstants; +import io.metersphere.commons.constants.ScheduleGroup; import io.metersphere.commons.utils.CronUtils; import io.metersphere.commons.utils.PageUtils; import io.metersphere.commons.utils.Pager; @@ -28,15 +29,13 @@ import io.metersphere.service.ScheduleService; import org.apache.jorphan.collections.HashTree; import org.apache.shiro.authz.annotation.Logical; import org.apache.shiro.authz.annotation.RequiresRoles; +import org.python.core.AstList; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.List; +import java.util.*; import static io.metersphere.commons.utils.JsonPathUtils.getListJson; @@ -345,8 +344,11 @@ public class APITestController { @GetMapping("/runningTask/{projectID}") public List runningTask(@PathVariable String projectID) { - - List resultList = scheduleService.findRunningTaskInfoByProjectID(projectID); + List typeFilter = Arrays.asList( // 首页显示的运行中定时任务,只要这3种,不需要 性能测试、api_test(旧版) + ScheduleGroup.API_SCENARIO_TEST.name(), + ScheduleGroup.SWAGGER_IMPORT.name(), + ScheduleGroup.TEST_PLAN_TEST.name()); + List resultList = scheduleService.findRunningTaskInfoByProjectID(projectID, typeFilter); int dataIndex = 1; for (TaskInfoResult taskInfo : resultList) { diff --git a/backend/src/main/java/io/metersphere/api/controller/ApiDefinitionController.java b/backend/src/main/java/io/metersphere/api/controller/ApiDefinitionController.java index e855bca114..b7e23f8f29 100644 --- a/backend/src/main/java/io/metersphere/api/controller/ApiDefinitionController.java +++ b/backend/src/main/java/io/metersphere/api/controller/ApiDefinitionController.java @@ -30,6 +30,7 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; +import java.net.MalformedURLException; import java.util.Date; import java.util.List; @@ -163,7 +164,7 @@ public class ApiDefinitionController { //定时任务创建 @PostMapping(value = "/schedule/create") - public void createSchedule(@RequestBody ScheduleRequest request) { + public void createSchedule(@RequestBody ScheduleRequest request) throws MalformedURLException { apiDefinitionService.createSchedule(request); } @PostMapping(value = "/schedule/update") diff --git a/backend/src/main/java/io/metersphere/api/dto/datacount/response/TaskInfoResult.java b/backend/src/main/java/io/metersphere/api/dto/datacount/response/TaskInfoResult.java index 6c90913005..ec52e140a4 100644 --- a/backend/src/main/java/io/metersphere/api/dto/datacount/response/TaskInfoResult.java +++ b/backend/src/main/java/io/metersphere/api/dto/datacount/response/TaskInfoResult.java @@ -29,5 +29,7 @@ public class TaskInfoResult { private Long updateTime; //定时任务类型 情景定时任务/范围计划任务 private String taskType; + //定时任务组别 swagger/scenario/testPlan 等 + private String taskGroup; } diff --git a/backend/src/main/java/io/metersphere/api/service/APITestService.java b/backend/src/main/java/io/metersphere/api/service/APITestService.java index e1534ac3ff..659bcef3ba 100644 --- a/backend/src/main/java/io/metersphere/api/service/APITestService.java +++ b/backend/src/main/java/io/metersphere/api/service/APITestService.java @@ -339,6 +339,8 @@ public class APITestService { schedule.setJob(ApiTestJob.class.getName()); schedule.setGroup(ScheduleGroup.API_TEST.name()); schedule.setType(ScheduleType.CRON.name()); + schedule.setProjectId(request.getProjectId()); + schedule.setName(request.getName()); return schedule; } diff --git a/backend/src/main/java/io/metersphere/api/service/ApiAutomationService.java b/backend/src/main/java/io/metersphere/api/service/ApiAutomationService.java index 5329c6919a..ebc994c1c4 100644 --- a/backend/src/main/java/io/metersphere/api/service/ApiAutomationService.java +++ b/backend/src/main/java/io/metersphere/api/service/ApiAutomationService.java @@ -25,10 +25,7 @@ import io.metersphere.base.mapper.ApiScenarioMapper; import io.metersphere.base.mapper.ApiScenarioReportMapper; import io.metersphere.base.mapper.TestCaseReviewScenarioMapper; import io.metersphere.base.mapper.TestPlanApiScenarioMapper; -import io.metersphere.base.mapper.ext.ExtApiScenarioMapper; -import io.metersphere.base.mapper.ext.ExtTestPlanApiCaseMapper; -import io.metersphere.base.mapper.ext.ExtTestPlanMapper; -import io.metersphere.base.mapper.ext.ExtTestPlanScenarioCaseMapper; +import io.metersphere.base.mapper.ext.*; import io.metersphere.commons.constants.*; import io.metersphere.commons.exception.MSException; import io.metersphere.commons.utils.*; @@ -64,6 +61,8 @@ import java.util.stream.Collectors; @Service @Transactional(rollbackFor = Exception.class) public class ApiAutomationService { + @Resource + private ExtScheduleMapper extScheduleMapper; @Resource private ApiScenarioMapper apiScenarioMapper; @Resource @@ -204,6 +203,7 @@ public class ApiAutomationService { final ApiScenarioWithBLOBs scenario = buildSaveScenario(request); apiScenarioMapper.updateByPrimaryKeySelective(scenario); + extScheduleMapper.updateNameByResourceID(request.getId(), request.getName());// 修改场景name,同步到修改首页定时任务 } public ApiScenarioWithBLOBs buildSaveScenario(SaveApiScenarioRequest request) { @@ -753,6 +753,9 @@ public class ApiAutomationService { public void createSchedule(ScheduleRequest request) { Schedule schedule = scheduleService.buildApiTestSchedule(request); + ApiScenarioWithBLOBs apiScene = apiScenarioMapper.selectByPrimaryKey(request.getResourceId()); + schedule.setName(apiScene.getName()); // add场景定时任务时,设置新增的数据库表字段的值 + schedule.setProjectId(apiScene.getProjectId()); schedule.setJob(ApiScenarioTestJob.class.getName()); schedule.setGroup(ScheduleGroup.API_SCENARIO_TEST.name()); schedule.setType(ScheduleType.CRON.name()); diff --git a/backend/src/main/java/io/metersphere/api/service/ApiDefinitionService.java b/backend/src/main/java/io/metersphere/api/service/ApiDefinitionService.java index 9f48e51c0b..94d4cd2fb9 100644 --- a/backend/src/main/java/io/metersphere/api/service/ApiDefinitionService.java +++ b/backend/src/main/java/io/metersphere/api/service/ApiDefinitionService.java @@ -49,6 +49,7 @@ import sun.security.util.Cache; import javax.annotation.Resource; import java.io.File; +import java.net.MalformedURLException; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @@ -215,7 +216,6 @@ public class ApiDefinitionService { ApiDefinitionExample example = new ApiDefinitionExample(); if (request.getProtocol().equals(RequestType.HTTP)) { example.createCriteria().andMethodEqualTo(request.getMethod()).andStatusNotEqualTo("Trash") - .andProtocolEqualTo(request.getProtocol()).andPathEqualTo(request.getPath()) .andProjectIdEqualTo(request.getProjectId()).andIdNotEqualTo(request.getId()); return apiDefinitionMapper.selectByExample(example); } else { @@ -713,7 +713,7 @@ public class ApiDefinitionService { } /*swagger定时导入*/ - public void createSchedule(ScheduleRequest request) { + public void createSchedule(ScheduleRequest request) throws MalformedURLException { /*保存swaggerUrl*/ SwaggerUrlProject swaggerUrlProject = new SwaggerUrlProject(); swaggerUrlProject.setId(UUID.randomUUID().toString()); @@ -725,6 +725,9 @@ public class ApiDefinitionService { scheduleService.addSwaggerUrlSchedule(swaggerUrlProject); request.setResourceId(swaggerUrlProject.getId()); Schedule schedule = scheduleService.buildApiTestSchedule(request); + schedule.setProjectId(swaggerUrlProject.getProjectId()); + java.net.URL swaggerUrl = new java.net.URL(swaggerUrlProject.getSwaggerUrl()); + schedule.setName(swaggerUrl.getHost()); // swagger 定时任务的 name 设置为 swaggerURL 的域名 schedule.setJob(SwaggerUrlImportJob.class.getName()); schedule.setGroup(ScheduleGroup.SWAGGER_IMPORT.name()); schedule.setType(ScheduleType.CRON.name()); diff --git a/backend/src/main/java/io/metersphere/base/domain/Schedule.java b/backend/src/main/java/io/metersphere/base/domain/Schedule.java index c92c80d081..fb62fa9e24 100644 --- a/backend/src/main/java/io/metersphere/base/domain/Schedule.java +++ b/backend/src/main/java/io/metersphere/base/domain/Schedule.java @@ -1,8 +1,7 @@ package io.metersphere.base.domain; -import lombok.Data; - import java.io.Serializable; +import lombok.Data; @Data public class Schedule implements Serializable { @@ -30,7 +29,9 @@ public class Schedule implements Serializable { private Long updateTime; - private String customData; + private String projectId; + + private String name; private static final long serialVersionUID = 1L; } \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/domain/ScheduleExample.java b/backend/src/main/java/io/metersphere/base/domain/ScheduleExample.java index 88a8639e63..2a5c4e6fe6 100644 --- a/backend/src/main/java/io/metersphere/base/domain/ScheduleExample.java +++ b/backend/src/main/java/io/metersphere/base/domain/ScheduleExample.java @@ -913,6 +913,146 @@ public class ScheduleExample { addCriterion("update_time not between", value1, value2, "updateTime"); return (Criteria) this; } + + public Criteria andProjectIdIsNull() { + addCriterion("project_id is null"); + return (Criteria) this; + } + + public Criteria andProjectIdIsNotNull() { + addCriterion("project_id is not null"); + return (Criteria) this; + } + + public Criteria andProjectIdEqualTo(String value) { + addCriterion("project_id =", value, "projectId"); + return (Criteria) this; + } + + public Criteria andProjectIdNotEqualTo(String value) { + addCriterion("project_id <>", value, "projectId"); + return (Criteria) this; + } + + public Criteria andProjectIdGreaterThan(String value) { + addCriterion("project_id >", value, "projectId"); + return (Criteria) this; + } + + public Criteria andProjectIdGreaterThanOrEqualTo(String value) { + addCriterion("project_id >=", value, "projectId"); + return (Criteria) this; + } + + public Criteria andProjectIdLessThan(String value) { + addCriterion("project_id <", value, "projectId"); + return (Criteria) this; + } + + public Criteria andProjectIdLessThanOrEqualTo(String value) { + addCriterion("project_id <=", value, "projectId"); + return (Criteria) this; + } + + public Criteria andProjectIdLike(String value) { + addCriterion("project_id like", value, "projectId"); + return (Criteria) this; + } + + public Criteria andProjectIdNotLike(String value) { + addCriterion("project_id not like", value, "projectId"); + return (Criteria) this; + } + + public Criteria andProjectIdIn(List values) { + addCriterion("project_id in", values, "projectId"); + return (Criteria) this; + } + + public Criteria andProjectIdNotIn(List values) { + addCriterion("project_id not in", values, "projectId"); + return (Criteria) this; + } + + public Criteria andProjectIdBetween(String value1, String value2) { + addCriterion("project_id between", value1, value2, "projectId"); + return (Criteria) this; + } + + public Criteria andProjectIdNotBetween(String value1, String value2) { + addCriterion("project_id not between", value1, value2, "projectId"); + return (Criteria) this; + } + + public Criteria andNameIsNull() { + addCriterion("`name` is null"); + return (Criteria) this; + } + + public Criteria andNameIsNotNull() { + addCriterion("`name` is not null"); + return (Criteria) this; + } + + public Criteria andNameEqualTo(String value) { + addCriterion("`name` =", value, "name"); + return (Criteria) this; + } + + public Criteria andNameNotEqualTo(String value) { + addCriterion("`name` <>", value, "name"); + return (Criteria) this; + } + + public Criteria andNameGreaterThan(String value) { + addCriterion("`name` >", value, "name"); + return (Criteria) this; + } + + public Criteria andNameGreaterThanOrEqualTo(String value) { + addCriterion("`name` >=", value, "name"); + return (Criteria) this; + } + + public Criteria andNameLessThan(String value) { + addCriterion("`name` <", value, "name"); + return (Criteria) this; + } + + public Criteria andNameLessThanOrEqualTo(String value) { + addCriterion("`name` <=", value, "name"); + return (Criteria) this; + } + + public Criteria andNameLike(String value) { + addCriterion("`name` like", value, "name"); + return (Criteria) this; + } + + public Criteria andNameNotLike(String value) { + addCriterion("`name` not like", value, "name"); + return (Criteria) this; + } + + public Criteria andNameIn(List values) { + addCriterion("`name` in", values, "name"); + return (Criteria) this; + } + + public Criteria andNameNotIn(List values) { + addCriterion("`name` not in", values, "name"); + return (Criteria) this; + } + + public Criteria andNameBetween(String value1, String value2) { + addCriterion("`name` between", value1, value2, "name"); + return (Criteria) this; + } + + public Criteria andNameNotBetween(String value1, String value2) { + addCriterion("`name` not between", value1, value2, "name"); + return (Criteria) this; + } } public static class Criteria extends GeneratedCriteria { diff --git a/backend/src/main/java/io/metersphere/base/domain/TestCaseExample.java b/backend/src/main/java/io/metersphere/base/domain/TestCaseExample.java index 96daffcbf2..9b80e197b0 100644 --- a/backend/src/main/java/io/metersphere/base/domain/TestCaseExample.java +++ b/backend/src/main/java/io/metersphere/base/domain/TestCaseExample.java @@ -244,6 +244,76 @@ public class TestCaseExample { return (Criteria) this; } + public Criteria andTestIdIsNull() { + addCriterion("test_id is null"); + return (Criteria) this; + } + + public Criteria andTestIdIsNotNull() { + addCriterion("test_id is not null"); + return (Criteria) this; + } + + public Criteria andTestIdEqualTo(String value) { + addCriterion("test_id =", value, "testId"); + return (Criteria) this; + } + + public Criteria andTestIdNotEqualTo(String value) { + addCriterion("test_id <>", value, "testId"); + return (Criteria) this; + } + + public Criteria andTestIdGreaterThan(String value) { + addCriterion("test_id >", value, "testId"); + return (Criteria) this; + } + + public Criteria andTestIdGreaterThanOrEqualTo(String value) { + addCriterion("test_id >=", value, "testId"); + return (Criteria) this; + } + + public Criteria andTestIdLessThan(String value) { + addCriterion("test_id <", value, "testId"); + return (Criteria) this; + } + + public Criteria andTestIdLessThanOrEqualTo(String value) { + addCriterion("test_id <=", value, "testId"); + return (Criteria) this; + } + + public Criteria andTestIdLike(String value) { + addCriterion("test_id like", value, "testId"); + return (Criteria) this; + } + + public Criteria andTestIdNotLike(String value) { + addCriterion("test_id not like", value, "testId"); + return (Criteria) this; + } + + public Criteria andTestIdIn(List values) { + addCriterion("test_id in", values, "testId"); + return (Criteria) this; + } + + public Criteria andTestIdNotIn(List values) { + addCriterion("test_id not in", values, "testId"); + return (Criteria) this; + } + + public Criteria andTestIdBetween(String value1, String value2) { + addCriterion("test_id between", value1, value2, "testId"); + return (Criteria) this; + } + + public Criteria andTestIdNotBetween(String value1, String value2) { + addCriterion("test_id not between", value1, value2, "testId"); + return (Criteria) this; + } + public Criteria andNodePathIsNull() { addCriterion("node_path is null"); return (Criteria) this; @@ -924,76 +994,6 @@ public class TestCaseExample { return (Criteria) this; } - public Criteria andTestIdIsNull() { - addCriterion("test_id is null"); - return (Criteria) this; - } - - public Criteria andTestIdIsNotNull() { - addCriterion("test_id is not null"); - return (Criteria) this; - } - - public Criteria andTestIdEqualTo(String value) { - addCriterion("test_id =", value, "testId"); - return (Criteria) this; - } - - public Criteria andTestIdNotEqualTo(String value) { - addCriterion("test_id <>", value, "testId"); - return (Criteria) this; - } - - public Criteria andTestIdGreaterThan(String value) { - addCriterion("test_id >", value, "testId"); - return (Criteria) this; - } - - public Criteria andTestIdGreaterThanOrEqualTo(String value) { - addCriterion("test_id >=", value, "testId"); - return (Criteria) this; - } - - public Criteria andTestIdLessThan(String value) { - addCriterion("test_id <", value, "testId"); - return (Criteria) this; - } - - public Criteria andTestIdLessThanOrEqualTo(String value) { - addCriterion("test_id <=", value, "testId"); - return (Criteria) this; - } - - public Criteria andTestIdLike(String value) { - addCriterion("test_id like", value, "testId"); - return (Criteria) this; - } - - public Criteria andTestIdNotLike(String value) { - addCriterion("test_id not like", value, "testId"); - return (Criteria) this; - } - - public Criteria andTestIdIn(List values) { - addCriterion("test_id in", values, "testId"); - return (Criteria) this; - } - - public Criteria andTestIdNotIn(List values) { - addCriterion("test_id not in", values, "testId"); - return (Criteria) this; - } - - public Criteria andTestIdBetween(String value1, String value2) { - addCriterion("test_id between", value1, value2, "testId"); - return (Criteria) this; - } - - public Criteria andTestIdNotBetween(String value1, String value2) { - addCriterion("test_id not between", value1, value2, "testId"); - return (Criteria) this; - } - public Criteria andSortIsNull() { addCriterion("sort is null"); return (Criteria) this; diff --git a/backend/src/main/java/io/metersphere/base/mapper/ScheduleMapper.java b/backend/src/main/java/io/metersphere/base/mapper/ScheduleMapper.java index 264e2f2e58..99139e6746 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ScheduleMapper.java +++ b/backend/src/main/java/io/metersphere/base/mapper/ScheduleMapper.java @@ -16,21 +16,15 @@ public interface ScheduleMapper { int insertSelective(Schedule record); - List selectByExampleWithBLOBs(ScheduleExample example); - List selectByExample(ScheduleExample example); Schedule selectByPrimaryKey(String id); int updateByExampleSelective(@Param("record") Schedule record, @Param("example") ScheduleExample example); - int updateByExampleWithBLOBs(@Param("record") Schedule record, @Param("example") ScheduleExample example); - int updateByExample(@Param("record") Schedule record, @Param("example") ScheduleExample example); int updateByPrimaryKeySelective(Schedule record); - int updateByPrimaryKeyWithBLOBs(Schedule record); - int updateByPrimaryKey(Schedule record); } \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/ScheduleMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ScheduleMapper.xml index 8718a9b47f..44b9d2f35c 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ScheduleMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ScheduleMapper.xml @@ -14,9 +14,8 @@ - - - + + @@ -78,27 +77,8 @@ id, `key`, `type`, `value`, `group`, job, `enable`, resource_id, user_id, workspace_id, - create_time, update_time + create_time, update_time, project_id, `name` - - custom_data - - - select - , - from schedule where id = #{id,jdbcType=VARCHAR} @@ -136,12 +114,12 @@ `value`, `group`, job, `enable`, resource_id, user_id, workspace_id, create_time, update_time, - custom_data) + project_id, `name`) values (#{id,jdbcType=VARCHAR}, #{key,jdbcType=VARCHAR}, #{type,jdbcType=VARCHAR}, #{value,jdbcType=VARCHAR}, #{group,jdbcType=VARCHAR}, #{job,jdbcType=VARCHAR}, #{enable,jdbcType=BIT}, #{resourceId,jdbcType=VARCHAR}, #{userId,jdbcType=VARCHAR}, #{workspaceId,jdbcType=VARCHAR}, #{createTime,jdbcType=BIGINT}, #{updateTime,jdbcType=BIGINT}, - #{customData,jdbcType=LONGVARCHAR}) + #{projectId,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}) insert into schedule @@ -182,8 +160,11 @@ update_time, - - custom_data, + + project_id, + + + `name`, @@ -223,8 +204,11 @@ #{updateTime,jdbcType=BIGINT}, - - #{customData,jdbcType=LONGVARCHAR}, + + #{projectId,jdbcType=VARCHAR}, + + + #{name,jdbcType=VARCHAR}, @@ -273,33 +257,17 @@ update_time = #{record.updateTime,jdbcType=BIGINT}, - - custom_data = #{record.customData,jdbcType=LONGVARCHAR}, + + project_id = #{record.projectId,jdbcType=VARCHAR}, + + + `name` = #{record.name,jdbcType=VARCHAR}, - - update schedule - set id = #{record.id,jdbcType=VARCHAR}, - `key` = #{record.key,jdbcType=VARCHAR}, - `type` = #{record.type,jdbcType=VARCHAR}, - `value` = #{record.value,jdbcType=VARCHAR}, - `group` = #{record.group,jdbcType=VARCHAR}, - job = #{record.job,jdbcType=VARCHAR}, - `enable` = #{record.enable,jdbcType=BIT}, - resource_id = #{record.resourceId,jdbcType=VARCHAR}, - user_id = #{record.userId,jdbcType=VARCHAR}, - workspace_id = #{record.workspaceId,jdbcType=VARCHAR}, - create_time = #{record.createTime,jdbcType=BIGINT}, - update_time = #{record.updateTime,jdbcType=BIGINT}, - custom_data = #{record.customData,jdbcType=LONGVARCHAR} - - - - update schedule set id = #{record.id,jdbcType=VARCHAR}, @@ -313,7 +281,9 @@ user_id = #{record.userId,jdbcType=VARCHAR}, workspace_id = #{record.workspaceId,jdbcType=VARCHAR}, create_time = #{record.createTime,jdbcType=BIGINT}, - update_time = #{record.updateTime,jdbcType=BIGINT} + update_time = #{record.updateTime,jdbcType=BIGINT}, + project_id = #{record.projectId,jdbcType=VARCHAR}, + `name` = #{record.name,jdbcType=VARCHAR} @@ -354,28 +324,15 @@ update_time = #{updateTime,jdbcType=BIGINT}, - - custom_data = #{customData,jdbcType=LONGVARCHAR}, + + project_id = #{projectId,jdbcType=VARCHAR}, + + + `name` = #{name,jdbcType=VARCHAR}, where id = #{id,jdbcType=VARCHAR} - - update schedule - set `key` = #{key,jdbcType=VARCHAR}, - `type` = #{type,jdbcType=VARCHAR}, - `value` = #{value,jdbcType=VARCHAR}, - `group` = #{group,jdbcType=VARCHAR}, - job = #{job,jdbcType=VARCHAR}, - `enable` = #{enable,jdbcType=BIT}, - resource_id = #{resourceId,jdbcType=VARCHAR}, - user_id = #{userId,jdbcType=VARCHAR}, - workspace_id = #{workspaceId,jdbcType=VARCHAR}, - create_time = #{createTime,jdbcType=BIGINT}, - update_time = #{updateTime,jdbcType=BIGINT}, - custom_data = #{customData,jdbcType=LONGVARCHAR} - where id = #{id,jdbcType=VARCHAR} - update schedule set `key` = #{key,jdbcType=VARCHAR}, @@ -388,7 +345,9 @@ user_id = #{userId,jdbcType=VARCHAR}, workspace_id = #{workspaceId,jdbcType=VARCHAR}, create_time = #{createTime,jdbcType=BIGINT}, - update_time = #{updateTime,jdbcType=BIGINT} + update_time = #{updateTime,jdbcType=BIGINT}, + project_id = #{projectId,jdbcType=VARCHAR}, + `name` = #{name,jdbcType=VARCHAR} where id = #{id,jdbcType=VARCHAR} \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtScheduleMapper.java b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtScheduleMapper.java index 236a0ec067..36857bac0e 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtScheduleMapper.java +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtScheduleMapper.java @@ -15,10 +15,12 @@ public interface ExtScheduleMapper { long countTaskByProjectIdAndCreateTimeRange(@Param("projectId")String projectId, @Param("startTime") long startTime, @Param("endTime") long endTime); - List findRunningTaskInfoByProjectID(String workspaceID); + List findRunningTaskInfoByProjectID(@Param("projectId") String workspaceID, @Param("types") List typeFilter); void insert(@Param("apiSwaggerUrlDTO") ApiSwaggerUrlDTO apiSwaggerUrlDTO); ApiSwaggerUrlDTO select(String id); + int updateNameByResourceID(@Param("resourceId") String resourceId, @Param("name") String name); + } \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtScheduleMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtScheduleMapper.xml index b7e236df7d..853c7db49b 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtScheduleMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtScheduleMapper.xml @@ -61,35 +61,33 @@ AND create_time BETWEEN #{startTime} and #{endTime} + + update schedule set name = #{name} where resource_id = #{resourceId} + \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestCaseMapper.java b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestCaseMapper.java index 5ed9e3a7fa..17ae2078b3 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestCaseMapper.java +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestCaseMapper.java @@ -71,5 +71,10 @@ public interface ExtTestCaseMapper { List countRelevanceMaintainer(@Param("projectId") String projectId); + int getTestPlanBug(@Param("planId") String planId); + int getTestPlanCase(@Param("planId") String planId); + int getTestPlanPassCase(@Param("planId") String planId); + + } diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestCaseMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestCaseMapper.xml index 17d5c37a6e..edb7e5ec9b 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestCaseMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestCaseMapper.xml @@ -306,6 +306,9 @@ or test_case.num like CONCAT('%', #{request.name},'%') or test_case.tags like CONCAT('%', #{request.name},'%')) + + AND test_case.create_time >= #{request.createTime} + and test_case.node_id in @@ -316,6 +319,12 @@ and test_case.project_id = #{request.projectId} + + and test_case.test_id is null and test_case.type != 'functional' + + + and test_case.test_id is not null and test_case.type != 'functional' + @@ -342,8 +351,9 @@ + + + \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestReviewCaseMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestReviewCaseMapper.xml index 00f773ad2b..a520d29d33 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestReviewCaseMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestReviewCaseMapper.xml @@ -97,10 +97,13 @@ - \ No newline at end of file + diff --git a/backend/src/main/java/io/metersphere/commons/utils/ShiroUtils.java b/backend/src/main/java/io/metersphere/commons/utils/ShiroUtils.java index 90c4e26e92..79ad0b6f70 100644 --- a/backend/src/main/java/io/metersphere/commons/utils/ShiroUtils.java +++ b/backend/src/main/java/io/metersphere/commons/utils/ShiroUtils.java @@ -42,10 +42,13 @@ public class ShiroUtils { //api-对外文档页面提供的查询接口 filterChainDefinitionMap.put("/api/document/**", "anon"); // filterChainDefinitionMap.put("/document/**", "anon"); + filterChainDefinitionMap.put("/system/theme", "anon"); + } public static void ignoreCsrfFilter(Map filterChainDefinitionMap) { filterChainDefinitionMap.put("/", "apikey, authc"); // 跳转到 / 不用校验 csrf + filterChainDefinitionMap.put("/language", "apikey, authc");// 跳转到 /language 不用校验 csrf filterChainDefinitionMap.put("/document", "apikey, authc"); // 跳转到 /document 不用校验 csrf } diff --git a/backend/src/main/java/io/metersphere/performance/parse/xml/reader/jmx/JmeterDocumentParser.java b/backend/src/main/java/io/metersphere/performance/parse/xml/reader/jmx/JmeterDocumentParser.java index 13ffc9a34e..09fbda18a5 100644 --- a/backend/src/main/java/io/metersphere/performance/parse/xml/reader/jmx/JmeterDocumentParser.java +++ b/backend/src/main/java/io/metersphere/performance/parse/xml/reader/jmx/JmeterDocumentParser.java @@ -676,6 +676,13 @@ public class JmeterDocumentParser implements DocumentParser { ((List) durations).remove(0); duration = o.toString(); } + Object units = context.getProperty("unit"); + String unit = "S"; + if (units instanceof List) { + Object o = ((List) units).get(0); + ((List) units).remove(0); + unit = o.toString(); + } Object deleteds = context.getProperty("deleted"); String deleted = "false"; if (deleteds instanceof List) { @@ -691,6 +698,17 @@ public class JmeterDocumentParser implements DocumentParser { enabled = o.toString(); } + switch (unit) { + case "M": + duration = String.valueOf(Long.parseLong(duration) * 60); + break; + case "H": + duration = String.valueOf(Long.parseLong(duration) * 60 * 60); + break; + default: + break; + } + threadGroup.setAttribute("enabled", enabled); if (BooleanUtils.toBoolean(deleted)) { threadGroup.setAttribute("enabled", "false"); @@ -761,6 +779,13 @@ public class JmeterDocumentParser implements DocumentParser { ((List) holds).remove(0); hold = o.toString(); } + Object units = context.getProperty("unit"); + String unit = "S"; + if (units instanceof List) { + Object o = ((List) units).get(0); + ((List) units).remove(0); + unit = o.toString(); + } Object deleteds = context.getProperty("deleted"); String deleted = "false"; if (deleteds instanceof List) { @@ -776,6 +801,17 @@ public class JmeterDocumentParser implements DocumentParser { enabled = o.toString(); } + switch (unit) { + case "M": + hold = String.valueOf(Long.parseLong(hold) * 60); + break; + case "H": + hold = String.valueOf(Long.parseLong(hold) * 60 * 60); + break; + default: + break; + } + threadGroup.setAttribute("enabled", enabled); if (BooleanUtils.toBoolean(deleted)) { threadGroup.setAttribute("enabled", "false"); @@ -928,10 +964,10 @@ public class JmeterDocumentParser implements DocumentParser { } private Element createStringProp(Document document, String name, String value) { - Element unit = document.createElement(STRING_PROP); - unit.setAttribute("name", name); - unit.appendChild(document.createTextNode(value)); - return unit; + Element element = document.createElement(STRING_PROP); + element.setAttribute("name", name); + element.appendChild(document.createTextNode(value)); + return element; } private void processThreadGroupName(Element threadGroup) { diff --git a/backend/src/main/java/io/metersphere/service/ScheduleService.java b/backend/src/main/java/io/metersphere/service/ScheduleService.java index 279568b785..04ad49514a 100644 --- a/backend/src/main/java/io/metersphere/service/ScheduleService.java +++ b/backend/src/main/java/io/metersphere/service/ScheduleService.java @@ -4,9 +4,7 @@ import com.alibaba.fastjson.JSON; import io.metersphere.api.dto.datacount.response.TaskInfoResult; import io.metersphere.api.dto.definition.ApiSwaggerUrlDTO; import io.metersphere.base.domain.*; -import io.metersphere.base.mapper.ScheduleMapper; -import io.metersphere.base.mapper.SwaggerUrlProjectMapper; -import io.metersphere.base.mapper.UserMapper; +import io.metersphere.base.mapper.*; import io.metersphere.base.mapper.ext.ExtScheduleMapper; import io.metersphere.commons.constants.ScheduleGroup; import io.metersphere.commons.constants.ScheduleType; @@ -38,6 +36,10 @@ import java.util.stream.Collectors; @Transactional(rollbackFor = Exception.class) public class ScheduleService { + @Resource + private TestPlanMapper testPlanMapper; + @Resource + private ApiScenarioMapper apiScenarioMapper; @Resource private ScheduleMapper scheduleMapper; @Resource @@ -214,8 +216,8 @@ public class ScheduleService { } } - public List findRunningTaskInfoByProjectID(String projectID) { - List runningTaskInfoList = extScheduleMapper.findRunningTaskInfoByProjectID(projectID); + public List findRunningTaskInfoByProjectID(String projectID, List typeFilter) { + List runningTaskInfoList = extScheduleMapper.findRunningTaskInfoByProjectID(projectID, typeFilter); return runningTaskInfoList; } @@ -227,13 +229,19 @@ public class ScheduleService { TriggerKey triggerKey = null; Class clazz = null; if("testPlan".equals(request.getScheduleFrom())){ + TestPlan testPlan = testPlanMapper.selectByPrimaryKey(request.getResourceId()); + schedule.setName(testPlan.getName()); + schedule.setProjectId(testPlan.getProjectId()); schedule.setGroup(ScheduleGroup.TEST_PLAN_TEST.name()); schedule.setType(ScheduleType.CRON.name()); jobKey = TestPlanTestJob.getJobKey(request.getResourceId()); triggerKey = TestPlanTestJob.getTriggerKey(request.getResourceId()); clazz = TestPlanTestJob.class; - }else { + }else { // 实际上在场景中添加定时任务并不会执行到这里? //默认为情景 + ApiScenarioWithBLOBs apiScene = apiScenarioMapper.selectByPrimaryKey(request.getResourceId()); + schedule.setName(apiScene.getName()); + schedule.setProjectId(apiScene.getProjectId()); schedule.setGroup(ScheduleGroup.API_SCENARIO_TEST.name()); schedule.setType(ScheduleType.CRON.name()); jobKey = ApiScenarioTestJob.getJobKey(request.getResourceId()); diff --git a/backend/src/main/java/io/metersphere/track/controller/TestCaseController.java b/backend/src/main/java/io/metersphere/track/controller/TestCaseController.java index 51f40d68a6..304733c69e 100644 --- a/backend/src/main/java/io/metersphere/track/controller/TestCaseController.java +++ b/backend/src/main/java/io/metersphere/track/controller/TestCaseController.java @@ -18,6 +18,7 @@ import io.metersphere.track.dto.TestPlanCaseDTO; import io.metersphere.track.request.testcase.EditTestCaseRequest; import io.metersphere.track.request.testcase.QueryTestCaseRequest; import io.metersphere.track.request.testcase.TestCaseBatchRequest; +import io.metersphere.track.request.testcase.TestCaseMinderEditRequest; import io.metersphere.track.request.testplan.FileOperationRequest; import io.metersphere.track.request.testplancase.QueryTestPlanCaseRequest; import io.metersphere.track.service.TestCaseService; @@ -59,6 +60,12 @@ public class TestCaseController { return testCaseService.listTestCase(request); } + @GetMapping("/list/detail/{projectId}") + public List listDetail(@PathVariable String projectId) { + checkPermissionService.checkProjectOwner(projectId); + return testCaseService.listTestCaseDetail(projectId); + } + /*jenkins项目下所有接口和性能测试用例*/ @GetMapping("/list/method/{projectId}") public List listByMethod(@PathVariable String projectId) { @@ -195,4 +202,11 @@ public class TestCaseController { return testCaseService.addTestCase(testCaseWithBLOBs); } + @PostMapping("/minder/edit") + @RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR) + public void minderEdit(@RequestBody TestCaseMinderEditRequest request) { + testCaseService.minderEdit(request); + } + + } diff --git a/backend/src/main/java/io/metersphere/track/controller/TestCaseIssuesController.java b/backend/src/main/java/io/metersphere/track/controller/TestCaseIssuesController.java index d0b690e94b..72c409936e 100644 --- a/backend/src/main/java/io/metersphere/track/controller/TestCaseIssuesController.java +++ b/backend/src/main/java/io/metersphere/track/controller/TestCaseIssuesController.java @@ -37,9 +37,9 @@ public class TestCaseIssuesController { issuesService.closeLocalIssue(id); } - @GetMapping("/delete/{id}") - public void deleteIssue(@PathVariable String id) { - issuesService.deleteIssue(id); + @PostMapping("/delete") + public void deleteIssue(@RequestBody IssuesRequest request) { + issuesService.deleteIssue(request); } @GetMapping("/tapd/user/{caseId}") diff --git a/backend/src/main/java/io/metersphere/track/controller/TrackController.java b/backend/src/main/java/io/metersphere/track/controller/TrackController.java index 2b0d66bfb0..c010d94bc2 100644 --- a/backend/src/main/java/io/metersphere/track/controller/TrackController.java +++ b/backend/src/main/java/io/metersphere/track/controller/TrackController.java @@ -87,7 +87,7 @@ public class TrackController { } @GetMapping("/bug/count/{projectId}") - public BugStatustics getBugStatustics(@PathVariable String projectId) { - return trackService.getBugStatustics(projectId); + public BugStatustics getBugStatistics(@PathVariable String projectId) { + return trackService.getBugStatistics(projectId); } } diff --git a/backend/src/main/java/io/metersphere/track/request/testcase/IssuesRequest.java b/backend/src/main/java/io/metersphere/track/request/testcase/IssuesRequest.java index a1ea0ad74a..127e18a0d5 100644 --- a/backend/src/main/java/io/metersphere/track/request/testcase/IssuesRequest.java +++ b/backend/src/main/java/io/metersphere/track/request/testcase/IssuesRequest.java @@ -21,4 +21,10 @@ public class IssuesRequest { * zentao bug 影响版本 */ private List zentaoBuilds; + + /** + * issues id + */ + private String id; + private String caseId; } diff --git a/backend/src/main/java/io/metersphere/track/request/testcase/QueryTestCaseRequest.java b/backend/src/main/java/io/metersphere/track/request/testcase/QueryTestCaseRequest.java index e0b265d662..e024a581b0 100644 --- a/backend/src/main/java/io/metersphere/track/request/testcase/QueryTestCaseRequest.java +++ b/backend/src/main/java/io/metersphere/track/request/testcase/QueryTestCaseRequest.java @@ -22,4 +22,10 @@ public class QueryTestCaseRequest extends BaseQueryRequest { private String userId; private String reviewId; + + private boolean isSelectThisWeedData = false; + + private String caseCoverage; + + private long createTime = 0; } diff --git a/backend/src/main/java/io/metersphere/track/request/testcase/TestCaseMinderEditRequest.java b/backend/src/main/java/io/metersphere/track/request/testcase/TestCaseMinderEditRequest.java new file mode 100644 index 0000000000..d3b43a66ae --- /dev/null +++ b/backend/src/main/java/io/metersphere/track/request/testcase/TestCaseMinderEditRequest.java @@ -0,0 +1,14 @@ +package io.metersphere.track.request.testcase; + +import io.metersphere.base.domain.TestCaseWithBLOBs; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +public class TestCaseMinderEditRequest { + private String projectId; + List data; +} diff --git a/backend/src/main/java/io/metersphere/track/response/TestPlanBugCount.java b/backend/src/main/java/io/metersphere/track/response/TestPlanBugCount.java index 4c8a75b272..6802673d16 100644 --- a/backend/src/main/java/io/metersphere/track/response/TestPlanBugCount.java +++ b/backend/src/main/java/io/metersphere/track/response/TestPlanBugCount.java @@ -8,7 +8,7 @@ import lombok.Setter; public class TestPlanBugCount { private int index; private String planName; - private long creatTime; + private long createTime; private String status; private int caseSize; private int bugSize; diff --git a/backend/src/main/java/io/metersphere/track/response/TrackStatisticsDTO.java b/backend/src/main/java/io/metersphere/track/response/TrackStatisticsDTO.java index cb3aeffc88..264e0cf9cb 100644 --- a/backend/src/main/java/io/metersphere/track/response/TrackStatisticsDTO.java +++ b/backend/src/main/java/io/metersphere/track/response/TrackStatisticsDTO.java @@ -144,20 +144,22 @@ public class TrackStatisticsDTO { public void countRelevance(List relevanceResults) { for (TrackCountResult countResult : relevanceResults) { - switch (countResult.getGroupField().toUpperCase()){ + switch (countResult.getGroupField()){ case TrackCount.API: this.apiCaseCount += countResult.getCountNumber(); + this.allRelevanceCaseCount += countResult.getCountNumber(); break; case TrackCount.PERFORMANCE: this.performanceCaseCount += countResult.getCountNumber(); + this.allRelevanceCaseCount += countResult.getCountNumber(); break; case TrackCount.AUTOMATION: this.scenarioCaseCount += countResult.getCountNumber(); + this.allRelevanceCaseCount += countResult.getCountNumber(); break; default: break; } - this.allRelevanceCaseCount += countResult.getCountNumber(); } } diff --git a/backend/src/main/java/io/metersphere/track/service/IssuesService.java b/backend/src/main/java/io/metersphere/track/service/IssuesService.java index fca1712896..ee737fcf8c 100644 --- a/backend/src/main/java/io/metersphere/track/service/IssuesService.java +++ b/backend/src/main/java/io/metersphere/track/service/IssuesService.java @@ -1,10 +1,8 @@ package io.metersphere.track.service; -import io.metersphere.base.domain.Issues; -import io.metersphere.base.domain.Project; -import io.metersphere.base.domain.ServiceIntegration; -import io.metersphere.base.domain.TestCaseWithBLOBs; +import io.metersphere.base.domain.*; import io.metersphere.base.mapper.IssuesMapper; +import io.metersphere.base.mapper.TestCaseIssuesMapper; import io.metersphere.commons.constants.IssuesManagePlatform; import io.metersphere.commons.constants.NoticeConstants; import io.metersphere.commons.user.SessionUser; @@ -43,6 +41,8 @@ public class IssuesService { private IssuesMapper issuesMapper; @Resource private NoticeSendService noticeSendService; + @Resource + private TestCaseIssuesMapper testCaseIssuesMapper; public void testAuth(String platform) { AbstractIssuePlatform abstractPlatform = IssueFactory.createPlatform(platform, new IssuesRequest()); @@ -202,8 +202,14 @@ public class IssuesService { return platform.getPlatformUser(); } - public void deleteIssue(String id) { + public void deleteIssue(IssuesRequest request) { + String caseId = request.getCaseId(); + String id = request.getId(); issuesMapper.deleteByPrimaryKey(id); + + TestCaseIssuesExample example = new TestCaseIssuesExample(); + example.createCriteria().andTestCaseIdEqualTo(caseId).andIssuesIdEqualTo(id); + testCaseIssuesMapper.deleteByExample(example); } private static String getIssuesContext(SessionUser user, IssuesRequest issuesRequest, String type) { diff --git a/backend/src/main/java/io/metersphere/track/service/TestCaseNodeService.java b/backend/src/main/java/io/metersphere/track/service/TestCaseNodeService.java index 6322147321..ee74a265d0 100644 --- a/backend/src/main/java/io/metersphere/track/service/TestCaseNodeService.java +++ b/backend/src/main/java/io/metersphere/track/service/TestCaseNodeService.java @@ -212,11 +212,14 @@ public class TestCaseNodeService extends NodeTreeService { List caseIds = testCaseReviewTestCases.stream().map(TestCaseReviewTestCase::getCaseId).collect(Collectors.toList()); List nodeList = getReviewNodeDTO(id, caseIds); - TestCaseNodeDTO testCaseNodeDTO = new TestCaseNodeDTO(); - testCaseNodeDTO.setName(name); - testCaseNodeDTO.setLabel(name); - testCaseNodeDTO.setChildren(nodeList); - list.add(testCaseNodeDTO); + if (!CollectionUtils.isEmpty(nodeList)) { + TestCaseNodeDTO testCaseNodeDTO = new TestCaseNodeDTO(); + testCaseNodeDTO.setName(name); + testCaseNodeDTO.setLabel(name); + testCaseNodeDTO.setChildren(nodeList); + testCaseNodeDTO.setProjectId(id); + list.add(testCaseNodeDTO); + } }); return list; diff --git a/backend/src/main/java/io/metersphere/track/service/TestCaseService.java b/backend/src/main/java/io/metersphere/track/service/TestCaseService.java index 4ae0ae598a..42db5f06e8 100644 --- a/backend/src/main/java/io/metersphere/track/service/TestCaseService.java +++ b/backend/src/main/java/io/metersphere/track/service/TestCaseService.java @@ -5,7 +5,6 @@ import com.alibaba.excel.EasyExcelFactory; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.github.pagehelper.PageHelper; -import io.metersphere.api.dto.definition.ApiBatchRequest; import io.metersphere.base.domain.*; import io.metersphere.base.mapper.*; import io.metersphere.base.mapper.ext.ExtTestCaseMapper; @@ -14,10 +13,7 @@ import io.metersphere.commons.constants.TestCaseConstants; import io.metersphere.commons.constants.TestCaseReviewStatus; import io.metersphere.commons.exception.MSException; import io.metersphere.commons.user.SessionUser; -import io.metersphere.commons.utils.BeanUtils; -import io.metersphere.commons.utils.LogUtil; -import io.metersphere.commons.utils.ServiceUtils; -import io.metersphere.commons.utils.SessionUtils; +import io.metersphere.commons.utils.*; import io.metersphere.controller.request.OrderRequest; import io.metersphere.excel.domain.ExcelErrData; import io.metersphere.excel.domain.ExcelResponse; @@ -32,6 +28,7 @@ import io.metersphere.track.dto.TestCaseDTO; import io.metersphere.track.request.testcase.EditTestCaseRequest; import io.metersphere.track.request.testcase.QueryTestCaseRequest; import io.metersphere.track.request.testcase.TestCaseBatchRequest; +import io.metersphere.track.request.testcase.TestCaseMinderEditRequest; import io.metersphere.xmind.XmindCaseParser; import org.apache.commons.collections4.ListUtils; import org.apache.commons.lang3.StringUtils; @@ -188,6 +185,7 @@ public class TestCaseService { } public List listTestCase(QueryTestCaseRequest request) { + this.initRequest(request, true); List orderList = ServiceUtils.getDefaultOrder(request.getOrders()); OrderRequest order = new OrderRequest(); // 对模板导入的测试用例排序 @@ -198,6 +196,25 @@ public class TestCaseService { return extTestCaseMapper.list(request); } + /** + * 初始化部分参数 + * + * @param request + * @param checkThisWeekData + * @return + */ + private void initRequest(QueryTestCaseRequest request, boolean checkThisWeekData) { + if (checkThisWeekData) { + if (request.isSelectThisWeedData()) { + Map weekFirstTimeAndLastTime = DateUtils.getWeedFirstTimeAndLastTime(new Date()); + Date weekFirstTime = weekFirstTimeAndLastTime.get("firstTime"); + if (weekFirstTime != null) { + request.setCreateTime(weekFirstTime.getTime()); + } + } + } + } + public List listTestCaseMthod(QueryTestCaseRequest request) { return extTestCaseMapper.listByMethod(request); } @@ -705,4 +722,23 @@ public class TestCaseService { return extTestCaseMapper.list(request); } + public List listTestCaseDetail(String projectId) { + TestCaseExample testCaseExample = new TestCaseExample(); + testCaseExample.createCriteria().andProjectIdEqualTo(projectId); + return testCaseMapper.selectByExampleWithBLOBs(testCaseExample); + } + + public void minderEdit(TestCaseMinderEditRequest request) { + List data = request.getData(); + data.forEach(item -> { + item.setProjectId(request.getProjectId()); + if (StringUtils.isBlank(item.getId()) || item.getId().length() < 20) { + item.setId(UUID.randomUUID().toString()); + item.setMaintainer(SessionUtils.getUserId()); + addTestCase(item); + } else { + editTestCase(item); + } + }); + } } diff --git a/backend/src/main/java/io/metersphere/track/service/TestPlanService.java b/backend/src/main/java/io/metersphere/track/service/TestPlanService.java index 08b343ee43..2ab2c5a1b0 100644 --- a/backend/src/main/java/io/metersphere/track/service/TestPlanService.java +++ b/backend/src/main/java/io/metersphere/track/service/TestPlanService.java @@ -57,6 +57,8 @@ import java.util.stream.Collectors; @Service @Transactional(rollbackFor = Exception.class) public class TestPlanService { + @Resource + ExtScheduleMapper extScheduleMapper; @Resource TestPlanMapper testPlanMapper; @Resource @@ -179,6 +181,7 @@ public class TestPlanService { testPlan.setActualEndTime(System.currentTimeMillis()); } } + extScheduleMapper.updateNameByResourceID(testPlan.getId(), testPlan.getName());// 同步更新该测试的定时任务的name List userIds = new ArrayList<>(); userIds.add(testPlan.getPrincipal()); diff --git a/backend/src/main/java/io/metersphere/track/service/TrackService.java b/backend/src/main/java/io/metersphere/track/service/TrackService.java index b2a01371bd..3bcdf1cf79 100644 --- a/backend/src/main/java/io/metersphere/track/service/TrackService.java +++ b/backend/src/main/java/io/metersphere/track/service/TrackService.java @@ -12,6 +12,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.math.BigDecimal; +import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -110,59 +111,58 @@ public class TrackService { return charts; } - public BugStatustics getBugStatustics(String projectId) { + public BugStatustics getBugStatistics(String projectId) { TestPlanExample example = new TestPlanExample(); example.createCriteria().andProjectIdEqualTo(projectId); List plans = testPlanMapper.selectByExample(example); List list = new ArrayList<>(); BugStatustics bugStatustics = new BugStatustics(); int index = 1; + int totalBugSize = 0; + int totalCaseSize = 0; for (TestPlan plan : plans) { TestPlanBugCount testPlanBug = new TestPlanBugCount(); testPlanBug.setIndex(index++); testPlanBug.setPlanName(plan.getName()); - testPlanBug.setCreatTime(plan.getCreateTime()); + testPlanBug.setCreateTime(plan.getCreateTime()); testPlanBug.setStatus(plan.getStatus()); - testPlanBug.setCaseSize(getPlanCaseSize(plan.getId())); - testPlanBug.setBugSize(getPlanBugSize(plan.getId())); - testPlanBug.setPassRage(getPlanPassRage(plan.getId())); + + int planCaseSize = getPlanCaseSize(plan.getId()); + testPlanBug.setCaseSize(planCaseSize); + + int planBugSize = getPlanBugSize(plan.getId()); + testPlanBug.setBugSize(planBugSize); + testPlanBug.setPassRage(getPlanPassRage(plan.getId(), planCaseSize)); list.add(testPlanBug); + + totalBugSize += planBugSize; + totalCaseSize += planCaseSize; } - // todo bugStatustics.setList(list); - bugStatustics.setRage("1"); - bugStatustics.setBugTotalSize(2); + float rage =totalCaseSize == 0 ? 0 : (float) totalBugSize * 100 / totalCaseSize; + DecimalFormat df = new DecimalFormat("0.0"); + bugStatustics.setRage(df.format(rage) + "%"); + bugStatustics.setBugTotalSize(totalBugSize); return bugStatustics; } private int getPlanCaseSize(String planId) { - TestPlanTestCaseExample testPlanTestCaseExample = new TestPlanTestCaseExample(); - testPlanTestCaseExample.createCriteria().andPlanIdEqualTo(planId); - List testPlanTestCases = testPlanTestCaseMapper.selectByExample(testPlanTestCaseExample); - - TestPlanApiCaseExample testPlanApiCaseExample = new TestPlanApiCaseExample(); - testPlanApiCaseExample.createCriteria().andTestPlanIdEqualTo(planId); - List testPlanApiCases = testPlanApiCaseMapper.selectByExample(testPlanApiCaseExample); - - TestPlanLoadCaseExample example = new TestPlanLoadCaseExample(); - example.createCriteria().andTestPlanIdEqualTo(planId); - List testPlanLoadCases = testPlanLoadCaseMapper.selectByExample(example); - - TestPlanApiScenarioExample testPlanApiScenarioExample = new TestPlanApiScenarioExample(); - testPlanApiCaseExample.createCriteria().andTestPlanIdEqualTo(planId); - List testPlanApiScenarios = testPlanApiScenarioMapper.selectByExample(testPlanApiScenarioExample); - - - return testPlanTestCases.size() + testPlanApiCases.size() + testPlanLoadCases.size() + testPlanApiScenarios.size(); + return extTestCaseMapper.getTestPlanCase(planId); } private int getPlanBugSize(String planId) { - return 1; + return extTestCaseMapper.getTestPlanBug(planId); } - private String getPlanPassRage(String planId) { - return "10%"; + private String getPlanPassRage(String planId, int totalSize) { + if (totalSize == 0) { + return "-"; + } + int passSize = extTestCaseMapper.getTestPlanPassCase(planId); + float rage = (float) passSize * 100 / totalSize; + DecimalFormat df = new DecimalFormat("0.0"); + return df.format(rage) + "%"; } } diff --git a/backend/src/main/resources/db/migration/V78__v1.8_release.sql b/backend/src/main/resources/db/migration/V78__v1.8_release.sql index 2f60e346bb..f23a534967 100644 --- a/backend/src/main/resources/db/migration/V78__v1.8_release.sql +++ b/backend/src/main/resources/db/migration/V78__v1.8_release.sql @@ -101,4 +101,49 @@ update api_definition set original_state='Underway'; update api_scenario set original_state='Underway'; -- alter test_case_review_scenario -alter table test_case_review_scenario modify environment longtext null; \ No newline at end of file +alter table test_case_review_scenario modify environment longtext null; + + +-- schedule table add project_id column +alter table schedule add project_id varchar(50) NULL; +-- set values for new colums of exitsting data +update schedule sch inner join test_plan testPlan on + testPlan.id = sch.resource_id + set sch.project_id = testPlan.project_id where + sch.resource_id = testPlan.id; +update schedule sch inner join swagger_url_project sup on + sup.id = sch.resource_id + set sch.project_id = sup.project_id where + sch.resource_id = sup.id; +update schedule sch inner join api_scenario apiScene on + apiScene.id = sch.resource_id + set sch.project_id = apiScene.project_id where + sch.resource_id = apiScene.id; +update schedule sch inner join load_test ldt on + ldt.id = sch.resource_id + set sch.project_id = ldt.project_id where + sch.resource_id = ldt.id; +update schedule sch inner join api_test apiTest on + apiTest.id = sch.resource_id + set sch.project_id = apiTest.project_id where + sch.resource_id = apiTest.id; +-- schedule table add name column +alter table schedule add name varchar(100) NULL; +-- set values for new colums of exitsting data +update schedule sch inner join api_scenario apiScene on + apiScene.id = sch.resource_id + set sch.name = apiScene.name; +update schedule sch inner join test_plan testPlan on + testPlan.id = sch.resource_id + set sch.name = testPlan.name; +update schedule sch inner join load_test ldt on + ldt.id = sch.resource_id + set sch.name = ldt.name; +update schedule sch inner join api_test apiTest on + apiTest.id = sch.resource_id + set sch.name = apiTest.name; +update schedule sch inner join swagger_url_project sup on + sup.id = sch.resource_id + set sch.name = LEFT(SUBSTRING_INDEX(sup.swagger_url, '/', 3), 100); +-- delete an unused colum +alter table schedule drop column custom_data; diff --git a/frontend/src/business/App.vue b/frontend/src/business/App.vue index a03bda8a6d..f279581ae6 100644 --- a/frontend/src/business/App.vue +++ b/frontend/src/business/App.vue @@ -31,7 +31,7 @@ import MsView from "./components/common/router/View"; import MsUser from "./components/common/head/HeaderUser"; import MsHeaderOrgWs from "./components/common/head/HeaderOrgWs"; import MsLanguageSwitch from "./components/common/head/LanguageSwitch"; -import {hasLicense, saveLocalStorage, setColor, setOriginColor} from "@/common/js/utils"; +import {hasLicense, saveLocalStorage, setColor, setDefaultTheme} from "@/common/js/utils"; import {registerRequestHeaders} from "@/common/js/ajax"; import {ORIGIN_COLOR} from "@/common/js/constants"; @@ -55,13 +55,14 @@ export default { created() { registerRequestHeaders(); if (!hasLicense()) { - setOriginColor() + setDefaultTheme(); this.color = ORIGIN_COLOR; } else { // this.$get('/system/theme', res => { this.color = res.data ? res.data : ORIGIN_COLOR; - setColor(this.color, this.color, this.color, this.color); + setColor(this.color, this.color, this.color, this.color, this.color); + this.$store.commit('setTheme', res.data); }) } if (localStorage.getItem("store")) { diff --git a/frontend/src/business/components/api/automation/scenario/EditApiScenario.vue b/frontend/src/business/components/api/automation/scenario/EditApiScenario.vue index cfebd0feb7..38aaf8c4bb 100644 --- a/frontend/src/business/components/api/automation/scenario/EditApiScenario.vue +++ b/frontend/src/business/components/api/automation/scenario/EditApiScenario.vue @@ -114,12 +114,13 @@ 共享cookie - + - + {{$t('api_test.request.debug')}} + @@ -192,6 +193,17 @@ class="ms-sc-variable-header"/> + + + + + + + + @@ -224,6 +236,9 @@ import MsComponentConfig from "./component/ComponentConfig"; import {handleCtrlSEvent} from "../../../../../common/js/utils"; import EnvPopover from "@/business/components/api/automation/scenario/EnvPopover"; + import MaximizeScenario from "./maximize/MaximizeScenario"; + import ScenarioHeader from "./maximize/ScenarioHeader"; + import MsDrawer from "../../../common/components/MsDrawer"; let jsonPath = require('jsonpath'); export default { @@ -243,7 +258,10 @@ MsApiCustomize, ApiImport, MsComponentConfig, - EnvPopover + EnvPopover, + MaximizeScenario, + ScenarioHeader, + MsDrawer }, data() { return { @@ -293,6 +311,7 @@ projectEnvMap: new Map, projectList: [], debugResult: new Map, + drawer: false, } }, created() { @@ -423,6 +442,9 @@ } }, methods: { + showAllBtn() { + this.$refs.maximizeScenario.showAll(); + }, addListener() { document.addEventListener("keydown", this.createCtrlSHandle); // document.addEventListener("keydown", (even => handleCtrlSEvent(even, this.$refs.httpApi.saveApi))); @@ -443,6 +465,7 @@ // 直接更新场景防止编辑内容丢失 this.editScenario(); } + this.$refs.maximizeHeader.getVariableSize(); this.reload(); }, showButton(...names) { @@ -697,8 +720,7 @@ } this.sort(); this.reload(); - } - , + }, reload() { this.loading = true this.$nextTick(() => { @@ -1046,7 +1068,14 @@ // 把执行结果分发给各个请求 this.debugResult = result; this.sort() + }, + fullScreen() { + this.drawer = true; + }, + close() { + this.drawer = false; } + } } @@ -1112,7 +1141,7 @@ } /deep/ .el-card__body { - padding: 15px; + padding: 10px; } /deep/ .el-drawer__body { @@ -1182,4 +1211,17 @@ .ms-sc-variable-header >>> .el-dialog__body { padding: 0px 20px; } + + .alt-ico { + font-size: 15px; + margin: 0px 10px 0px; + color: #8c939d; + } + + .alt-ico:hover { + color: black; + cursor: pointer; + font-size: 18px; + } + diff --git a/frontend/src/business/components/api/automation/scenario/Setting.js b/frontend/src/business/components/api/automation/scenario/Setting.js index 9ddffe168a..28d54980b6 100644 --- a/frontend/src/business/components/api/automation/scenario/Setting.js +++ b/frontend/src/business/components/api/automation/scenario/Setting.js @@ -16,6 +16,9 @@ export const ELEMENTS = new Map([ ['Extract', []], ['JmeterElement', []], ['CustomizeReq', ["ConstantTimer", "JSR223PreProcessor", "JSR223PostProcessor", "Assertions", "Extract"]], + ['MaxSamplerProxy', ["JSR223PreProcessor", "JSR223PostProcessor", "Assertions", "Extract"]], + ['AllSamplerProxy', ["HTTPSamplerProxy", "DubboSampler", "JDBCSampler", "TCPSampler"]], + ]) export const ELEMENT_TYPE = { diff --git a/frontend/src/business/components/api/automation/scenario/common/ApiBaseComponent.vue b/frontend/src/business/components/api/automation/scenario/common/ApiBaseComponent.vue index 1090ac3b5b..dbd1d4102b 100644 --- a/frontend/src/business/components/api/automation/scenario/common/ApiBaseComponent.vue +++ b/frontend/src/business/components/api/automation/scenario/common/ApiBaseComponent.vue @@ -1,47 +1,46 @@ + + diff --git a/frontend/src/business/components/api/automation/scenario/maximize/MaximizeScenario.vue b/frontend/src/business/components/api/automation/scenario/maximize/MaximizeScenario.vue new file mode 100644 index 0000000000..ea3127afe3 --- /dev/null +++ b/frontend/src/business/components/api/automation/scenario/maximize/MaximizeScenario.vue @@ -0,0 +1,1050 @@ + + + + + diff --git a/frontend/src/business/components/api/automation/scenario/maximize/ScenarioHeader.vue b/frontend/src/business/components/api/automation/scenario/maximize/ScenarioHeader.vue new file mode 100644 index 0000000000..d957231385 --- /dev/null +++ b/frontend/src/business/components/api/automation/scenario/maximize/ScenarioHeader.vue @@ -0,0 +1,146 @@ + + + + + diff --git a/frontend/src/business/components/api/definition/components/ApiKeyValue.vue b/frontend/src/business/components/api/definition/components/ApiKeyValue.vue index 6f9631e8e0..056f5c49d1 100644 --- a/frontend/src/business/components/api/definition/components/ApiKeyValue.vue +++ b/frontend/src/business/components/api/definition/components/ApiKeyValue.vue @@ -3,21 +3,14 @@ {{ description }} - - - {{ $t('api_test.select_or_invert') }} - - - {{ $t('api_test.select_all') }} - {{ $t('api_test.invert_select') }} - - + + +
- - @@ -59,7 +52,7 @@ valuePlaceholder: String, isShowEnable: { type: Boolean, - default: false + default: true }, description: String, items: Array, @@ -73,6 +66,7 @@ return { keyValues: [], loading: false, + isSelectAll: true } }, computed: { @@ -83,7 +77,15 @@ return this.valuePlaceholder || this.$t("api_test.value"); } }, - + watch: { + isSelectAll: function(to, from) { + if(from == false && to == true) { + this.selectAll(); + } else if(from == true && to == false) { + this.invertSelect(); + } + } + }, methods: { moveBottom(index) { if (this.items.length < 2 || index === this.items.length - 2) { @@ -154,7 +156,7 @@ }, invertSelect() { this.items.forEach(item => { - item.enable = !item.enable; + item.enable = false; }); }, }, diff --git a/frontend/src/business/components/api/definition/components/ApiVariable.vue b/frontend/src/business/components/api/definition/components/ApiVariable.vue index ca8cb56669..6ba88c2dbf 100644 --- a/frontend/src/business/components/api/definition/components/ApiVariable.vue +++ b/frontend/src/business/components/api/definition/components/ApiVariable.vue @@ -3,19 +3,13 @@ {{ description }} - - - {{ $t('api_test.select_or_invert') }} - - - {{ $t('api_test.select_all') }} - {{ $t('api_test.invert_select') }} - - + + +
- @@ -131,8 +125,18 @@ return { currentItem: null, requireds: REQUIRED, + isSelectAll: true, } }, + watch: { + isSelectAll: function(to, from) { + if(from == false && to == true) { + this.selectAll(); + } else if(from == true && to == false) { + this.invertSelect(); + } + }, + }, computed: { keyText() { return this.keyPlaceholder || this.$t("api_test.key"); @@ -191,7 +195,7 @@ // TODO 检查key重复 }, isDisable: function (index) { - return this.parameters.length - 1 === index; + return this.parameters.length - 1 == index; }, querySearch(queryString, cb) { let suggestions = this.suggestions; @@ -235,7 +239,7 @@ }, invertSelect() { this.parameters.forEach(item => { - item.enable = !item.enable; + item.enable = false; }); }, }, diff --git a/frontend/src/business/components/api/definition/components/assertion/ApiAssertions.vue b/frontend/src/business/components/api/definition/components/assertion/ApiAssertions.vue index 17a7d5d5a2..190d4bdc9e 100644 --- a/frontend/src/business/components/api/definition/components/assertion/ApiAssertions.vue +++ b/frontend/src/business/components/api/definition/components/assertion/ApiAssertions.vue @@ -6,6 +6,8 @@ @active="active" :data="assertions" :draggable="draggable" + :is-max="isMax" + :show-btn="showBtn" color="#A30014" background-color="#F7E6E9" :title="$t('api_test.definition.request.assertions_rule')"> @@ -87,6 +89,14 @@ type: Boolean, default: false, }, + isMax: { + type: Boolean, + default: false, + }, + showBtn: { + type: Boolean, + default: true, + }, assertions: {}, node: {}, request: {}, diff --git a/frontend/src/business/components/api/definition/components/complete/EditCompleteHTTPApi.vue b/frontend/src/business/components/api/definition/components/complete/EditCompleteHTTPApi.vue index 5fac84d2a1..7b4aacf154 100644 --- a/frontend/src/business/components/api/definition/components/complete/EditCompleteHTTPApi.vue +++ b/frontend/src/business/components/api/definition/components/complete/EditCompleteHTTPApi.vue @@ -142,7 +142,7 @@ export default { status: [{required: true, message: this.$t('commons.please_select'), trigger: 'change'}], }, httpForm: {environmentId: "", tags: []}, - isShowEnable: false, + isShowEnable: true, maintainerOptions: [], currentModule: {}, reqOptions: REQ_METHOD, diff --git a/frontend/src/business/components/api/definition/components/extract/ApiExtract.vue b/frontend/src/business/components/api/definition/components/extract/ApiExtract.vue index edd56731f9..3b8fab00a6 100644 --- a/frontend/src/business/components/api/definition/components/extract/ApiExtract.vue +++ b/frontend/src/business/components/api/definition/components/extract/ApiExtract.vue @@ -5,6 +5,8 @@ @active="active" :data="extract" :draggable="draggable" + :is-max="isMax" + :show-btn="showBtn" color="#015478" background-color="#E6EEF2" :title="$t('api_test.definition.request.extract_param')"> @@ -41,26 +43,26 @@ diff --git a/frontend/src/business/components/common/components/MsTableHeader.vue b/frontend/src/business/components/common/components/MsTableHeader.vue index 2a9918eae9..3cf7c5c6d3 100644 --- a/frontend/src/business/components/common/components/MsTableHeader.vue +++ b/frontend/src/business/components/common/components/MsTableHeader.vue @@ -1,6 +1,6 @@