Merge remote-tracking branch 'origin/master'
# Conflicts: # frontend/src/business/components/api/definition/components/list/ApiList.vue
This commit is contained in:
commit
1f2ffba0d4
|
@ -41,7 +41,6 @@ import org.apache.jmeter.config.Arguments;
|
|||
import org.apache.jmeter.config.CSVDataSet;
|
||||
import org.apache.jmeter.config.RandomVariableConfig;
|
||||
import org.apache.jmeter.modifiers.CounterConfig;
|
||||
import org.apache.jmeter.protocol.http.control.AuthManager;
|
||||
import org.apache.jmeter.save.SaveService;
|
||||
import org.apache.jmeter.testelement.TestElement;
|
||||
import org.apache.jorphan.collections.HashTree;
|
||||
|
@ -75,7 +74,7 @@ import java.util.stream.Collectors;
|
|||
|
||||
})
|
||||
@JSONType(seeAlso = {MsHTTPSamplerProxy.class, MsHeaderManager.class, MsJSR223Processor.class, MsJSR223PostProcessor.class,
|
||||
MsJSR223PreProcessor.class, MsTestPlan.class, MsThreadGroup.class, AuthManager.class, MsAssertions.class,
|
||||
MsJSR223PreProcessor.class, MsTestPlan.class, MsThreadGroup.class, MsAuthManager.class, MsAssertions.class,
|
||||
MsExtract.class, MsTCPSampler.class, MsDubboSampler.class, MsJDBCSampler.class, MsConstantTimer.class, MsIfController.class, MsScenario.class, MsLoopController.class, MsJmeterElement.class}, typeKey = "type")
|
||||
@Data
|
||||
public abstract class MsTestElement {
|
||||
|
|
|
@ -25,6 +25,7 @@ public class ShiroUtils {
|
|||
filterChainDefinitionMap.put("/favicon.ico", "anon");
|
||||
filterChainDefinitionMap.put("/display/file/**", "anon");
|
||||
filterChainDefinitionMap.put("/jmeter/download/**", "anon");
|
||||
filterChainDefinitionMap.put("/jmeter/ping", "anon");
|
||||
filterChainDefinitionMap.put("/authsource/list/allenable", "anon");
|
||||
filterChainDefinitionMap.put("/sso/signin", "anon");
|
||||
filterChainDefinitionMap.put("/sso/callback", "anon");
|
||||
|
|
|
@ -18,6 +18,11 @@ public class JmeterFileController {
|
|||
@Resource
|
||||
private JmeterFileService jmeterFileService;
|
||||
|
||||
@GetMapping("ping")
|
||||
public String checkStatus() {
|
||||
return "PONG";
|
||||
}
|
||||
|
||||
@GetMapping("download")
|
||||
public ResponseEntity<byte[]> downloadJmeterFiles(@RequestParam("testId") String testId, @RequestParam("resourceId") String resourceId,
|
||||
@RequestParam("ratio") double ratio, @RequestParam("startTime") long startTime,
|
||||
|
|
|
@ -74,14 +74,14 @@ public class DockerTestEngine extends AbstractEngine {
|
|||
BaseSystemConfigDTO baseInfo = CommonBeanFactory.getBean(SystemParameterService.class).getBaseInfo();
|
||||
KafkaProperties kafkaProperties = CommonBeanFactory.getBean(KafkaProperties.class);
|
||||
JmeterProperties jmeterProperties = CommonBeanFactory.getBean(JmeterProperties.class);
|
||||
String metersphereUrl = "http://localhost:8081";
|
||||
String metersphereUrl = "http://localhost:8081"; // 占位符
|
||||
if (baseInfo != null) {
|
||||
metersphereUrl = baseInfo.getUrl();
|
||||
}
|
||||
|
||||
String jmeterPingUrl = metersphereUrl + "/jmeter/ping"; // 检查下载地址是否正确
|
||||
// docker 不能从 localhost 中下载文件
|
||||
if (StringUtils.contains(metersphereUrl, "http://localhost")
|
||||
|| !UrlTestUtils.testUrlWithTimeOut(metersphereUrl, 1000)) {
|
||||
|| !UrlTestUtils.testUrlWithTimeOut(jmeterPingUrl, 1000)) {
|
||||
MSException.throwException(Translator.get("run_load_test_file_init_error"));
|
||||
}
|
||||
|
||||
|
|
|
@ -90,7 +90,6 @@ public class JmeterDocumentParser implements DocumentParser {
|
|||
parseHashTree(ele);
|
||||
} else if (nodeNameEquals(ele, TEST_PLAN)) {
|
||||
processSetupTestPlan(ele);
|
||||
processTearDownTestPlan(ele);
|
||||
processCheckoutConfigTestElement(ele);
|
||||
processCheckoutDnsCacheManager(ele);
|
||||
processCheckoutArguments(ele);
|
||||
|
@ -566,105 +565,18 @@ public class JmeterDocumentParser implements DocumentParser {
|
|||
}
|
||||
}
|
||||
|
||||
private void processTearDownTestPlan(Element ele) {
|
||||
/*<boolProp name="TestPlan.tearDown_on_shutdown">true</boolProp>*/
|
||||
Document document = ele.getOwnerDocument();
|
||||
Element tearDownSwitch = createBoolProp(document, "TestPlan.tearDown_on_shutdown", true);
|
||||
ele.appendChild(tearDownSwitch);
|
||||
|
||||
Node hashTree = ele.getNextSibling();
|
||||
while (!(hashTree instanceof Element)) {
|
||||
hashTree = hashTree.getNextSibling();
|
||||
}
|
||||
/*
|
||||
<PostThreadGroup guiclass="PostThreadGroupGui" testclass="PostThreadGroup" testname="tearDown Thread Group" enabled="true">
|
||||
<stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
|
||||
<elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
|
||||
<boolProp name="LoopController.continue_forever">false</boolProp>
|
||||
<stringProp name="LoopController.loops">1</stringProp>
|
||||
</elementProp>
|
||||
<stringProp name="ThreadGroup.num_threads">1</stringProp>
|
||||
<stringProp name="ThreadGroup.ramp_time">1</stringProp>
|
||||
<boolProp name="ThreadGroup.scheduler">false</boolProp>
|
||||
<stringProp name="ThreadGroup.duration"></stringProp>
|
||||
<stringProp name="ThreadGroup.delay"></stringProp>
|
||||
<boolProp name="ThreadGroup.same_user_on_next_iteration">true</boolProp>
|
||||
</PostThreadGroup>
|
||||
*/
|
||||
Element tearDownElement = document.createElement("PostThreadGroup");
|
||||
tearDownElement.setAttribute("guiclass", "PostThreadGroupGui");
|
||||
tearDownElement.setAttribute("testclass", "PostThreadGroup");
|
||||
tearDownElement.setAttribute("testname", "tearDown Thread Group");
|
||||
tearDownElement.setAttribute("enabled", "true");
|
||||
tearDownElement.appendChild(createStringProp(document, "ThreadGroup.on_sample_error", "continue"));
|
||||
tearDownElement.appendChild(createStringProp(document, "ThreadGroup.num_threads", "1"));
|
||||
tearDownElement.appendChild(createStringProp(document, "ThreadGroup.ramp_time", "1"));
|
||||
tearDownElement.appendChild(createStringProp(document, "ThreadGroup.duration", ""));
|
||||
tearDownElement.appendChild(createStringProp(document, "ThreadGroup.delay", ""));
|
||||
tearDownElement.appendChild(createBoolProp(document, "ThreadGroup.scheduler", false));
|
||||
tearDownElement.appendChild(createBoolProp(document, "ThreadGroup.same_user_on_next_iteration", true));
|
||||
Element elementProp = document.createElement("elementProp");
|
||||
elementProp.setAttribute("name", "ThreadGroup.main_controller");
|
||||
elementProp.setAttribute("elementType", "LoopController");
|
||||
elementProp.setAttribute("guiclass", "LoopControlPanel");
|
||||
elementProp.setAttribute("testclass", "LoopController");
|
||||
elementProp.setAttribute("testname", "Loop Controller");
|
||||
elementProp.setAttribute("enabled", "true");
|
||||
elementProp.appendChild(createBoolProp(document, "LoopController.continue_forever", false));
|
||||
elementProp.appendChild(createStringProp(document, "LoopController.loops", "1"));
|
||||
tearDownElement.appendChild(elementProp);
|
||||
hashTree.appendChild(tearDownElement);
|
||||
|
||||
Element tearDownHashTree = document.createElement(HASH_TREE_ELEMENT);
|
||||
/*
|
||||
<OnceOnlyController guiclass="OnceOnlyControllerGui" testclass="OnceOnlyController" testname="Once Only Controller" enabled="true"/>
|
||||
*/
|
||||
Element onceOnlyController = document.createElement("OnceOnlyController");
|
||||
onceOnlyController.setAttribute("guiclass", "OnceOnlyControllerGui");
|
||||
onceOnlyController.setAttribute("testclass", "OnceOnlyController");
|
||||
onceOnlyController.setAttribute("testname", "Once Only Controller");
|
||||
onceOnlyController.setAttribute("enabled", "true");
|
||||
tearDownHashTree.appendChild(onceOnlyController);
|
||||
/*
|
||||
<hashTree>
|
||||
<DebugSampler guiclass="TestBeanGUI" testclass="DebugSampler" testname="Debug Sampler" enabled="true">
|
||||
<boolProp name="displayJMeterProperties">false</boolProp>
|
||||
<boolProp name="displayJMeterVariables">true</boolProp>
|
||||
<boolProp name="displaySystemProperties">false</boolProp>
|
||||
</DebugSampler>
|
||||
<hashTree/>
|
||||
</hashTree>
|
||||
*/
|
||||
Element onceOnlyHashTree = document.createElement(HASH_TREE_ELEMENT);
|
||||
Element debugSampler = document.createElement("DebugSampler");
|
||||
debugSampler.setAttribute("guiclass", "TestBeanGUI");
|
||||
debugSampler.setAttribute("testclass", "DebugSampler");
|
||||
debugSampler.setAttribute("testname", "Debug Sampler");
|
||||
debugSampler.setAttribute("enabled", "true");
|
||||
debugSampler.appendChild(createBoolProp(document, "displayJMeterProperties", false));
|
||||
debugSampler.appendChild(createBoolProp(document, "displayJMeterVariables", true));
|
||||
debugSampler.appendChild(createBoolProp(document, "displaySystemProperties", false));
|
||||
onceOnlyHashTree.appendChild(debugSampler);
|
||||
// 添加空的 hashTree
|
||||
onceOnlyHashTree.appendChild(document.createElement(HASH_TREE_ELEMENT));
|
||||
tearDownHashTree.appendChild(onceOnlyHashTree);
|
||||
hashTree.appendChild(tearDownHashTree);
|
||||
// 添加backend listener
|
||||
processCheckoutBackendListener(tearDownElement);
|
||||
}
|
||||
|
||||
private Element createBoolProp(Document document, String name, boolean value) {
|
||||
Element tearDownSwitch = document.createElement("boolProp");
|
||||
tearDownSwitch.setAttribute("name", name);
|
||||
tearDownSwitch.appendChild(document.createTextNode(String.valueOf(value)));
|
||||
return tearDownSwitch;
|
||||
Element boolProp = document.createElement("boolProp");
|
||||
boolProp.setAttribute("name", name);
|
||||
boolProp.appendChild(document.createTextNode(String.valueOf(value)));
|
||||
return boolProp;
|
||||
}
|
||||
|
||||
private Element createIntProp(Document document, String name, int value) {
|
||||
Element tearDownSwitch = document.createElement("intProp");
|
||||
tearDownSwitch.setAttribute("name", name);
|
||||
tearDownSwitch.appendChild(document.createTextNode(String.valueOf(value)));
|
||||
return tearDownSwitch;
|
||||
Element intProp = document.createElement("intProp");
|
||||
intProp.setAttribute("name", name);
|
||||
intProp.appendChild(document.createTextNode(String.valueOf(value)));
|
||||
return intProp;
|
||||
}
|
||||
|
||||
private void processBackendListener(Element backendListener) {
|
||||
|
|
|
@ -1 +1 @@
|
|||
Subproject commit b9042074b780205e275c674f64417799110519fd
|
||||
Subproject commit 611c38a8b0db7180ea4d4c8ace749ac25499672d
|
|
@ -68,9 +68,7 @@
|
|||
<el-table-column v-if="item.id == 'tags'" prop="tags" min-width="120px"
|
||||
:label="$t('api_test.automation.tag')" :key="index">
|
||||
<template v-slot:default="scope">
|
||||
<div v-for="(itemName,index) in scope.row.tags" :key="index">
|
||||
<ms-tag type="success" effect="plain" :content="itemName"/>
|
||||
</div>
|
||||
<ms-tag v-for="(itemName,index) in scope.row.tags" :key="index" type="success" effect="plain" :content="itemName" style="margin-left: 5px"/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column v-if="item.id == 'userId'" prop="userId" min-width="120px"
|
||||
|
|
|
@ -72,9 +72,7 @@
|
|||
<el-table-column v-if="item.id=='tags'" prop="tags" min-width="120px" :label="$t('commons.tag')"
|
||||
:key="index">
|
||||
<template v-slot:default="scope">
|
||||
<div v-for="(itemName,index) in scope.row.tags" :key="index">
|
||||
<ms-tag type="success" effect="plain" :content="itemName"/>
|
||||
</div>
|
||||
<ms-tag v-for="(itemName,index) in scope.row.tags" :key="index" type="success" effect="plain" :content="itemName" style="margin-left: 5px"/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
|
|
|
@ -114,13 +114,10 @@
|
|||
v-if="item.id == 'tags'"
|
||||
prop="tags"
|
||||
:label="$t('commons.tag')"
|
||||
min-width="80px"
|
||||
:key="index"
|
||||
>
|
||||
min-width="120px"
|
||||
:key="index">
|
||||
<template v-slot:default="scope">
|
||||
<div v-for="(itemName,index) in scope.row.tags" :key="index">
|
||||
<ms-tag type="success" effect="plain" :content="itemName"/>
|
||||
</div>
|
||||
<ms-tag v-for="(itemName,index) in scope.row.tags" :key="index" type="success" effect="plain" :content="itemName" style="margin-left: 5px"/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
|
@ -225,7 +222,7 @@ import MsBottomContainer from "../BottomContainer";
|
|||
import ShowMoreBtn from "../../../../track/case/components/ShowMoreBtn";
|
||||
import MsBatchEdit from "../basis/BatchEdit";
|
||||
import {API_METHOD_COLOUR, API_STATUS, DUBBO_METHOD, REQ_METHOD, SQL_METHOD, TCP_METHOD} from "../../model/JsonData";
|
||||
import {downloadFile, getUUID} from "@/common/js/utils";
|
||||
import {downloadFile} from "@/common/js/utils";
|
||||
import {PROJECT_NAME} from '@/common/js/constants';
|
||||
import {getCurrentProjectID, getCurrentUser} from "@/common/js/utils";
|
||||
import {API_LIST, TEST_CASE_LIST, WORKSPACE_ID} from '@/common/js/constants';
|
||||
|
@ -246,7 +243,6 @@ import {
|
|||
import {_filter, _sort} from "@/common/js/tableUtils";
|
||||
import {Api_List, Track_Test_Case} from "@/business/components/common/model/JsonData";
|
||||
import HeaderCustom from "@/business/components/common/head/HeaderCustom";
|
||||
import {createComponent} from "@/business/components/api/definition/components/jmeter/components";
|
||||
|
||||
|
||||
export default {
|
||||
|
@ -273,7 +269,6 @@ export default {
|
|||
},
|
||||
data() {
|
||||
return {
|
||||
basisData: {},
|
||||
type: API_LIST,
|
||||
headerItems: Api_List,
|
||||
tableLabel: Api_List,
|
||||
|
@ -739,36 +734,36 @@ export default {
|
|||
</script>
|
||||
|
||||
<style scoped>
|
||||
.operate-button > div {
|
||||
display: inline-block;
|
||||
margin-left: 10px;
|
||||
}
|
||||
.operate-button > div {
|
||||
display: inline-block;
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
.request-method {
|
||||
padding: 0 5px;
|
||||
color: #1E90FF;
|
||||
}
|
||||
.request-method {
|
||||
padding: 0 5px;
|
||||
color: #1E90FF;
|
||||
}
|
||||
|
||||
.api-el-tag {
|
||||
color: white;
|
||||
}
|
||||
.api-el-tag {
|
||||
color: white;
|
||||
}
|
||||
|
||||
.search-input {
|
||||
float: right;
|
||||
width: 300px;
|
||||
margin-right: 10px;
|
||||
}
|
||||
.search-input {
|
||||
float: right;
|
||||
width: 300px;
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
.el-tag {
|
||||
margin-left: 10px;
|
||||
}
|
||||
.el-tag {
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
.ms-select-all >>> th:first-child {
|
||||
margin-top: 20px;
|
||||
}
|
||||
.ms-select-all >>> th:first-child {
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
.ms-select-all >>> th:nth-child(2) .el-icon-arrow-down {
|
||||
top: -2px;
|
||||
}
|
||||
.ms-select-all >>> th:nth-child(2) .el-icon-arrow-down {
|
||||
top: -2px;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
|
|
@ -135,9 +135,7 @@
|
|||
|
||||
<el-table-column v-if="item.id=='tags'" prop="tags" :label="$t('commons.tag')" :key="index">
|
||||
<template v-slot:default="scope">
|
||||
<div v-for="(itemName,index) in scope.row.tags" :key="index">
|
||||
<ms-tag type="success" effect="plain" :content="itemName"/>
|
||||
</div>
|
||||
<ms-tag v-for="(itemName,index) in scope.row.tags" :key="index" type="success" effect="plain" :content="itemName" style="margin-left: 5px"/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
|
|
|
@ -17,11 +17,9 @@
|
|||
</template>
|
||||
|
||||
</el-table-column>
|
||||
<el-table-column prop="tagNames" :label="$t('api_test.automation.tag')" width="200px">
|
||||
<el-table-column prop="tagNames" :label="$t('api_test.automation.tag')" min-width="120">
|
||||
<template v-slot:default="scope">
|
||||
<div v-for="itemName in scope.row.tags" :key="itemName">
|
||||
<ms-tag type="success" effect="plain" :content="itemName"/>
|
||||
</div>
|
||||
<ms-tag v-for="itemName in scope.row.tags" :key="itemName" type="success" effect="plain" :content="itemName" style="margin-left: 5px"/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="userId" :label="$t('api_test.automation.creator')" show-overflow-tooltip/>
|
||||
|
|
|
@ -80,9 +80,7 @@
|
|||
:label="$t('commons.tag')"
|
||||
:key="index">
|
||||
<template v-slot:default="scope">
|
||||
<div v-for="(itemName,index) in scope.row.tags" :key="index">
|
||||
<ms-tag type="success" effect="plain" :content="itemName"/>
|
||||
</div>
|
||||
<ms-tag v-for="(itemName,index) in scope.row.tags" :key="index" type="success" effect="plain" :content="itemName" style="margin-left: 5px"/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
|
|
|
@ -37,9 +37,7 @@
|
|||
<el-table-column v-if="item.id == 'tagNames'" prop="tagNames" :label="$t('api_test.automation.tag')"
|
||||
width="200px" :key="index">
|
||||
<template v-slot:default="scope">
|
||||
<div v-for="(itemName,index) in scope.row.tags" :key="index">
|
||||
<ms-tag type="success" effect="plain" :content="itemName"/>
|
||||
</div>
|
||||
<ms-tag v-for="(itemName,index) in scope.row.tags" :key="index" type="success" effect="plain" :content="itemName" style="margin-left: 5px"/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column v-if="item.id == 'userId'" prop="userId" :label="$t('api_test.automation.creator')"
|
||||
|
|
|
@ -94,9 +94,7 @@
|
|||
:key="index"
|
||||
>
|
||||
<template v-slot:default="scope">
|
||||
<div v-for="(tag, index) in scope.row.showTags" :key="tag + '_' + index">
|
||||
<ms-tag type="success" effect="plain" :content="tag"/>
|
||||
</div>
|
||||
<ms-tag v-for="(tag, index) in scope.row.showTags" :key="tag + '_' + index" type="success" effect="plain" :content="tag" style="margin-left: 5px"/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
|
|
|
@ -20,9 +20,7 @@
|
|||
|
||||
<el-table-column prop="tags" :label="$t('api_test.automation.tag')" width="200px">
|
||||
<template v-slot:default="scope">
|
||||
<div v-for="(itemName,index) in scope.row.tags" :key="index">
|
||||
<ms-tag type="success" effect="plain" :content="itemName"/>
|
||||
</div>
|
||||
<ms-tag v-for="(itemName,index) in scope.row.tags" :key="index" type="success" effect="plain" :content="itemName" style="margin-left: 5px"/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
|
|
Loading…
Reference in New Issue