fix(接口测试): 修复环境变量设置造成阻塞问题
This commit is contained in:
parent
f53d427035
commit
bf51986a61
|
@ -1,24 +0,0 @@
|
||||||
package io.metersphere.api.jmeter;
|
|
||||||
|
|
||||||
import io.metersphere.api.service.ApiEnvironmentRunningParamService;
|
|
||||||
import io.metersphere.commons.utils.CommonBeanFactory;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 执行结束后的处理(单例类)
|
|
||||||
*
|
|
||||||
* @author song.tianyang
|
|
||||||
* @Date 2021/10/29 11:22 上午
|
|
||||||
*/
|
|
||||||
public class ExecutedHandleSingleton {
|
|
||||||
private static volatile ApiEnvironmentRunningParamService apiEnvironmentRunningParamService = CommonBeanFactory.getBean(ApiEnvironmentRunningParamService.class);
|
|
||||||
private ExecutedHandleSingleton() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void parseEnvironment(List<String> evnStrList) {
|
|
||||||
for (String evnStr: evnStrList) {
|
|
||||||
apiEnvironmentRunningParamService.parseEvn(evnStr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -98,7 +98,7 @@ public class MsDebugListener extends AbstractListenerElement implements SampleLi
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void testEnded(String host) {
|
public void testEnded(String host) {
|
||||||
LoggerUtil.debug("TestEnded " + this.getName());
|
LoggerUtil.info("Debug TestEnded " + this.getName());
|
||||||
MsgDto dto = new MsgDto();
|
MsgDto dto = new MsgDto();
|
||||||
dto.setExecEnd(false);
|
dto.setExecEnd(false);
|
||||||
dto.setContent(TEST_END);
|
dto.setContent(TEST_END);
|
||||||
|
|
|
@ -1,26 +0,0 @@
|
||||||
package io.metersphere.api.jmeter;
|
|
||||||
|
|
||||||
import io.metersphere.api.service.ApiEnvironmentRunningParamService;
|
|
||||||
import io.metersphere.commons.utils.CommonBeanFactory;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author song.tianyang
|
|
||||||
* 2021/5/13 5:24 下午
|
|
||||||
*/
|
|
||||||
public class RunningParam {
|
|
||||||
private static ApiEnvironmentRunningParamService apiEnvironmentRunningParamService;
|
|
||||||
|
|
||||||
public static void setParam(String enviromentId, String key, String value){
|
|
||||||
checkService();
|
|
||||||
apiEnvironmentRunningParamService.addParam(enviromentId,key,value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void deleteParam(String enviromentId, String key){
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void checkService(){
|
|
||||||
if(apiEnvironmentRunningParamService == null){
|
|
||||||
apiEnvironmentRunningParamService = CommonBeanFactory.getBean(ApiEnvironmentRunningParamService.class);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -4,148 +4,132 @@ import com.alibaba.fastjson.JSONArray;
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import io.metersphere.base.domain.ApiTestEnvironmentWithBLOBs;
|
import io.metersphere.base.domain.ApiTestEnvironmentWithBLOBs;
|
||||||
import io.metersphere.base.mapper.ApiTestEnvironmentMapper;
|
import io.metersphere.base.mapper.ApiTestEnvironmentMapper;
|
||||||
|
import io.metersphere.utils.LoggerUtil;
|
||||||
import org.apache.commons.lang3.ArrayUtils;
|
import org.apache.commons.lang3.ArrayUtils;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.apache.ibatis.session.ExecutorType;
|
|
||||||
import org.apache.ibatis.session.SqlSession;
|
|
||||||
import org.apache.ibatis.session.SqlSessionFactory;
|
|
||||||
import org.mybatis.spring.SqlSessionUtils;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author song.tianyang
|
* @author song.tianyang
|
||||||
* 2021/5/13 6:24 下午
|
* 2021/5/13 6:24 下午
|
||||||
*/
|
*/
|
||||||
@Service
|
@Service
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public class ApiEnvironmentRunningParamService {
|
public class ApiEnvironmentRunningParamService {
|
||||||
@Resource
|
@Resource
|
||||||
ApiTestEnvironmentService apiTestEnvironmentService;
|
ApiTestEnvironmentMapper testEnvironmentMapper;
|
||||||
@Resource
|
|
||||||
SqlSessionFactory sqlSessionFactory;
|
|
||||||
|
|
||||||
public synchronized void addParam(String enviromentId, String key, String value) {
|
public void addParam(String environmentId, String key, String value) {
|
||||||
|
if (StringUtils.isEmpty(key)) {
|
||||||
if(StringUtils.isEmpty(key)){
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ApiTestEnvironmentWithBLOBs apiTestEnvironmentWithBLOBs = apiTestEnvironmentService.get(enviromentId);
|
ApiTestEnvironmentWithBLOBs environment = testEnvironmentMapper.selectByPrimaryKey(environmentId);
|
||||||
if(apiTestEnvironmentWithBLOBs == null ){
|
if (environment == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
try {
|
||||||
JSONObject configObj = JSONObject.parseObject(apiTestEnvironmentWithBLOBs.getConfig());
|
JSONObject configObj = JSONObject.parseObject(environment.getConfig());
|
||||||
if(configObj.containsKey("commonConfig")){
|
if (configObj.containsKey("commonConfig")) {
|
||||||
JSONObject commonConfig = configObj.getJSONObject("commonConfig");
|
JSONObject commonConfig = configObj.getJSONObject("commonConfig");
|
||||||
if(commonConfig.containsKey("variables")){
|
if (commonConfig.containsKey("variables")) {
|
||||||
JSONArray variables = commonConfig.getJSONArray("variables");
|
JSONArray variables = commonConfig.getJSONArray("variables");
|
||||||
boolean contains = false;
|
boolean contains = false;
|
||||||
for(int i = 0;i<variables.size();i++){
|
for (int i = 0; i < variables.size(); i++) {
|
||||||
JSONObject jsonObj = variables.getJSONObject(i);
|
JSONObject jsonObj = variables.getJSONObject(i);
|
||||||
if(jsonObj.containsKey("name")&&StringUtils.equals(jsonObj.getString("name"), key)){
|
if (jsonObj.containsKey("name") && StringUtils.equals(jsonObj.getString("name"), key)) {
|
||||||
contains = true;
|
contains = true;
|
||||||
jsonObj.put("value",value);
|
jsonObj.put("value", value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
if (!contains) {
|
||||||
if(!contains){
|
JSONObject itemObj = new JSONObject();
|
||||||
|
itemObj.put("name", key);
|
||||||
|
itemObj.put("value", value);
|
||||||
|
itemObj.put("enable", true);
|
||||||
|
|
||||||
|
if (variables.size() == 0) {
|
||||||
|
variables.add(itemObj);
|
||||||
|
} else {
|
||||||
|
variables.add(variables.size() - 1, itemObj);
|
||||||
|
}
|
||||||
|
commonConfig.put("variables", variables);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
JSONArray variables = new JSONArray();
|
||||||
JSONObject itemObj = new JSONObject();
|
JSONObject itemObj = new JSONObject();
|
||||||
itemObj.put("name",key);
|
itemObj.put("name", key);
|
||||||
itemObj.put("value",value);
|
itemObj.put("value", value);
|
||||||
itemObj.put("enable",true);
|
itemObj.put("enable", true);
|
||||||
|
|
||||||
if(variables.size() == 0){
|
JSONObject emptyObj = new JSONObject();
|
||||||
variables.add(itemObj);
|
emptyObj.put("enable", true);
|
||||||
}else {
|
|
||||||
variables.add(variables.size()-1,itemObj);
|
variables.add(itemObj);
|
||||||
}
|
variables.add(emptyObj);
|
||||||
commonConfig.put("variables",variables);
|
commonConfig.put("variables", variables);
|
||||||
}
|
}
|
||||||
}else {
|
} else {
|
||||||
|
JSONObject commonConfig = new JSONObject();
|
||||||
JSONArray variables = new JSONArray();
|
JSONArray variables = new JSONArray();
|
||||||
JSONObject itemObj = new JSONObject();
|
JSONObject itemObj = new JSONObject();
|
||||||
itemObj.put("name",key);
|
itemObj.put("name", key);
|
||||||
itemObj.put("value",value);
|
itemObj.put("value", value);
|
||||||
itemObj.put("enable",true);
|
itemObj.put("enable", true);
|
||||||
|
|
||||||
JSONObject emptyObj = new JSONObject();
|
JSONObject emptyObj = new JSONObject();
|
||||||
emptyObj.put("enable",true);
|
emptyObj.put("enable", true);
|
||||||
|
|
||||||
variables.add(itemObj);
|
variables.add(itemObj);
|
||||||
variables.add(emptyObj);
|
variables.add(emptyObj);
|
||||||
commonConfig.put("variables",variables);
|
commonConfig.put("variables", variables);
|
||||||
|
configObj.put("commonConfig", commonConfig);
|
||||||
}
|
}
|
||||||
}else {
|
|
||||||
JSONObject commonConfig = new JSONObject();
|
|
||||||
JSONArray variables = new JSONArray();
|
|
||||||
JSONObject itemObj = new JSONObject();
|
|
||||||
itemObj.put("name",key);
|
|
||||||
itemObj.put("value",value);
|
|
||||||
itemObj.put("enable",true);
|
|
||||||
|
|
||||||
JSONObject emptyObj = new JSONObject();
|
environment.setConfig(configObj.toJSONString());
|
||||||
emptyObj.put("enable",true);
|
testEnvironmentMapper.updateByPrimaryKeyWithBLOBs(environment);
|
||||||
|
} catch (Exception ex) {
|
||||||
variables.add(itemObj);
|
LoggerUtil.error("设置环境变量异常:" + ex.getMessage());
|
||||||
variables.add(emptyObj);
|
|
||||||
commonConfig.put("variables",variables);
|
|
||||||
configObj.put("commonConfig",commonConfig);
|
|
||||||
}
|
|
||||||
|
|
||||||
apiTestEnvironmentWithBLOBs.setConfig(configObj.toJSONString());
|
|
||||||
|
|
||||||
SqlSession sqlSession = null;
|
|
||||||
try {
|
|
||||||
sqlSession = sqlSessionFactory.openSession(ExecutorType.SIMPLE);
|
|
||||||
ApiTestEnvironmentMapper batchMapper = sqlSession.getMapper(ApiTestEnvironmentMapper.class);
|
|
||||||
batchMapper.updateByPrimaryKeyWithBLOBs(apiTestEnvironmentWithBLOBs);
|
|
||||||
sqlSession.flushStatements();
|
|
||||||
if (sqlSession != null && sqlSessionFactory != null) {
|
|
||||||
SqlSessionUtils.closeSqlSession(sqlSession, sqlSessionFactory);
|
|
||||||
}
|
|
||||||
}catch (Exception e){
|
|
||||||
sqlSession.rollback();
|
|
||||||
if (sqlSession != null && sqlSessionFactory != null) {
|
|
||||||
SqlSessionUtils.closeSqlSession(sqlSession, sqlSessionFactory);
|
|
||||||
}
|
|
||||||
}finally {
|
|
||||||
if (sqlSession != null && sqlSessionFactory != null) {
|
|
||||||
SqlSessionUtils.closeSqlSession(sqlSession, sqlSessionFactory);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void parseEvn(String envStr) {
|
public void parseEvn(String envStr) {
|
||||||
String [] envStringArr = envStr.split("\n");
|
String[] envStringArr = envStr.split("\n");
|
||||||
for (String env :envStringArr) {
|
for (String env : envStringArr) {
|
||||||
if(StringUtils.contains(env,"=")){
|
if (StringUtils.contains(env, "=")) {
|
||||||
String [] envItem = env.split("=");
|
String[] envItem = env.split("=");
|
||||||
if(envItem.length > 1){
|
if (envItem.length > 1) {
|
||||||
String jmeterVarKey = envItem[0];
|
String jmeterVarKey = envItem[0];
|
||||||
if(this.checkValidity(jmeterVarKey,"MS.ENV.")){
|
if (this.checkValidity(jmeterVarKey, "MS.ENV.")) {
|
||||||
String [] envAndKeyArr = jmeterVarKey.substring("MS.ENV.".length()).split("\\.");
|
String[] envAndKeyArr = jmeterVarKey.substring("MS.ENV.".length()).split("\\.");
|
||||||
String envId = envAndKeyArr[0];
|
String envId = envAndKeyArr[0];
|
||||||
String [] keyArr = ArrayUtils.remove(envAndKeyArr,0);
|
String[] keyArr = ArrayUtils.remove(envAndKeyArr, 0);
|
||||||
String key = StringUtils.join(keyArr,".");
|
String key = StringUtils.join(keyArr, ".");
|
||||||
String value = StringUtils.substring(env,jmeterVarKey.length()+1);
|
String value = StringUtils.substring(env, jmeterVarKey.length() + 1);
|
||||||
if(StringUtils.isNoneEmpty(envId,key,value)){
|
if (StringUtils.isNoneEmpty(envId, key, value)) {
|
||||||
this.addParam(envId,key,value);
|
this.addParam(envId, key, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public boolean checkValidity (String str, String regex) {
|
|
||||||
if(str == null){
|
public void parseEnvironment(List<String> evnStrList) {
|
||||||
|
for (String evnStr : evnStrList) {
|
||||||
|
this.parseEvn(evnStr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean checkValidity(String str, String regex) {
|
||||||
|
if (str == null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if(regex == null){
|
if (regex == null) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (str.startsWith(regex)) {
|
if (str.startsWith(regex)) {
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package io.metersphere.api.service;
|
package io.metersphere.api.service;
|
||||||
|
|
||||||
import io.metersphere.api.dto.automation.ApiTestReportVariable;
|
import io.metersphere.api.dto.automation.ApiTestReportVariable;
|
||||||
import io.metersphere.api.jmeter.ExecutedHandleSingleton;
|
|
||||||
import io.metersphere.base.domain.*;
|
import io.metersphere.base.domain.*;
|
||||||
import io.metersphere.base.mapper.ApiDefinitionExecResultMapper;
|
import io.metersphere.base.mapper.ApiDefinitionExecResultMapper;
|
||||||
import io.metersphere.base.mapper.ApiScenarioMapper;
|
import io.metersphere.base.mapper.ApiScenarioMapper;
|
||||||
|
@ -54,6 +53,8 @@ public class TestResultService {
|
||||||
private ApiTestCaseService apiTestCaseService;
|
private ApiTestCaseService apiTestCaseService;
|
||||||
@Resource
|
@Resource
|
||||||
private ApiDefinitionExecResultMapper apiDefinitionExecResultMapper;
|
private ApiDefinitionExecResultMapper apiDefinitionExecResultMapper;
|
||||||
|
@Resource
|
||||||
|
private ApiEnvironmentRunningParamService apiEnvironmentRunningParamService;
|
||||||
|
|
||||||
public void saveResults(ResultDTO dto) {
|
public void saveResults(ResultDTO dto) {
|
||||||
// 处理环境
|
// 处理环境
|
||||||
|
@ -64,7 +65,8 @@ public class TestResultService {
|
||||||
List<RequestResult> requestResults = dto.getRequestResults();
|
List<RequestResult> requestResults = dto.getRequestResults();
|
||||||
//处理环境参数
|
//处理环境参数
|
||||||
if (CollectionUtils.isNotEmpty(environmentList)) {
|
if (CollectionUtils.isNotEmpty(environmentList)) {
|
||||||
ExecutedHandleSingleton.parseEnvironment(environmentList);
|
apiEnvironmentRunningParamService.parseEnvironment(environmentList);
|
||||||
|
|
||||||
}
|
}
|
||||||
//测试计划定时任务-接口执行逻辑的话,需要同步测试计划的报告数据
|
//测试计划定时任务-接口执行逻辑的话,需要同步测试计划的报告数据
|
||||||
if (StringUtils.equalsAny(dto.getRunMode(), ApiRunMode.SCHEDULE_API_PLAN.name(), ApiRunMode.JENKINS_API_PLAN.name(), ApiRunMode.MANUAL_PLAN.name())) {
|
if (StringUtils.equalsAny(dto.getRunMode(), ApiRunMode.SCHEDULE_API_PLAN.name(), ApiRunMode.JENKINS_API_PLAN.name(), ApiRunMode.MANUAL_PLAN.name())) {
|
||||||
|
@ -88,7 +90,7 @@ public class TestResultService {
|
||||||
}
|
}
|
||||||
//处理环境参数
|
//处理环境参数
|
||||||
if (CollectionUtils.isNotEmpty(environmentList)) {
|
if (CollectionUtils.isNotEmpty(environmentList)) {
|
||||||
ExecutedHandleSingleton.parseEnvironment(environmentList);
|
apiEnvironmentRunningParamService.parseEnvironment(environmentList);
|
||||||
}
|
}
|
||||||
// 处理用例/场景和计划关系
|
// 处理用例/场景和计划关系
|
||||||
updateTestCaseStates(dto.getRequestResults(), dto.getRunMode());
|
updateTestCaseStates(dto.getRequestResults(), dto.getRunMode());
|
||||||
|
|
|
@ -81,7 +81,7 @@ public class HashTreeUtil {
|
||||||
return returnMap;
|
return returnMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized void setEnvParamsMapToHashTree(HashTree hashTree, Map<String, Map<String, String>> envParamsMap) {
|
public void setEnvParamsMapToHashTree(HashTree hashTree, Map<String, Map<String, String>> envParamsMap) {
|
||||||
if (hashTree != null) {
|
if (hashTree != null) {
|
||||||
Map<String, String> allParamMap = new HashMap<>();
|
Map<String, String> allParamMap = new HashMap<>();
|
||||||
for (Map<String, String> paramMap : envParamsMap.values()) {
|
for (Map<String, String> paramMap : envParamsMap.values()) {
|
||||||
|
|
|
@ -402,7 +402,7 @@ public class TestPlanReportService {
|
||||||
return principalName;
|
return principalName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized void updateReport(List<String> testPlanReportIdList, String runMode, String triggerMode) {
|
public void updateReport(List<String> testPlanReportIdList, String runMode, String triggerMode) {
|
||||||
for (String planReportId : testPlanReportIdList) {
|
for (String planReportId : testPlanReportIdList) {
|
||||||
this.countReportByTestPlanReportId(planReportId, runMode, triggerMode);
|
this.countReportByTestPlanReportId(planReportId, runMode, triggerMode);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue