diff --git a/backend/src/main/java/io/metersphere/api/dto/automation/ApiTestReportVariable.java b/backend/src/main/java/io/metersphere/api/dto/automation/ApiTestReportVariable.java new file mode 100644 index 0000000000..85d040855b --- /dev/null +++ b/backend/src/main/java/io/metersphere/api/dto/automation/ApiTestReportVariable.java @@ -0,0 +1,11 @@ +package io.metersphere.api.dto.automation; + +import io.metersphere.base.domain.ApiTestReport; +import lombok.Data; + +@Data +public class ApiTestReportVariable extends ApiTestReport { + public String executionTime; + public String executor; + public String executionEnvironment; +} diff --git a/backend/src/main/java/io/metersphere/api/jmeter/APIBackendListenerClient.java b/backend/src/main/java/io/metersphere/api/jmeter/APIBackendListenerClient.java index 92e92bc216..a7fc09efec 100644 --- a/backend/src/main/java/io/metersphere/api/jmeter/APIBackendListenerClient.java +++ b/backend/src/main/java/io/metersphere/api/jmeter/APIBackendListenerClient.java @@ -1,10 +1,11 @@ package io.metersphere.api.jmeter; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import io.metersphere.api.dto.automation.ApiTestReportVariable; import io.metersphere.api.dto.scenario.request.RequestType; import io.metersphere.api.service.*; -import io.metersphere.base.domain.ApiDefinitionExecResult; -import io.metersphere.base.domain.ApiScenarioReport; -import io.metersphere.base.domain.ApiTestReport; +import io.metersphere.base.domain.*; import io.metersphere.commons.constants.*; import io.metersphere.commons.utils.CommonBeanFactory; import io.metersphere.commons.utils.LogUtil; @@ -27,6 +28,7 @@ import org.springframework.http.HttpMethod; import java.io.ByteArrayOutputStream; import java.io.PrintStream; import java.io.Serializable; +import java.text.SimpleDateFormat; import java.util.*; /** @@ -56,6 +58,8 @@ public class APIBackendListenerClient extends AbstractBackendListenerClient impl private ApiTestCaseService apiTestCaseService; + private ApiAutomationService apiAutomationService; + public String runMode = ApiRunMode.RUN.name(); // 测试ID @@ -110,7 +114,10 @@ public class APIBackendListenerClient extends AbstractBackendListenerClient impl if (apiTestCaseService == null) { LogUtil.error("apiTestCaseService is required"); } - + apiAutomationService = CommonBeanFactory.getBean(ApiAutomationService.class); + if (apiAutomationService == null) { + LogUtil.error("apiAutomationService is required"); + } super.setupTest(context); } @@ -169,6 +176,7 @@ public class APIBackendListenerClient extends AbstractBackendListenerClient impl testResult.getScenarios().addAll(scenarios.values()); testResult.getScenarios().sort(Comparator.comparing(ScenarioResult::getId)); ApiTestReport report = null; + ApiTestReportVariable reportTask = null; String reportUrl = null; // 这部分后续优化只留 DEFINITION 和 SCENARIO 两部分 if (StringUtils.equals(this.runMode, ApiRunMode.DEBUG.name())) { @@ -183,7 +191,6 @@ public class APIBackendListenerClient extends AbstractBackendListenerClient impl } else if (StringUtils.equals(this.runMode, ApiRunMode.JENKINS.name())) { apiDefinitionService.addResult(testResult); apiDefinitionExecResultService.saveApiResult(testResult, ApiRunMode.DEFINITION.name()); - } else if (StringUtils.equals(this.runMode, ApiRunMode.JENKINS_API_PLAN.name())) { apiDefinitionService.addResult(testResult); apiDefinitionExecResultService.saveApiResult(testResult, ApiRunMode.API_PLAN.name()); @@ -213,13 +220,35 @@ public class APIBackendListenerClient extends AbstractBackendListenerClient impl // 执行报告不需要存储,由用户确认后在存储 testResult.setTestId(testId); ApiScenarioReport scenarioReport = apiScenarioReportService.complete(testResult, this.runMode); + //环境 + ApiScenarioWithBLOBs apiScenario = apiAutomationService.getDto(scenarioReport.getScenarioId()); + String executionEnvironment = apiScenario.getScenarioDefinition(); + JSONObject json = JSONObject.parseObject(executionEnvironment); + JSONObject environment = JSONObject.parseObject(json.getString("environmentMap")); + String environmentId = environment.get(apiScenario.getProjectId()).toString(); + String name = apiAutomationService.get(environmentId).getName(); - report = new ApiTestReport(); - report.setStatus(scenarioReport.getStatus()); - report.setId(scenarioReport.getId()); - report.setTriggerMode(scenarioReport.getTriggerMode()); - report.setName(scenarioReport.getName()); + //时间 + Long time = apiScenario.getUpdateTime(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String executionTime = null; + String time_ = String.valueOf(time); + if (!time_.equals("null")) { + executionTime = sdf.format(new Date(Long.parseLong(time_))); + } + //执行人 + String userName = apiAutomationService.getUser(apiScenario.getUserId()).getName(); + + //报告内容 + reportTask = new ApiTestReportVariable(); + reportTask.setStatus(scenarioReport.getStatus()); + reportTask.setId(scenarioReport.getId()); + reportTask.setTriggerMode(scenarioReport.getTriggerMode()); + reportTask.setName(scenarioReport.getName()); + reportTask.setExecutor(userName); + reportTask.setExecutionTime(executionTime); + reportTask.setExecutionEnvironment(name); SystemParameterService systemParameterService = CommonBeanFactory.getBean(SystemParameterService.class); assert systemParameterService != null; BaseSystemConfigDTO baseSystemConfigDTO = systemParameterService.getBaseInfo(); @@ -247,13 +276,13 @@ public class APIBackendListenerClient extends AbstractBackendListenerClient impl } } - if (report != null && StringUtils.equals(ReportTriggerMode.API.name(), report.getTriggerMode())||StringUtils.equals(ReportTriggerMode.SCHEDULE.name(), report.getTriggerMode())) { - sendTask(report, reportUrl, testResult); + if (reportTask != null && StringUtils.equals(ReportTriggerMode.API.name(), reportTask.getTriggerMode()) || StringUtils.equals(ReportTriggerMode.SCHEDULE.name(), reportTask.getTriggerMode())) { + sendTask(reportTask, reportUrl, testResult); } } - private static void sendTask(ApiTestReport report, String reportUrl, TestResult testResult) { + private static void sendTask(ApiTestReportVariable report, String reportUrl, TestResult testResult) { if (report == null) { return; } @@ -270,13 +299,13 @@ public class APIBackendListenerClient extends AbstractBackendListenerClient impl String subject = ""; String event = ""; if (StringUtils.equals(ReportTriggerMode.API.name(), report.getTriggerMode())) { - successContext = "接口测试 API任务通知:'" + report.getName() + "'执行成功" + "\n" + "【接口定义暂无报告链接】" + "\n" + "请点击下面链接进入测试报告页面" + "\n" + "(旧版)接口测)路径" + url + "\n" + "(新版)接口测试路径" + url2; - failedContext = "接口测试 API任务通知:'" + report.getName() + "'执行失败" + "\n" + "【接口定义暂无报告链接】" + "\n" + "请点击下面链接进入测试报告页面" + "\n" + "(旧版)接口测试路径" + url + "\n" + "(新版)接口测试路径" + url2; + successContext = "接口测试 API任务通知:'" + report.getExecutor() + "所执行的" + report.getName() + "'执行成功" + "\n" + "执行环境:" + report.getExecutionEnvironment() + "\n" + "【接口定义暂无报告链接】" + "\n" + "请点击下面链接进入测试报告页面" + "\n" + "(旧版)接口测)路径" + url + "\n" + "(新版)接口测试路径" + url2; + failedContext = "接口测试 API任务通知:'" + report.getExecutor() + "所执行的" + report.getName() + "'执行失败" + "\n" + "执行环境:" + report.getExecutionEnvironment() + "\n" + "【接口定义暂无报告链接】" + "\n" + "请点击下面链接进入测试报告页面" + "\n" + "(旧版)接口测试路径" + url + "\n" + "(新版)接口测试路径" + url2; subject = Translator.get("task_notification_jenkins"); } if (StringUtils.equals(ReportTriggerMode.SCHEDULE.name(), report.getTriggerMode())) { - successContext = "接口测试定时任务通知:'" + report.getName() + "'执行成功" + "\n" + "【接口定义暂无报告链接】" + "\n" + "请点击下面链接进入测试报告页面" + "\n" + "(旧版)接口测试路径" + url + "\n" + "(新版)接口测试路径" + url2; - failedContext = "接口测试定时任务通知:'" + report.getName() + "'执行失败" + "\n" + "【接口定义暂无报告链接】" + "\n" + "请点击下面链接进入测试报告页面" + "\n" + "(旧版)接口测试路径" + url + "\n" + "(新版)接口测试路径" + url2; + successContext = "接口测试定时任务通知:'" + report.getExecutor() + "所执行的" + report.getName() + "'执行成功" + "\n" + "执行环境:" + report.getExecutionEnvironment() + "\n" + "【接口定义暂无报告链接】" + "\n" + "请点击下面链接进入测试报告页面" + "\n" + "(旧版)接口测试路径" + url + "\n" + "(新版)接口测试路径" + url2; + failedContext = "接口测试定时任务通知:'" + report.getExecutor() + "所执行的" + report.getName() + "'执行失败" + "\n" + "执行环境:" + report.getExecutionEnvironment() + "\n" + "【接口定义暂无报告链接】" + "\n" + "请点击下面链接进入测试报告页面" + "\n" + "(旧版)接口测试路径" + url + "\n" + "(新版)接口测试路径" + url2; subject = Translator.get("task_notification"); } if (StringUtils.equals("Success", report.getStatus())) { @@ -297,6 +326,9 @@ public class APIBackendListenerClient extends AbstractBackendListenerClient impl paramMap.put("type", "api"); paramMap.put("url", baseSystemConfigDTO.getUrl()); paramMap.put("status", report.getStatus()); + paramMap.put("executor", report.getExecutor()); + paramMap.put("executionTime", report.getExecutionTime()); + paramMap.put("executionEnvironment", report.getExecutionEnvironment()); NoticeModel noticeModel = NoticeModel.builder() .successContext(successContext) .successMailTemplate("ApiSuccessfulNotification") 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 a577698cf3..631c5c3cce 100644 --- a/backend/src/main/java/io/metersphere/api/service/ApiAutomationService.java +++ b/backend/src/main/java/io/metersphere/api/service/ApiAutomationService.java @@ -100,6 +100,22 @@ public class ApiAutomationService { private ApiTestCaseService apiTestCaseService; @Resource private ApiDefinitionService apiDefinitionService; + @Resource + private ApiTestEnvironmentMapper apiTestEnvironmentMapper; + @Resource + private UserMapper userMapper; + + public ApiScenarioWithBLOBs getDto(String id) { + return apiScenarioMapper.selectByPrimaryKey(id); + } + + public ApiTestEnvironment get(String id) { + return apiTestEnvironmentMapper.selectByPrimaryKey(id); + } + + public User getUser(String id) { + return userMapper.selectByPrimaryKey(id); + } public List list(ApiScenarioRequest request) { request = this.initRequest(request, true, true); diff --git a/frontend/src/business/components/api/automation/schedule/ScheduleNotification.vue b/frontend/src/business/components/api/automation/schedule/ScheduleNotification.vue index 1c1f284b26..7bd51988d1 100644 --- a/frontend/src/business/components/api/automation/schedule/ScheduleNotification.vue +++ b/frontend/src/business/components/api/automation/schedule/ScheduleNotification.vue @@ -11,7 +11,8 @@ title="示例" width="400" trigger="click" - :content="title"> + > + {{ $t('organization.message.mail_template_example') }} @@ -21,7 +22,8 @@ title="示例" width="400" trigger="click" - :content="robotTitle"> + > + {{ $t('organization.message.robot_template') }} @@ -136,12 +138,14 @@