提交 017f8640 编写于 作者: C chenjianxing

测试报告同步

上级 147fba84
......@@ -146,6 +146,12 @@
<version>2.9</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.3</version>
</dependency>
</dependencies>
<build>
......
package io.metersphere.base.domain;
public class FucLog {
public class FucTestLog {
private String seleniumLog;
private String browserDriverLog;
......
package io.metersphere.base.domain;
public class ZaleniumTest {
private String seleniumSessionId;
private String testName;
private String timestamp;
private String addedToDashboardTime;
private String browser;
private String browserVersion;
private String proxyName;
private String platform;
private String fileName;
private String fileExtension;
private String videoFolderPath;
private String logsFolderPath;
private String testNameNoExtension;
private String screenDimension;
private String timeZone;
private String build;
private String testFileNameTemplate;
private String browserDriverLogFileName;
private String retentionDate;
private String testStatus;
private boolean videoRecorded;
public String getSeleniumSessionId() {
return seleniumSessionId;
}
public void setSeleniumSessionId(String seleniumSessionId) {
this.seleniumSessionId = seleniumSessionId;
}
public String getTestName() {
return testName;
}
public void setTestName(String testName) {
this.testName = testName;
}
public String getTimestamp() {
return timestamp;
}
public void setTimestamp(String timestamp) {
this.timestamp = timestamp;
}
public String getAddedToDashboardTime() {
return addedToDashboardTime;
}
public void setAddedToDashboardTime(String addedToDashboardTime) {
this.addedToDashboardTime = addedToDashboardTime;
}
public String getBrowser() {
return browser;
}
public void setBrowser(String browser) {
this.browser = browser;
}
public String getBrowserVersion() {
return browserVersion;
}
public void setBrowserVersion(String browserVersion) {
this.browserVersion = browserVersion;
}
public String getProxyName() {
return proxyName;
}
public void setProxyName(String proxyName) {
this.proxyName = proxyName;
}
public String getPlatform() {
return platform;
}
public void setPlatform(String platform) {
this.platform = platform;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String getFileExtension() {
return fileExtension;
}
public void setFileExtension(String fileExtension) {
this.fileExtension = fileExtension;
}
public String getVideoFolderPath() {
return videoFolderPath;
}
public void setVideoFolderPath(String videoFolderPath) {
this.videoFolderPath = videoFolderPath;
}
public String getLogsFolderPath() {
return logsFolderPath;
}
public void setLogsFolderPath(String logsFolderPath) {
this.logsFolderPath = logsFolderPath;
}
public String getTestNameNoExtension() {
return testNameNoExtension;
}
public void setTestNameNoExtension(String testNameNoExtension) {
this.testNameNoExtension = testNameNoExtension;
}
public String getScreenDimension() {
return screenDimension;
}
public void setScreenDimension(String screenDimension) {
this.screenDimension = screenDimension;
}
public String getTimeZone() {
return timeZone;
}
public void setTimeZone(String timeZone) {
this.timeZone = timeZone;
}
public String getBuild() {
return build;
}
public void setBuild(String build) {
this.build = build;
}
public String getTestFileNameTemplate() {
return testFileNameTemplate;
}
public void setTestFileNameTemplate(String testFileNameTemplate) {
this.testFileNameTemplate = testFileNameTemplate;
}
public String getBrowserDriverLogFileName() {
return browserDriverLogFileName;
}
public void setBrowserDriverLogFileName(String browserDriverLogFileName) {
this.browserDriverLogFileName = browserDriverLogFileName;
}
public String getRetentionDate() {
return retentionDate;
}
public void setRetentionDate(String retentionDate) {
this.retentionDate = retentionDate;
}
public String getTestStatus() {
return testStatus;
}
public void setTestStatus(String testStatus) {
this.testStatus = testStatus;
}
public boolean isVideoRecorded() {
return videoRecorded;
}
public void setVideoRecorded(boolean videoRecorded) {
this.videoRecorded = videoRecorded;
}
}
......@@ -5,7 +5,7 @@
<select id="getReportList" resultType="io.metersphere.dto.FunctionalReportDTO">
select ltr.id, ltr.name, ltr.test_id as testId, ltr.description,
ltr.create_time as createTime, ltr.update_time as updateTime, ltr.status as status, lt.name as testName
from fuc_test_report ltr join fuc_test lt on ltr.test_id = lt.id
from fuc_test_report ltr left join fuc_test lt on ltr.test_id = lt.id
<where>
<if test="reportRequest.name != null">
AND ltr.name like CONCAT('%', #{reportRequest.name},'%')
......@@ -15,9 +15,10 @@
<select id="getReportTestAndProInfo" resultType="io.metersphere.dto.FunctionalReportDTO">
select ltr.id, ltr.name, ltr.test_id as testId, ltr.description,
ltr.create_time as createTime, ltr.update_time as updateTime, ltr.status as status, lt.name as testName,
ltr.create_time as createTime, ltr.update_time as updateTime, ltr.status as status, ltr.content as content,
lt.name as testName,
p.id as projectId, p.name as projectName
from fuc_test_report ltr join fuc_test lt on ltr.test_id = lt.id join project p on lt.project_id = p.id
from fuc_test_report ltr left join fuc_test lt on ltr.test_id = lt.id left join project p on lt.project_id = p.id
where ltr.id = #{id}
</select>
......
......@@ -2,19 +2,16 @@ package io.metersphere.config;
import io.metersphere.proxy.ProxyServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.EnvironmentAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
@Configuration
public class SolrProxyServletConfiguration {
public class ProxyServletConfiguration {
@Bean
public ServletRegistrationBean servletRegistrationBean(){
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new ProxyServlet(), "/solr/*");
// servletRegistrationBean.addInitParameter("targetUri", "http://localhost:4444");
// servletRegistrationBean.addInitParameter(ProxyServlet.P_LOG, "false");
//代理到hub节点获取录像
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new ProxyServlet(), "/proxy/*");
return servletRegistrationBean;
}
......
package io.metersphere.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate getRestTemplate() {
HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
httpRequestFactory.setConnectionRequestTimeout(3000);
httpRequestFactory.setConnectTimeout(3000);
httpRequestFactory.setReadTimeout(3000);
return new RestTemplate(httpRequestFactory);
}
}
......@@ -2,6 +2,7 @@ package io.metersphere.controller;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import io.metersphere.base.domain.FucTestLog;
import io.metersphere.base.domain.FucTestReport;
import io.metersphere.commons.constants.RoleConstants;
import io.metersphere.commons.utils.PageUtils;
......@@ -30,7 +31,6 @@ public class FunctionalReportController {
String currentWorkspaceId = SessionUtils.getCurrentWorkspaceId();
ReportRequest request = new ReportRequest();
request.setWorkspaceId(currentWorkspaceId);
// 最近 `count` 个项目
PageHelper.startPage(1, count);
return functionalReportService.getRecentReportList(request);
}
......@@ -46,11 +46,15 @@ public class FunctionalReportController {
functionalReportService.deleteReport(reportId);
}
@GetMapping("/test/pro/info/{reportId}")
public FunctionalReportDTO getReportTestAndProInfo(@PathVariable String reportId) {
return functionalReportService.getReportTestAndProInfo(reportId);
}
@GetMapping("/test/log/{reportId}")
public FucTestLog getTestLog(@PathVariable String reportId) {
return functionalReportService.getTestLog(reportId);
}
}
package io.metersphere.job;
import io.metersphere.commons.utils.LogUtil;
import io.metersphere.service.ZaleniumService;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import javax.annotation.Resource;
@Configuration
@EnableScheduling
public class ZaleniumJob {
@Resource
ZaleniumService zaleniumService;
@Scheduled(cron = "0 0/1 * * * ?")
public void syncFucTestReport(){
LogUtil.info("============= start sync FucTestReport =============");
zaleniumService.syncTestResult();
LogUtil.info("============= end sync FucTestReport =============");
}
}
package io.metersphere.service;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import io.metersphere.base.domain.FucTestLog;
import io.metersphere.base.domain.FucTestReport;
import io.metersphere.base.domain.FucTestReportExample;
import io.metersphere.base.mapper.FucTestReportMapper;
......@@ -20,6 +23,8 @@ public class FunctionalReportService {
private FucTestReportMapper fucTestReportMapper;
@Resource
private ExtFunctionalTestReportMapper extFunctionalTestReportMapper;
@Resource
private ZaleniumService zaleniumService;
public List<FucTestReport> getRecentReportList(ReportRequest request) {
FucTestReportExample example = new FucTestReportExample();
......@@ -38,4 +43,12 @@ public class FunctionalReportService {
public FunctionalReportDTO getReportTestAndProInfo(String reportId) {
return extFunctionalTestReportMapper.getReportTestAndProInfo(reportId);
}
public FucTestLog getTestLog(String reportId) {
FucTestReport fucTestReport = fucTestReportMapper.selectByPrimaryKey(reportId);
String content = fucTestReport.getContent();
String endpoint = "http://localhost:4444";
FucTestLog fucTestLogs = JSON.parseObject(content, FucTestLog.class);
return zaleniumService.getFucTestLog(endpoint, fucTestLogs);
}
}
package io.metersphere.service;
import com.alibaba.fastjson.JSONObject;
import io.metersphere.base.domain.*;
import io.metersphere.base.mapper.FucTestMapper;
import io.metersphere.base.mapper.FucTestReportMapper;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
@Service
public class ZaleniumService {
@Resource
RestTemplate restTemplate;
@Resource
FucTestReportMapper fucTestReportMapper;
@Resource
FucTestMapper fucTestMapper;
public void syncTestResult(){
List<ZaleniumTest> zaleniumTests = getZaleniumTest();
List<String> fucTestIds = zaleniumTests.stream().map(test -> test.getTestName())
.collect(Collectors.toList());
FucTestExample fucTestExample = new FucTestExample();
fucTestExample.createCriteria().andIdIn(fucTestIds);
List<FucTest> fucTests = fucTestMapper.selectByExample(fucTestExample);
List<String> reportIds = fucTestReportMapper.selectByExample(new FucTestReportExample()).stream().map(report -> report.getId()).collect(Collectors.toList());
Map<String, FucTest> fucTestMaps = fucTests.stream()
.collect(Collectors.toMap(FucTest::getId, Function.identity()));
zaleniumTests.forEach(item -> {
if(!reportIds.contains(item.getTestName())){
saveFucTestReport(item, fucTestMaps.get(item.getTestName()));
}
});
}
private void saveFucTestReport(ZaleniumTest item, FucTest fucTest) {
FucTestReport fucTestReport = new FucTestReport();
fucTestReport.setCreateTime(System.currentTimeMillis());
fucTestReport.setUpdateTime(System.currentTimeMillis());
fucTestReport.setTestId(item.getTestName());
fucTestReport.setStatus("1");
fucTestReport.setId(item.getTestName());
JSONObject content = new JSONObject();
content.put("videoUrl", "dashboard/" + item.getFileName());
content.put("seleniumLog", "dashboard/logs/" + item.getTestNameNoExtension() + "/selenium-multinode-stderr.log");
content.put("browserDriverLog", "dashboard/" + item.getBrowserDriverLogFileName());
fucTestReport.setContent(content.toJSONString());
if(fucTest != null){
fucTestReport.setDescription(fucTest.getDescription());
fucTestReport.setName(fucTest.getName());
} else {
fucTestReport.setDescription("ZaleniumTest");
fucTestReport.setName(item.getTestName());
}
fucTestReportMapper.insert(fucTestReport);
}
private List<ZaleniumTest> getZaleniumTest() {
List<ZaleniumTest> tests = new ArrayList<>();
String url = "http://localhost:4444/dashboard/information?lastDateAddedToDashboard=0";
tests.addAll(Arrays.asList(restTemplate.getForObject(url, ZaleniumTest[].class)));
return tests;
}
public FucTestLog getFucTestLog(String endpoint, FucTestLog logPaths) {
FucTestLog testLog = new FucTestLog();
testLog.setSeleniumLog(getZaleniumTestLog(endpoint, logPaths.getSeleniumLog()));
testLog.setBrowserDriverLog(getZaleniumTestLog(endpoint, logPaths.getBrowserDriverLog()));
return testLog;
}
private String getZaleniumTestLog(String endpoint, String logPath) {
return restTemplate.getForObject(endpoint + "/" + logPath, String.class);
}
}
package io.metersphere;
import io.metersphere.service.ZaleniumService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class ZaleniumTest {
@Resource
ZaleniumService zaleniumService;
@Test
public void sysnZaleniumTest(){
zaleniumService.syncTestResult();
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册