diff --git a/api-test/backend/src/main/java/io/metersphere/api/dto/definition/request/MsScenario.java b/api-test/backend/src/main/java/io/metersphere/api/dto/definition/request/MsScenario.java index b8433da767..34d61d96f8 100644 --- a/api-test/backend/src/main/java/io/metersphere/api/dto/definition/request/MsScenario.java +++ b/api-test/backend/src/main/java/io/metersphere/api/dto/definition/request/MsScenario.java @@ -230,7 +230,7 @@ public class MsScenario extends MsTestElement { orgJSONArray.forEach(obj -> { JSONObject orgJsonObject = (JSONObject) obj; hashTree.forEach(targetObj -> { - if (StringUtils.equals(orgJsonObject.optString(MsHashTreeService.ID), targetObj.getId())) { + if (StringUtils.equals(orgJsonObject.optString(MsHashTreeService.RESOURCE_ID), targetObj.getResourceId())) { setRefEnable(targetObj, orgJsonObject); } }); diff --git a/api-test/backend/src/main/java/io/metersphere/api/exec/generator/JSONSchemaRunTest.java b/api-test/backend/src/main/java/io/metersphere/api/exec/generator/JSONSchemaRunTest.java index f69bd76b0e..519759f689 100644 --- a/api-test/backend/src/main/java/io/metersphere/api/exec/generator/JSONSchemaRunTest.java +++ b/api-test/backend/src/main/java/io/metersphere/api/exec/generator/JSONSchemaRunTest.java @@ -3,10 +3,8 @@ package io.metersphere.api.exec.generator; import com.google.gson.*; import io.metersphere.commons.constants.PropertyConstant; -import io.metersphere.commons.utils.EnumPropertyUtil; import io.metersphere.commons.utils.JSONUtil; import io.metersphere.jmeter.utils.ScriptEngineUtils; -import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; import org.json.JSONArray; @@ -14,7 +12,6 @@ import org.json.JSONObject; import org.springframework.util.NumberUtils; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -252,12 +249,6 @@ public class JSONSchemaRunTest { if (isMock(object)) { String value = ScriptEngineUtils.buildFunctionCallString(object.get(PropertyConstant.MOCK).getAsJsonObject().get(PropertyConstant.MOCK).getAsString()); return value; - } else if (object.has(PropertyConstant.ENUM)) { - List list = EnumPropertyUtil.analyzeEnumProperty(object); - if (CollectionUtils.isNotEmpty(list)) { - int index = (int) (Math.random() * list.size()); - return list.get(index); - } } } catch (Exception e) { return object.get(PropertyConstant.MOCK).getAsJsonObject().get(PropertyConstant.MOCK); diff --git a/api-test/backend/src/main/java/io/metersphere/api/exec/queue/ExecTask.java b/api-test/backend/src/main/java/io/metersphere/api/exec/queue/ExecTask.java index bfb6040d7e..66dab13a82 100644 --- a/api-test/backend/src/main/java/io/metersphere/api/exec/queue/ExecTask.java +++ b/api-test/backend/src/main/java/io/metersphere/api/exec/queue/ExecTask.java @@ -2,7 +2,6 @@ package io.metersphere.api.exec.queue; import io.metersphere.api.jmeter.JMeterService; import io.metersphere.api.jmeter.JMeterThreadUtils; -import io.metersphere.cache.JMeterEngineCache; import io.metersphere.commons.utils.CommonBeanFactory; import io.metersphere.dto.JmeterRunRequestDTO; import io.metersphere.utils.LoggerUtil; @@ -24,9 +23,6 @@ public class ExecTask implements Runnable { Object res = PoolExecBlockingQueueUtil.take(request.getReportId()); if (res == null && !JMeterThreadUtils.isRunning(request.getReportId(), request.getTestId())) { LoggerUtil.info("任务执行超时", request.getReportId()); - if (JMeterEngineCache.runningEngine.containsKey(request.getReportId())) { - JMeterEngineCache.runningEngine.remove(request.getReportId()); - } } } } diff --git a/api-test/backend/src/main/java/io/metersphere/api/jmeter/MsApiBackendListener.java b/api-test/backend/src/main/java/io/metersphere/api/jmeter/MsApiBackendListener.java index c9a288bc51..11d7091983 100644 --- a/api-test/backend/src/main/java/io/metersphere/api/jmeter/MsApiBackendListener.java +++ b/api-test/backend/src/main/java/io/metersphere/api/jmeter/MsApiBackendListener.java @@ -3,7 +3,6 @@ package io.metersphere.api.jmeter; import io.metersphere.api.exec.queue.PoolExecBlockingQueueUtil; import io.metersphere.api.jmeter.utils.ReportStatusUtil; -import io.metersphere.cache.JMeterEngineCache; import io.metersphere.commons.constants.CommonConstants; import io.metersphere.commons.utils.CommonBeanFactory; import io.metersphere.commons.utils.FileUtils; @@ -121,9 +120,6 @@ public class MsApiBackendListener extends AbstractBackendListenerClient implemen LoggerUtil.info("进入监听,开始关闭CSV", dto.getReportId()); FileServer.getFileServer().closeCsv(dto.getReportId()); } - if (JMeterEngineCache.runningEngine.containsKey(dto.getReportId())) { - JMeterEngineCache.runningEngine.remove(dto.getReportId()); - } } } diff --git a/api-test/backend/src/main/java/io/metersphere/service/RemakeReportService.java b/api-test/backend/src/main/java/io/metersphere/service/RemakeReportService.java index 5c43fe992f..80303e274e 100644 --- a/api-test/backend/src/main/java/io/metersphere/service/RemakeReportService.java +++ b/api-test/backend/src/main/java/io/metersphere/service/RemakeReportService.java @@ -16,7 +16,6 @@ import io.metersphere.base.mapper.ApiScenarioReportMapper; import io.metersphere.base.mapper.ApiTestCaseMapper; import io.metersphere.base.mapper.plan.TestPlanApiCaseMapper; import io.metersphere.base.mapper.plan.TestPlanApiScenarioMapper; -import io.metersphere.cache.JMeterEngineCache; import io.metersphere.commons.constants.ApiRunMode; import io.metersphere.commons.enums.ApiReportStatus; import io.metersphere.commons.utils.BeanUtils; @@ -153,9 +152,6 @@ public class RemakeReportService { dto.setQueueId(request.getQueueId()); dto.setTestId(request.getTestId()); - if (JMeterEngineCache.runningEngine.containsKey(dto.getReportId())) { - JMeterEngineCache.runningEngine.remove(dto.getReportId()); - } LoggerUtil.info("进入异常结果处理:" + dto.getRunMode() + " 整体处理完成", dto.getReportId()); // 全局并发队列 PoolExecBlockingQueueUtil.offer(dto.getReportId()); diff --git a/api-test/backend/src/main/java/io/metersphere/service/definition/ApiTestCaseService.java b/api-test/backend/src/main/java/io/metersphere/service/definition/ApiTestCaseService.java index d14bd88cba..f9e9bf0528 100644 --- a/api-test/backend/src/main/java/io/metersphere/service/definition/ApiTestCaseService.java +++ b/api-test/backend/src/main/java/io/metersphere/service/definition/ApiTestCaseService.java @@ -1064,21 +1064,24 @@ public class ApiTestCaseService { } try { List envIds = environments.stream().filter(t -> StringUtils.isNotBlank(t.getValue()) && !StringUtils.equalsIgnoreCase(t.getValue(), "null")).map(ParamsDTO::getValue).collect(Collectors.toList()); - ApiTestEnvironmentExample example = new ApiTestEnvironmentExample(); - example.createCriteria().andIdIn(envIds); - List environmentList = apiTestEnvironmentMapper.selectByExample(example); - if (CollectionUtils.isEmpty(environmentList)) { - return null; - } - Map envMap = environmentList.stream().collect(Collectors.toMap(ApiTestEnvironment::getId, ApiTestEnvironment::getName)); + if (CollectionUtils.isNotEmpty(envIds)) { + ApiTestEnvironmentExample example = new ApiTestEnvironmentExample(); + example.createCriteria().andIdIn(envIds); + List environmentList = apiTestEnvironmentMapper.selectByExample(example); - Map caseEnvMap = environments.stream().filter(t -> StringUtils.isNotBlank(t.getValue()) && !StringUtils.equalsIgnoreCase(t.getValue(), "null")).collect(HashMap::new, (m, v) -> m.put(v.getId(), v.getValue()), HashMap::putAll); - caseEnvMap.forEach((k, v) -> { - if (envMap.containsKey(v)) { - caseEnvMap.put(k, envMap.get(v)); + if (CollectionUtils.isEmpty(environmentList)) { + return null; } - }); - return caseEnvMap; + Map envMap = environmentList.stream().collect(Collectors.toMap(ApiTestEnvironment::getId, ApiTestEnvironment::getName)); + + Map caseEnvMap = environments.stream().filter(t -> StringUtils.isNotBlank(t.getValue()) && !StringUtils.equalsIgnoreCase(t.getValue(), "null")).collect(HashMap::new, (m, v) -> m.put(v.getId(), v.getValue()), HashMap::putAll); + caseEnvMap.forEach((k, v) -> { + if (envMap.containsKey(v)) { + caseEnvMap.put(k, envMap.get(v)); + } + }); + return caseEnvMap; + } } catch (Exception e) { LogUtil.error("api case environmentId incorrect parsing", e); } diff --git a/api-test/backend/src/main/java/io/metersphere/service/ext/ExtApiTaskService.java b/api-test/backend/src/main/java/io/metersphere/service/ext/ExtApiTaskService.java index d0875f7966..5ac3070d91 100644 --- a/api-test/backend/src/main/java/io/metersphere/service/ext/ExtApiTaskService.java +++ b/api-test/backend/src/main/java/io/metersphere/service/ext/ExtApiTaskService.java @@ -4,21 +4,20 @@ import io.metersphere.api.exec.queue.ExecThreadPoolExecutor; import io.metersphere.api.exec.queue.PoolExecBlockingQueueUtil; import io.metersphere.api.jmeter.JMeterService; import io.metersphere.api.jmeter.JMeterThreadUtils; -import io.metersphere.service.ApiExecutionQueueService; import io.metersphere.base.domain.*; import io.metersphere.base.mapper.ApiDefinitionExecResultMapper; import io.metersphere.base.mapper.ApiScenarioReportMapper; import io.metersphere.base.mapper.TestResourceMapper; import io.metersphere.base.mapper.TestResourcePoolMapper; +import io.metersphere.base.mapper.ext.BaseTaskMapper; import io.metersphere.base.mapper.ext.ExtApiDefinitionExecResultMapper; import io.metersphere.base.mapper.ext.ExtApiScenarioReportMapper; -import io.metersphere.base.mapper.ext.BaseTaskMapper; import io.metersphere.commons.constants.ElementConstants; import io.metersphere.commons.enums.ApiReportStatus; import io.metersphere.commons.utils.JSON; import io.metersphere.commons.utils.LogUtil; import io.metersphere.dto.NodeDTO; -import io.metersphere.jmeter.LocalRunner; +import io.metersphere.service.ApiExecutionQueueService; import io.metersphere.task.dto.TaskCenterDTO; import io.metersphere.task.dto.TaskCenterRequest; import io.metersphere.task.dto.TaskRequestDTO; @@ -213,7 +212,6 @@ public class ExtApiTaskService extends TaskService { }}); } } else { - new LocalRunner().stop(reportId); JMeterThreadUtils.stop(reportId); } } diff --git a/api-test/frontend/src/business/automation/report/ApiReportDetail.vue b/api-test/frontend/src/business/automation/report/ApiReportDetail.vue index f5b7655ff6..f81ec557d6 100644 --- a/api-test/frontend/src/business/automation/report/ApiReportDetail.vue +++ b/api-test/frontend/src/business/automation/report/ApiReportDetail.vue @@ -695,6 +695,7 @@ export default { this.reportExportVisible = true; let reset = this.exportReportReset; let name = this.report.name; + name = this.encodeSearchKey(name); this.$nextTick(() => { setTimeout(() => { downloadPDF(document.getElementById('apiTestReport'), name || 'scenario-report'); @@ -702,6 +703,38 @@ export default { }, 5000); }); }, + // 对报告名称中的特殊字符进行编码 + encodeSearchKey(key) { + const encodeArr = [ + { + code: '%', + encode: '%25', + }, + { + code: '?', + encode: '%3F', + }, + { + code: '#', + encode: '%23', + }, + { + code: '&', + encode: '%26', + }, + { + code: '=', + encode: '%3D', + }, + ]; + return key.replace(/[%?#&=]/g, ($, index, str) => { + for (const k of encodeArr) { + if (k.code === $) { + return k.encode; + } + } + }); + }, handleSave() { if (!this.report.name) { this.$warning(this.$t('api_test.automation.report_name_info')); diff --git a/api-test/frontend/src/business/automation/scenario/component/LoopController.vue b/api-test/frontend/src/business/automation/scenario/component/LoopController.vue index 2bb8696dad..31329bb3be 100644 --- a/api-test/frontend/src/business/automation/scenario/component/LoopController.vue +++ b/api-test/frontend/src/business/automation/scenario/component/LoopController.vue @@ -328,7 +328,7 @@ export default { debugCode(data) { if (data && this.node && this.node.data) { if (data.error > 0) { - this.node.data.code = 'error'; + this.node.data.code = 'Error'; } else { this.node.data.code = this.node.data.code !== 'ERROR' ? 'Success' : 'Error'; } diff --git a/api-test/frontend/src/business/automation/scenario/component/TransactionController.vue b/api-test/frontend/src/business/automation/scenario/component/TransactionController.vue index c595a12b92..62f44768f1 100644 --- a/api-test/frontend/src/business/automation/scenario/component/TransactionController.vue +++ b/api-test/frontend/src/business/automation/scenario/component/TransactionController.vue @@ -133,9 +133,9 @@ export default { getCode() { if (this.node && this.node.data.code && this.node.data.debug) { if (this.node.data.code && this.node.data.code === 'ERROR') { - return 'error'; + return 'Error'; } else { - return 'success'; + return 'Success'; } } return ''; diff --git a/api-test/frontend/src/business/commons/json-schema/JsonSchemaEditor.vue b/api-test/frontend/src/business/commons/json-schema/JsonSchemaEditor.vue index e9fcb1b6a4..4c43f854ae 100644 --- a/api-test/frontend/src/business/commons/json-schema/JsonSchemaEditor.vue +++ b/api-test/frontend/src/business/commons/json-schema/JsonSchemaEditor.vue @@ -8,6 +8,7 @@ type="primary" size="mini" style="margin: 10px 10px 0px" + :disabled="isReadOnly" @click="openOneClickOperation"> {{ this.$t('commons.import') }} @@ -24,7 +25,7 @@ diff --git a/api-test/frontend/src/business/definition/components/body/ApiBody.vue b/api-test/frontend/src/business/definition/components/body/ApiBody.vue index cefe864d3f..8ea402f390 100644 --- a/api-test/frontend/src/business/definition/components/body/ApiBody.vue +++ b/api-test/frontend/src/business/definition/components/body/ApiBody.vue @@ -47,13 +47,19 @@
- +
addPrefix(String prefix, final ServerWebExchange exchange, final WebFilterChain chain) { + ServerHttpRequest req = exchange.getRequest(); + String path = req.getURI().getRawPath(); + ServerWebExchangeUtils.addOriginalRequestUrl(exchange, req.getURI()); + String newPath = prefix + path; + ServerHttpRequest request = req.mutate().path(newPath).build(); + exchange.getAttributes().put(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR, request.getURI()); + return chain.filter(exchange.mutate().request(request).build()); + } } diff --git a/framework/gateway/src/main/java/io/metersphere/gateway/service/SSOService.java b/framework/gateway/src/main/java/io/metersphere/gateway/service/SSOService.java index 317f9fb95f..2cbe010e9d 100644 --- a/framework/gateway/src/main/java/io/metersphere/gateway/service/SSOService.java +++ b/framework/gateway/src/main/java/io/metersphere/gateway/service/SSOService.java @@ -43,7 +43,10 @@ import java.nio.charset.StandardCharsets; import java.security.KeyManagementException; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; -import java.util.*; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; +import java.util.Optional; import java.util.concurrent.TimeUnit; @@ -243,6 +246,8 @@ public class SSOService { RestTemplate restTemplate = getRestTemplateIgnoreSSL(); HttpHeaders headers = new HttpHeaders(); headers.add(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE); + String credentials = EncryptUtils.base64Encoding(config.get("clientId") + ":" + config.get("secret")); + headers.add(HttpHeaders.AUTHORIZATION, "Basic " + credentials); HttpEntity param = new HttpEntity<>(headers); ResponseEntity response = restTemplate.postForEntity(url, param, String.class); String content = response.getBody(); @@ -263,7 +268,7 @@ public class SSOService { private Optional doOauth2Login(AuthSource authSource, String accessToken, WebSession session, Locale locale) throws Exception { Map oauth2Config = null; - Map resultObj = null; + Map resultObj = null; try { oauth2Config = JSON.parseObject(authSource.getConfiguration(), new TypeReference>() {}); String userInfoUrl = oauth2Config.get("userInfoUrl"); @@ -272,7 +277,7 @@ public class SSOService { RestTemplate restTemplate = getRestTemplateIgnoreSSL(); HttpEntity> httpEntity = new HttpEntity<>(headers); ResponseEntity response = restTemplate.exchange(userInfoUrl, HttpMethod.GET, httpEntity, String.class); - resultObj = JSON.parseObject(response.getBody(), new TypeReference>() {}); + resultObj = JSON.parseObject(response.getBody(), new TypeReference>() {}); } catch (Exception e) { LogUtil.error("fail to get user info", e); MSException.throwException("fail to get user info!"); @@ -281,9 +286,9 @@ public class SSOService { String attrMapping = oauth2Config.get("mapping"); Map mapping = this.getOauth2AttrMapping(attrMapping); - String userid = resultObj.get(mapping.get("userid")); - String username = resultObj.get(mapping.get("username")); - String email = resultObj.get(mapping.get("email")); + String userid = (String) resultObj.get(mapping.get("userid")); + String username = (String) resultObj.get(mapping.get("username")); + String email = (String) resultObj.get(mapping.get("email")); if (StringUtils.isBlank(userid)) { MSException.throwException("userid is empty!"); diff --git a/framework/sdk-parent/frontend/src/business/app-layout/index.vue b/framework/sdk-parent/frontend/src/business/app-layout/index.vue index 53df795fa3..6f235373b7 100644 --- a/framework/sdk-parent/frontend/src/business/app-layout/index.vue +++ b/framework/sdk-parent/frontend/src/business/app-layout/index.vue @@ -281,6 +281,8 @@ export default { .ms-right-fixed { flex: 0; margin-left: 0px; + height: calc(100vh); + background-color: #F5F6F7; } .ms-header-w { diff --git a/framework/sdk-parent/frontend/src/business/login/index.vue b/framework/sdk-parent/frontend/src/business/login/index.vue index 725a8d172a..9d83ab480b 100644 --- a/framework/sdk-parent/frontend/src/business/login/index.vue +++ b/framework/sdk-parent/frontend/src/business/login/index.vue @@ -329,10 +329,12 @@ export default { if (source.type === 'OAuth2') { url = config.authUrl + "?client_id=" + config.clientId - + "&scope=" + config.scope + "&response_type=code" + "&redirect_uri=" + redirectUrl + "&state=" + authId; + if (config.scope) { + url += "&scope=" + config.scope; + } } if (url) { window.location.href = url; diff --git a/framework/sdk-parent/frontend/src/i18n/lang/track/en-US.js b/framework/sdk-parent/frontend/src/i18n/lang/track/en-US.js index 3589dae64e..8c68d11d02 100644 --- a/framework/sdk-parent/frontend/src/i18n/lang/track/en-US.js +++ b/framework/sdk-parent/frontend/src/i18n/lang/track/en-US.js @@ -1,5 +1,5 @@ export default { - sync_add_api_load: 'Synchronously add associated api and load tests', + sync_add_api_load: 'Synchronously add associated test case', next: 'Next', total_size: 'Total {0}', related_requirements: 'Related requirements', diff --git a/framework/sdk-parent/frontend/src/i18n/lang/track/zh-CN.js b/framework/sdk-parent/frontend/src/i18n/lang/track/zh-CN.js index f5efd68b8d..0676d62a2d 100644 --- a/framework/sdk-parent/frontend/src/i18n/lang/track/zh-CN.js +++ b/framework/sdk-parent/frontend/src/i18n/lang/track/zh-CN.js @@ -1,5 +1,5 @@ export default { - sync_add_api_load: '同步添加关联的接口和性能测试', + sync_add_api_load: '同步添加关联测试的用例', next: '下一条', total_size: '共 {0} 条', related_requirements: '关联需求', diff --git a/framework/sdk-parent/frontend/src/i18n/lang/track/zh-TW.js b/framework/sdk-parent/frontend/src/i18n/lang/track/zh-TW.js index a2bf36542c..eeb912e9d9 100644 --- a/framework/sdk-parent/frontend/src/i18n/lang/track/zh-TW.js +++ b/framework/sdk-parent/frontend/src/i18n/lang/track/zh-TW.js @@ -1,5 +1,5 @@ export default { - sync_add_api_load: '同步添加關聯的接口和性能測試', + sync_add_api_load: '同步添加關聯測試的用例', next: '下一條', total_size: '共 {0} 條', related_requirements: '關聯需求', diff --git a/framework/sdk-parent/frontend/src/i18n/lang/zh-CN.js b/framework/sdk-parent/frontend/src/i18n/lang/zh-CN.js index 13855477d7..38d2a73ac0 100644 --- a/framework/sdk-parent/frontend/src/i18n/lang/zh-CN.js +++ b/framework/sdk-parent/frontend/src/i18n/lang/zh-CN.js @@ -2027,7 +2027,8 @@ const message = { api: "接口用例", scene: "场景用例", load: "性能用例", - functional: "功能用例" + functional: "功能用例", + ui: "UI用例", } } }, diff --git a/framework/sdk-parent/jmeter/src/main/java/io/metersphere/cache/JMeterEngineCache.java b/framework/sdk-parent/jmeter/src/main/java/io/metersphere/cache/JMeterEngineCache.java deleted file mode 100644 index 868eb79622..0000000000 --- a/framework/sdk-parent/jmeter/src/main/java/io/metersphere/cache/JMeterEngineCache.java +++ /dev/null @@ -1,13 +0,0 @@ -package io.metersphere.cache; - -import org.apache.jmeter.engine.StandardJMeterEngine; - -import java.util.concurrent.ConcurrentHashMap; - -public class JMeterEngineCache { - /** - * 执行中的线程池 - */ - public static ConcurrentHashMap runningEngine = new ConcurrentHashMap<>(); - -} diff --git a/framework/sdk-parent/jmeter/src/main/java/io/metersphere/jmeter/LocalRunner.java b/framework/sdk-parent/jmeter/src/main/java/io/metersphere/jmeter/LocalRunner.java index ff5fac3bce..4b3afbf8f4 100644 --- a/framework/sdk-parent/jmeter/src/main/java/io/metersphere/jmeter/LocalRunner.java +++ b/framework/sdk-parent/jmeter/src/main/java/io/metersphere/jmeter/LocalRunner.java @@ -1,15 +1,10 @@ package io.metersphere.jmeter; -import io.metersphere.cache.JMeterEngineCache; import io.metersphere.utils.LoggerUtil; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.lang3.StringUtils; import org.apache.jmeter.engine.JMeterEngineException; import org.apache.jmeter.engine.StandardJMeterEngine; import org.apache.jorphan.collections.HashTree; -import java.util.List; - public class LocalRunner { private HashTree jmxTree; @@ -26,31 +21,8 @@ public class LocalRunner { try { LoggerUtil.info("LocalRunner 开始执行报告",report); engine.runTest(); - JMeterEngineCache.runningEngine.put(report, engine); } catch (JMeterEngineException e) { engine.stopTest(true); } } - - public void stop(List reports) { - if (CollectionUtils.isNotEmpty(reports)) { - for (String report : reports) { - StandardJMeterEngine engine = JMeterEngineCache.runningEngine.get(report); - if (engine != null) { - engine.stopTest(); - JMeterEngineCache.runningEngine.remove(report); - } - } - } - } - - public void stop(String report) { - if (StringUtils.isNotEmpty(report)) { - StandardJMeterEngine engine = JMeterEngineCache.runningEngine.get(report); - if (engine != null) { - engine.stopTest(); - JMeterEngineCache.runningEngine.remove(report); - } - } - } } \ No newline at end of file diff --git a/framework/sdk-parent/sdk/src/main/java/io/metersphere/service/utils/MsClassLoader.java b/framework/sdk-parent/sdk/src/main/java/io/metersphere/service/utils/MsClassLoader.java deleted file mode 100644 index 3fb56ad977..0000000000 --- a/framework/sdk-parent/sdk/src/main/java/io/metersphere/service/utils/MsClassLoader.java +++ /dev/null @@ -1,63 +0,0 @@ -package io.metersphere.service.utils; - -import io.metersphere.commons.utils.LogUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import java.io.File; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.concurrent.ConcurrentHashMap; - -@Service -public class MsClassLoader { - - public final static ConcurrentHashMap LOADER_CACHE = new ConcurrentHashMap<>(); - - public MsURLClassLoader loadJar(String path) { - try { - String jarName = path.substring(path.indexOf("_") + 1); - if (StringUtils.isNotEmpty(jarName) && jarName.endsWith(".jar")) { - jarName = jarName.substring(0, jarName.length() - 4); - } - MsURLClassLoader urlClassLoader = LOADER_CACHE.get(jarName); - if (urlClassLoader != null) { - return urlClassLoader; - } - urlClassLoader = new MsURLClassLoader(); - File jarFile = new File(path); - URL jarUrl = jarFile.toURI().toURL(); - urlClassLoader.addURLFile(jarUrl); - LOADER_CACHE.put(jarName, urlClassLoader); - return urlClassLoader; - } catch (Exception ex) { - LogUtil.error("加载JAR包失败:" + ex.getMessage()); - } - return null; - } - - public Class loadClass(String jarName, String name) throws ClassNotFoundException { - if (StringUtils.isNotEmpty(jarName) && jarName.endsWith(".jar")) { - jarName = jarName.substring(0, jarName.length() - 4); - } - MsURLClassLoader urlClassLoader = LOADER_CACHE.get(jarName); - if (urlClassLoader == null) { - return null; - } - return urlClassLoader.loadClass(name); - } - - public void unloadJarFile(String path) throws MalformedURLException { - String jarName = path.substring(path.indexOf("_") + 1); - if (StringUtils.isNotEmpty(jarName) && jarName.endsWith(".jar")) { - jarName = jarName.substring(0, jarName.length() - 4); - } - MsURLClassLoader urlClassLoader = LOADER_CACHE.get(jarName); - if (urlClassLoader == null) { - return; - } - urlClassLoader.unloadJarFile(path); - urlClassLoader = null; - LOADER_CACHE.remove(jarName); - } -} diff --git a/framework/sdk-parent/sdk/src/main/java/io/metersphere/service/utils/MsURLClassLoader.java b/framework/sdk-parent/sdk/src/main/java/io/metersphere/service/utils/MsURLClassLoader.java deleted file mode 100644 index 2402213731..0000000000 --- a/framework/sdk-parent/sdk/src/main/java/io/metersphere/service/utils/MsURLClassLoader.java +++ /dev/null @@ -1,68 +0,0 @@ -package io.metersphere.service.utils; - -import java.net.JarURLConnection; -import java.net.URL; -import java.net.URLClassLoader; -import java.net.URLConnection; - -public class MsURLClassLoader extends URLClassLoader { - private JarURLConnection cachedJarFile = null; - - public MsURLClassLoader() { - super(new URL[]{}, findParentClassLoader()); - } - - /** - * 将指定的文件url添加到类加载器的classpath中去,并缓存jar connection,方便以后卸载jar - * 一个可想类加载器的classpath中添加的文件url - * - * @param - */ - public void addURLFile(URL file) { - try { - // 打开并缓存文件url连接 - URLConnection uc = file.openConnection(); - if (uc instanceof JarURLConnection) { - uc.setUseCaches(true); - ((JarURLConnection) uc).getManifest(); - cachedJarFile = (JarURLConnection) uc; - } - } catch (Exception e) { - System.err.println("Failed to cache plugin JAR file: " + file.toExternalForm()); - } - addURL(file); - } - - - public void unloadJarFile(String url) { - JarURLConnection jarURLConnection = cachedJarFile; - if (jarURLConnection == null) { - return; - } - try { - System.err.println("Unloading plugin JAR file " + jarURLConnection.getJarFile().getName()); - jarURLConnection.getJarFile().close(); - jarURLConnection = null; - } catch (Exception e) { - System.err.println("Failed to unload JAR file\n" + e); - } - } - - - /** - * 定位基于当前上下文的父类加载器 - * - * @return 返回可用的父类加载器. - */ - private static ClassLoader findParentClassLoader() { - ClassLoader parent = ClassLoader.getSystemClassLoader(); - if (parent == null) { - parent = MsURLClassLoader.class.getClassLoader(); - } - if (parent == null) { - parent = ClassLoader.getSystemClassLoader(); - } - return parent; - } - -} diff --git a/system-setting/frontend/src/business/system/setting/MxAuth.vue b/system-setting/frontend/src/business/system/setting/MxAuth.vue index fee5a0adaa..3bd960d9e8 100644 --- a/system-setting/frontend/src/business/system/setting/MxAuth.vue +++ b/system-setting/frontend/src/business/system/setting/MxAuth.vue @@ -233,7 +233,7 @@ - + diff --git a/test-track/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestCaseMapper.java b/test-track/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestCaseMapper.java index 223c893dd8..3c6b80c4f6 100644 --- a/test-track/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestCaseMapper.java +++ b/test-track/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestCaseMapper.java @@ -79,11 +79,11 @@ public interface ExtTestCaseMapper { List countStatus(@Param("projectId") String projectId); - List countRelevance(@Param("projectId") String projectId); + List countRelevance(@Param("projectId") String projectId, @Param("queryUI") boolean queryUI); long countRelevanceCreatedThisWeek(@Param("projectId") String projectId, @Param("firstDayTimestamp") long firstDayTimestamp, @Param("lastDayTimestamp") long lastDayTimestamp); - int countCoverage(@Param("projectId") String projectId); + int countCoverage(@Param("projectId") String projectId, @Param("queryUi") boolean queryUi); List countFuncMaintainer(@Param("projectId") String projectId); diff --git a/test-track/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestCaseMapper.xml b/test-track/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestCaseMapper.xml index 94bbdcb0c8..e1c6e357a5 100644 --- a/test-track/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestCaseMapper.xml +++ b/test-track/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestCaseMapper.xml @@ -836,7 +836,14 @@ FROM test_case_test WHERE test_type = 'automation' and test_id IN (select id FROM api_scenario WHERE `STATUS` != 'Trash') - ) + + UNION + SELECT test_case_id, test_id, test_type + FROM test_case_test + WHERE test_type = 'uiAutomation' + and test_id IN (select id FROM ui_scenario WHERE `STATUS` != 'Trash') + + ) test_case_test ON test_case.id = test_case_test.test_case_id WHERE @@ -869,6 +876,11 @@ UNION SELECT test_case_id FROM test_case_test WHERE test_type = 'automation' and test_id IN (select id FROM api_scenario WHERE `STATUS` != 'Trash') + + UNION + SELECT test_case_id FROM test_case_test WHERE test_type = 'uiAutomation' and test_id IN (select id FROM + ui_scenario WHERE `STATUS` != 'Trash') + )