fix: 解决冲突

This commit is contained in:
chenjianxing 2021-03-19 18:07:39 +08:00
commit b46e33a71c
25 changed files with 92 additions and 29 deletions

View File

@ -73,6 +73,10 @@ public class MsScenario extends MsTestElement {
@Override @Override
public void toHashTree(HashTree tree, List<MsTestElement> hashTree, ParameterConfig config) { public void toHashTree(HashTree tree, List<MsTestElement> hashTree, ParameterConfig config) {
// 非导出操作且不是启用状态则跳过执行
if (!config.isOperating() && !this.isEnable()) {
return;
}
if (this.getReferenced() != null && this.getReferenced().equals("Deleted")) { if (this.getReferenced() != null && this.getReferenced().equals("Deleted")) {
return; return;
} else if (this.getReferenced() != null && this.getReferenced().equals("REF")) { } else if (this.getReferenced() != null && this.getReferenced().equals("REF")) {
@ -198,6 +202,8 @@ public class MsScenario extends MsTestElement {
config.getConfig().get(this.getProjectId()).getCommonConfig().getVariables().stream().filter(KeyValue::isValid).filter(KeyValue::isEnable).forEach(keyValue -> config.getConfig().get(this.getProjectId()).getCommonConfig().getVariables().stream().filter(KeyValue::isValid).filter(KeyValue::isEnable).forEach(keyValue ->
arguments.addArgument(keyValue.getName(), keyValue.getValue(), "=") arguments.addArgument(keyValue.getName(), keyValue.getValue(), "=")
); );
// 清空变量防止重复添加
config.getConfig().get(this.getProjectId()).getCommonConfig().getVariables().clear();
} }
if (arguments.getArguments() != null && arguments.getArguments().size() > 0) { if (arguments.getArguments() != null && arguments.getArguments().size() > 0) {
return arguments; return arguments;

View File

@ -27,6 +27,10 @@ public class MsAssertions extends MsTestElement {
@Override @Override
public void toHashTree(HashTree tree, List<MsTestElement> hashTree, ParameterConfig config) { public void toHashTree(HashTree tree, List<MsTestElement> hashTree, ParameterConfig config) {
// 非导出操作且不是启用状态则跳过执行
if (!config.isOperating() && !this.isEnable()) {
return;
}
addAssertions(tree); addAssertions(tree);
} }

View File

@ -26,6 +26,10 @@ public class MsIfController extends MsTestElement {
@Override @Override
public void toHashTree(HashTree tree, List<MsTestElement> hashTree, ParameterConfig config) { public void toHashTree(HashTree tree, List<MsTestElement> hashTree, ParameterConfig config) {
// 非导出操作且不是启用状态则跳过执行
if (!config.isOperating() && !this.isEnable()) {
return;
}
final HashTree groupTree = tree.add(ifController()); final HashTree groupTree = tree.add(ifController());
if (CollectionUtils.isNotEmpty(hashTree)) { if (CollectionUtils.isNotEmpty(hashTree)) {
hashTree.forEach(el -> { hashTree.forEach(el -> {

View File

@ -44,6 +44,10 @@ public class MsLoopController extends MsTestElement {
@Override @Override
public void toHashTree(HashTree tree, List<MsTestElement> hashTree, ParameterConfig config) { public void toHashTree(HashTree tree, List<MsTestElement> hashTree, ParameterConfig config) {
// 非导出操作且不是启用状态则跳过执行
if (!config.isOperating() && !this.isEnable()) {
return;
}
final HashTree groupTree = controller(tree); final HashTree groupTree = controller(tree);
if (CollectionUtils.isNotEmpty(config.getVariables())) { if (CollectionUtils.isNotEmpty(config.getVariables())) {
this.addCsvDataSet(groupTree, config.getVariables()); this.addCsvDataSet(groupTree, config.getVariables());

View File

@ -26,7 +26,8 @@ public class MsDNSCacheManager extends MsTestElement {
@Override @Override
public void toHashTree(HashTree tree, List<MsTestElement> hashTree, ParameterConfig config) { public void toHashTree(HashTree tree, List<MsTestElement> hashTree, ParameterConfig config) {
if (!this.isEnable()) { // 非导出操作且不是启用状态则跳过执行
if (!config.isOperating() && !this.isEnable()) {
return; return;
} }
for (MsTestElement el : hashTree) { for (MsTestElement el : hashTree) {

View File

@ -30,6 +30,10 @@ public class MsExtract extends MsTestElement {
@Override @Override
public void toHashTree(HashTree tree, List<MsTestElement> hashTree, ParameterConfig config) { public void toHashTree(HashTree tree, List<MsTestElement> hashTree, ParameterConfig config) {
// 非导出操作且不是启用状态则跳过执行
if (!config.isOperating() && !this.isEnable()) {
return;
}
addRequestExtractors(tree); addRequestExtractors(tree);
} }

View File

@ -29,6 +29,10 @@ public class MsJSR223Processor extends MsTestElement {
@Override @Override
public void toHashTree(HashTree tree, List<MsTestElement> hashTree, ParameterConfig config) { public void toHashTree(HashTree tree, List<MsTestElement> hashTree, ParameterConfig config) {
// 非导出操作且不是启用状态则跳过执行
if (!config.isOperating() && !this.isEnable()) {
return;
}
JSR223Sampler processor = new JSR223Sampler(); JSR223Sampler processor = new JSR223Sampler();
processor.setEnabled(this.isEnable()); processor.setEnabled(this.isEnable());
if (StringUtils.isNotEmpty(this.getName())) { if (StringUtils.isNotEmpty(this.getName())) {

View File

@ -29,6 +29,10 @@ public class MsJSR223PostProcessor extends MsTestElement {
@Override @Override
public void toHashTree(HashTree tree, List<MsTestElement> hashTree, ParameterConfig config) { public void toHashTree(HashTree tree, List<MsTestElement> hashTree, ParameterConfig config) {
// 非导出操作且不是启用状态则跳过执行
if (!config.isOperating() && !this.isEnable()) {
return;
}
JSR223PostProcessor processor = new JSR223PostProcessor(); JSR223PostProcessor processor = new JSR223PostProcessor();
processor.setEnabled(this.isEnable()); processor.setEnabled(this.isEnable());
if (StringUtils.isNotEmpty(this.getName())) { if (StringUtils.isNotEmpty(this.getName())) {

View File

@ -30,6 +30,10 @@ public class MsJSR223PreProcessor extends MsTestElement {
@Override @Override
public void toHashTree(HashTree tree, List<MsTestElement> hashTree, ParameterConfig config) { public void toHashTree(HashTree tree, List<MsTestElement> hashTree, ParameterConfig config) {
// 非导出操作且不是启用状态则跳过执行
if (!config.isOperating() && !this.isEnable()) {
return;
}
final HashTree jsr223PreTree = tree.add(getJSR223PreProcessor()); final HashTree jsr223PreTree = tree.add(getJSR223PreProcessor());
if (CollectionUtils.isNotEmpty(hashTree)) { if (CollectionUtils.isNotEmpty(hashTree)) {
hashTree.forEach(el -> { hashTree.forEach(el -> {

View File

@ -60,6 +60,10 @@ public class MsDubboSampler extends MsTestElement {
@Override @Override
public void toHashTree(HashTree tree, List<MsTestElement> hashTree, ParameterConfig config) { public void toHashTree(HashTree tree, List<MsTestElement> hashTree, ParameterConfig config) {
// 非导出操作且不是启用状态则跳过执行
if (!config.isOperating() && !this.isEnable()) {
return;
}
if (this.getReferenced() != null && "Deleted".equals(this.getReferenced())) { if (this.getReferenced() != null && "Deleted".equals(this.getReferenced())) {
return; return;
} }

View File

@ -93,7 +93,10 @@ public class MsHTTPSamplerProxy extends MsTestElement {
@Override @Override
public void toHashTree(HashTree tree, List<MsTestElement> hashTree, ParameterConfig config) { public void toHashTree(HashTree tree, List<MsTestElement> hashTree, ParameterConfig config) {
// 非导出操作且不是启用状态则跳过执行
if (!config.isOperating() && !this.isEnable()) {
return;
}
if (this.getReferenced() != null && MsTestElementConstants.REF.name().equals(this.getReferenced())) { if (this.getReferenced() != null && MsTestElementConstants.REF.name().equals(this.getReferenced())) {
this.getRefElement(this); this.getRefElement(this);
} }
@ -315,8 +318,10 @@ public class MsHTTPSamplerProxy extends MsTestElement {
headers.stream().filter(KeyValue::isValid).filter(KeyValue::isEnable).forEach(keyValue -> headers.stream().filter(KeyValue::isValid).filter(KeyValue::isEnable).forEach(keyValue ->
headerManager.add(new Header(keyValue.getName(), keyValue.getValue())) headerManager.add(new Header(keyValue.getName(), keyValue.getValue()))
); );
if (headerManager.getHeaders().size() > 0) {
tree.add(headerManager); tree.add(headerManager);
} }
}
public boolean isURL(String str) { public boolean isURL(String str) {
//转换为小写 //转换为小写

View File

@ -58,6 +58,10 @@ public class MsJDBCSampler extends MsTestElement {
@Override @Override
public void toHashTree(HashTree tree, List<MsTestElement> hashTree, ParameterConfig config) { public void toHashTree(HashTree tree, List<MsTestElement> hashTree, ParameterConfig config) {
// 非导出操作且不是启用状态则跳过执行
if (!config.isOperating() && !this.isEnable()) {
return;
}
if (this.getReferenced() != null && MsTestElementConstants.REF.name().equals(this.getReferenced())) { if (this.getReferenced() != null && MsTestElementConstants.REF.name().equals(this.getReferenced())) {
this.getRefElement(this); this.getRefElement(this);
} }

View File

@ -72,6 +72,10 @@ public class MsTCPSampler extends MsTestElement {
@Override @Override
public void toHashTree(HashTree tree, List<MsTestElement> hashTree, ParameterConfig config) { public void toHashTree(HashTree tree, List<MsTestElement> hashTree, ParameterConfig config) {
// 非导出操作且不是启用状态则跳过执行
if (!config.isOperating() && !this.isEnable()) {
return;
}
if (this.getReferenced() != null && MsTestElementConstants.REF.name().equals(this.getReferenced())) { if (this.getReferenced() != null && MsTestElementConstants.REF.name().equals(this.getReferenced())) {
this.getRefElement(this); this.getRefElement(this);
} }

View File

@ -26,7 +26,10 @@ public class MsConstantTimer extends MsTestElement {
@Override @Override
public void toHashTree(HashTree tree, List<MsTestElement> hashTree, ParameterConfig config) { public void toHashTree(HashTree tree, List<MsTestElement> hashTree, ParameterConfig config) {
// 非导出操作且不是启用状态则跳过执行
if (!config.isOperating() && !this.isEnable()) {
return;
}
final HashTree groupTree = tree.add(constantTimer()); final HashTree groupTree = tree.add(constantTimer());
if (CollectionUtils.isNotEmpty(hashTree)) { if (CollectionUtils.isNotEmpty(hashTree)) {
hashTree.forEach(el -> { hashTree.forEach(el -> {

View File

@ -3,6 +3,7 @@ package io.metersphere.api.dto.definition.request.unknown;
import com.alibaba.fastjson.annotation.JSONType; import com.alibaba.fastjson.annotation.JSONType;
import io.metersphere.api.dto.definition.request.MsTestElement; import io.metersphere.api.dto.definition.request.MsTestElement;
import io.metersphere.api.dto.definition.request.ParameterConfig; import io.metersphere.api.dto.definition.request.ParameterConfig;
import io.metersphere.commons.utils.LogUtil;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.CollectionUtils;
@ -36,20 +37,25 @@ public class MsJmeterElement extends MsTestElement {
Object scriptWrapper = SaveService.loadElement(inputSource); Object scriptWrapper = SaveService.loadElement(inputSource);
HashTree elementTree = tree; HashTree elementTree = tree;
this.setElementType(scriptWrapper.getClass().getName()); this.setElementType(scriptWrapper.getClass().getName());
if (scriptWrapper instanceof TestElement) {
((TestElement) scriptWrapper).setName(this.getName());
((TestElement) scriptWrapper).setEnabled(this.isEnable());
}
if (config.isOperating()) { if (config.isOperating()) {
elementTree = tree.add(scriptWrapper); elementTree = tree.add(scriptWrapper);
} else if (!(scriptWrapper instanceof TestPlan) && !(scriptWrapper instanceof ThreadGroup)) { } else if (!(scriptWrapper instanceof TestPlan) && !(scriptWrapper instanceof ThreadGroup)) {
elementTree = tree.add(scriptWrapper); elementTree = tree.add(scriptWrapper);
} }
if (scriptWrapper instanceof TestElement) { if (!config.isOperating() && scriptWrapper instanceof ThreadGroup && !((ThreadGroup) scriptWrapper).isEnabled()) {
((TestElement) scriptWrapper).setName(this.getName()); LogUtil.info(((ThreadGroup) scriptWrapper).getName() + "是被禁用线程组不加入执行");
} } else {
if (CollectionUtils.isNotEmpty(hashTree)) { if (CollectionUtils.isNotEmpty(hashTree)) {
for (MsTestElement el : hashTree) { for (MsTestElement el : hashTree) {
el.toHashTree(elementTree, el.getHashTree(), config); el.toHashTree(elementTree, el.getHashTree(), config);
} }
} }
} }
}
} catch (Exception ex) { } catch (Exception ex) {
ex.printStackTrace(); ex.printStackTrace();
} }

View File

@ -115,7 +115,9 @@ public class ApiAutomationService {
if (map != null) { if (map != null) {
if (map.isEmpty()) { if (map.isEmpty()) {
List<String> ids = (List<String>) JSONPath.read(definition, "$..projectId"); List<String> ids = (List<String>) JSONPath.read(definition, "$..projectId");
if (CollectionUtils.isNotEmpty(ids)) {
idList.addAll(new HashSet<>(ids)); idList.addAll(new HashSet<>(ids));
}
} else { } else {
Set<String> set = d.getEnvironmentMap().keySet(); Set<String> set = d.getEnvironmentMap().keySet();
idList = new ArrayList<>(set); idList = new ArrayList<>(set);
@ -601,6 +603,7 @@ public class ApiAutomationService {
ParameterConfig config = new ParameterConfig(); ParameterConfig config = new ParameterConfig();
config.setConfig(envConfig); config.setConfig(envConfig);
HashTree hashTree = request.getTestElement().generateHashTree(config); HashTree hashTree = request.getTestElement().generateHashTree(config);
System.out.println(request.getTestElement().getJmx(hashTree));
// 调用执行方法 // 调用执行方法
APIScenarioReportResult reportResult = createScenarioReport(request.getId(), request.getScenarioId(), request.getScenarioName(), ReportTriggerMode.MANUAL.name(), request.getExecuteType(), request.getProjectId(), APIScenarioReportResult reportResult = createScenarioReport(request.getId(), request.getScenarioId(), request.getScenarioName(), ReportTriggerMode.MANUAL.name(), request.getExecuteType(), request.getProjectId(),
SessionUtils.getUserId()); SessionUtils.getUserId());

View File

@ -5,7 +5,7 @@ import io.metersphere.security.ApiKeyFilter;
import io.metersphere.security.CsrfFilter; import io.metersphere.security.CsrfFilter;
import io.metersphere.security.UserModularRealmAuthenticator; import io.metersphere.security.UserModularRealmAuthenticator;
import io.metersphere.security.realm.LdapRealm; import io.metersphere.security.realm.LdapRealm;
import io.metersphere.security.realm.ShiroDBRealm; import io.metersphere.security.realm.LocalRealm;
import org.apache.shiro.authc.pam.FirstSuccessfulStrategy; import org.apache.shiro.authc.pam.FirstSuccessfulStrategy;
import org.apache.shiro.authc.pam.ModularRealmAuthenticator; import org.apache.shiro.authc.pam.ModularRealmAuthenticator;
import org.apache.shiro.cache.MemoryConstrainedCacheManager; import org.apache.shiro.cache.MemoryConstrainedCacheManager;
@ -70,7 +70,7 @@ public class ShiroConfig implements EnvironmentAware {
} }
/** /**
* securityManager 不用直接注入shiroDBRealm可能会导致事务失效 * securityManager 不用直接注入 Realm可能会导致事务失效
* 解决方法见 handleContextRefresh * 解决方法见 handleContextRefresh
* http://www.debugrun.com/a/NKS9EJQ.html * http://www.debugrun.com/a/NKS9EJQ.html
*/ */
@ -85,8 +85,8 @@ public class ShiroConfig implements EnvironmentAware {
@Bean @Bean
@DependsOn("lifecycleBeanPostProcessor") @DependsOn("lifecycleBeanPostProcessor")
public ShiroDBRealm shiroDBRealm() { public LocalRealm localRealm() {
return new ShiroDBRealm(); return new LocalRealm();
} }
@Bean @Bean
@ -135,10 +135,10 @@ public class ShiroConfig implements EnvironmentAware {
public void handleContextRefresh(ContextRefreshedEvent event) { public void handleContextRefresh(ContextRefreshedEvent event) {
ApplicationContext context = event.getApplicationContext(); ApplicationContext context = event.getApplicationContext();
List<Realm> realmList = new ArrayList<>(); List<Realm> realmList = new ArrayList<>();
ShiroDBRealm shiroDBRealm = context.getBean(ShiroDBRealm.class); LocalRealm localRealm = context.getBean(LocalRealm.class);
LdapRealm ldapRealm = context.getBean(LdapRealm.class); LdapRealm ldapRealm = context.getBean(LdapRealm.class);
// 基本realm // 基本realm
realmList.add(shiroDBRealm); realmList.add(localRealm);
realmList.add(ldapRealm); realmList.add(ldapRealm);
context.getBean(DefaultWebSecurityManager.class).setRealms(realmList); context.getBean(DefaultWebSecurityManager.class).setRealms(realmList);
} }

View File

@ -144,12 +144,12 @@ public class TestCaseDataListener extends EasyExcelListener<TestCaseExcelData> {
String[] stepRes = new String[1]; String[] stepRes = new String[1];
if (data.getStepDesc() != null) { if (data.getStepDesc() != null) {
stepDesc = data.getStepDesc().split("\n"); stepDesc = data.getStepDesc().split("\r\n");
} else { } else {
stepDesc[0] = ""; stepDesc[0] = "";
} }
if (data.getStepResult() != null) { if (data.getStepResult() != null) {
stepRes = data.getStepResult().split("\n"); stepRes = data.getStepResult().split("\r\n");
} else { } else {
stepRes[0] = ""; stepRes[0] = "";
} }

View File

@ -68,7 +68,7 @@ public class LdapController {
userService.addLdapUser(user); userService.addLdapUser(user);
} }
// 执行 ShiroDBRealm LDAP 登录逻辑 // 执行 LocalRealm LDAP 登录逻辑
LoginRequest loginRequest = new LoginRequest(); LoginRequest loginRequest = new LoginRequest();
loginRequest.setUsername(userId); loginRequest.setUsername(userId);
return userService.login(loginRequest); return userService.login(loginRequest);

View File

@ -34,9 +34,9 @@ import java.util.stream.Collectors;
* set realm * set realm
* </p> * </p>
*/ */
public class ShiroDBRealm extends AuthorizingRealm { public class LocalRealm extends AuthorizingRealm {
private Logger logger = LoggerFactory.getLogger(ShiroDBRealm.class); private Logger logger = LoggerFactory.getLogger(LocalRealm.class);
@Resource @Resource
private UserService userService; private UserService userService;

View File

@ -520,8 +520,8 @@ public class TestCaseService {
for (int j = 0; j < jsonArray.size(); j++) { for (int j = 0; j < jsonArray.size(); j++) {
int num = j + 1; int num = j + 1;
step.append(num + "." + jsonArray.getJSONObject(j).getString("desc") + "\n"); step.append(num + "." + jsonArray.getJSONObject(j).getString("desc") + "\r\n");
result.append(num + "." + jsonArray.getJSONObject(j).getString("result") + "\n"); result.append(num + "." + jsonArray.getJSONObject(j).getString("result") + "\r\n");
} }
data.setStepDesc(step.toString()); data.setStepDesc(step.toString());

@ -1 +1 @@
Subproject commit 245845e07bf3fe2f60311eeb78f8f109301a2d39 Subproject commit c9fd084c8f4453d7697677a79d9a0a953c045e38

View File

@ -159,7 +159,7 @@ export default {
data() { data() {
return { return {
timeout: 60000, timeout: 60000,
responseTimeout: null, responseTimeout: 60000,
statusCode: [], statusCode: [],
domains: [], domains: [],
params: [], params: [],

View File

@ -42,12 +42,11 @@
<br> <br>
<div v-if="threadGroup.threadType === 'DURATION'"> <div v-if="threadGroup.threadType === 'DURATION'">
<el-form-item :label="$t('load_test.duration')"> <el-form-item :label="$t('load_test.duration')">
<!-- 最多两天的测试时长 -->
<el-input-number <el-input-number
:disabled="isReadOnly" :disabled="isReadOnly"
v-model="threadGroup.duration" v-model="threadGroup.duration"
:min="1" :min="1"
:max="99999" :max="9999"
@change="calculateChart(threadGroup)" @change="calculateChart(threadGroup)"
size="mini"/> size="mini"/>
</el-form-item> </el-form-item>

View File

@ -2,7 +2,7 @@
<el-card class="table-card" v-loading="result.loading" body-style="padding:10px;"> <el-card class="table-card" v-loading="result.loading" body-style="padding:10px;">
<div slot="header"> <div slot="header">
<span class="title"> <span class="title">
遗留缺陷统计 用例评审
</span> </span>
<ms-table-button :is-tester-permission="true" v-if="!showMyCreator" icon="el-icon-view" <ms-table-button :is-tester-permission="true" v-if="!showMyCreator" icon="el-icon-view"
:content="$t('test_track.review.my_create')" @click="searchMyCreator" style="float: right"/> :content="$t('test_track.review.my_create')" @click="searchMyCreator" style="float: right"/>