Merge branch 'v1.7'

This commit is contained in:
chenjianxing 2021-02-05 10:56:42 +08:00
commit b41edd7c03
11 changed files with 204 additions and 184 deletions

View File

@ -196,6 +196,8 @@ public abstract class MsTestElement {
csvDataSet.setProperty("filename", BODY_FILE_DIR + "/" + item.getFiles().get(0).getId() + "_" + item.getFiles().get(0).getName()); csvDataSet.setProperty("filename", BODY_FILE_DIR + "/" + item.getFiles().get(0).getId() + "_" + item.getFiles().get(0).getName());
} }
csvDataSet.setIgnoreFirstLine(false); csvDataSet.setIgnoreFirstLine(false);
csvDataSet.setRecycle(true);
csvDataSet.setProperty("recycle", true);
csvDataSet.setProperty("delimiter", item.getDelimiter()); csvDataSet.setProperty("delimiter", item.getDelimiter());
csvDataSet.setComment(StringUtils.isEmpty(item.getDescription()) ? "" : item.getDescription()); csvDataSet.setComment(StringUtils.isEmpty(item.getDescription()) ? "" : item.getDescription());
tree.add(csvDataSet); tree.add(csvDataSet);

View File

@ -171,12 +171,16 @@ public class HistoricalDataUpgradeService {
element = new MsJDBCSampler(); element = new MsJDBCSampler();
SqlRequest request1 = (SqlRequest) request; SqlRequest request1 = (SqlRequest) request;
BeanUtils.copyBean(element, request1); BeanUtils.copyBean(element, request1);
EnvironmentDTO dto = environmentDTOMap.get(request1.getDataSource()); EnvironmentDTO dto = environmentDTOMap.get(request1.getDataSource());
if (dto != null) { if (dto != null) {
((MsJDBCSampler) element).setEnvironmentId(dto.getEnvironmentId()); ((MsJDBCSampler) element).setEnvironmentId(dto.getEnvironmentId());
((MsJDBCSampler) element).setDataSourceId(dto.getDatabaseConfig().getId()); ((MsJDBCSampler) element).setDataSourceId(dto.getDatabaseConfig().getId());
((MsJDBCSampler) element).setDataSource(dto.getDatabaseConfig()); ((MsJDBCSampler) element).setDataSource(dto.getDatabaseConfig());
} }
if (CollectionUtils.isEmpty(request1.getVariables())) {
((MsJDBCSampler) element).setVariables(new ArrayList<>());
}
element.setType("JDBCSampler"); element.setType("JDBCSampler");
} }
if (request instanceof TCPRequest) { if (request instanceof TCPRequest) {

View File

@ -11,6 +11,7 @@
@edit="edit" @edit="edit"
@drag="drag" @drag="drag"
@remove="remove" @remove="remove"
@refresh="list"
@nodeSelectEvent="nodeChange" @nodeSelectEvent="nodeChange"
ref="nodeTree"> ref="nodeTree">
@ -34,24 +35,24 @@
</template> </template>
<script> <script>
import SelectMenu from "../../../track/common/SelectMenu"; import SelectMenu from "../../../track/common/SelectMenu";
import MsAddBasisScenario from "@/business/components/api/automation/scenario/AddBasisScenario"; import MsAddBasisScenario from "@/business/components/api/automation/scenario/AddBasisScenario";
import {getCurrentProjectID} from "@/common/js/utils"; import {getCurrentProjectID} from "@/common/js/utils";
import MsNodeTree from "../../../track/common/NodeTree"; import MsNodeTree from "../../../track/common/NodeTree";
import {buildNodePath} from "../../definition/model/NodeTree"; import {buildNodePath} from "../../definition/model/NodeTree";
import ModuleTrashButton from "../../definition/components/module/ModuleTrashButton"; import ModuleTrashButton from "../../definition/components/module/ModuleTrashButton";
export default { export default {
name: 'MsApiScenarioModule', name: 'MsApiScenarioModule',
components: { components: {
ModuleTrashButton, ModuleTrashButton,
MsNodeTree, MsNodeTree,
MsAddBasisScenario, MsAddBasisScenario,
SelectMenu, SelectMenu,
}, },
props: { props: {
isReadOnly: { isReadOnly: {
type: Boolean, type: Boolean,
default() { default() {
return false return false
} }

View File

@ -17,29 +17,29 @@
</template> </template>
<script> <script>
import MsEditCompleteHttpApi from "./complete/EditCompleteHTTPApi"; import MsEditCompleteHttpApi from "./complete/EditCompleteHTTPApi";
import MsEditCompleteTcpApi from "./complete/EditCompleteTCPApi"; import MsEditCompleteTcpApi from "./complete/EditCompleteTCPApi";
import MsEditCompleteDubboApi from "./complete/EditCompleteDubboApi"; import MsEditCompleteDubboApi from "./complete/EditCompleteDubboApi";
import MsEditCompleteSqlApi from "./complete/EditCompleteSQLApi"; import MsEditCompleteSqlApi from "./complete/EditCompleteSQLApi";
import {ResponseFactory, Body} from "../model/ApiTestModel"; import {Body} from "../model/ApiTestModel";
import {getUUID, getCurrentProjectID} from "@/common/js/utils"; import {getUUID} from "@/common/js/utils";
import {createComponent, Request} from "./jmeter/components"; import {createComponent, Request} from "./jmeter/components";
import Sampler from "./jmeter/components/sampler/sampler"; import Sampler from "./jmeter/components/sampler/sampler";
import {WORKSPACE_ID} from '@/common/js/constants'; import {WORKSPACE_ID} from '@/common/js/constants';
import {handleCtrlSEvent} from "../../../../../common/js/utils"; import {handleCtrlSEvent} from "../../../../../common/js/utils";
export default { export default {
name: "ApiConfig", name: "ApiConfig",
components: {MsEditCompleteHttpApi, MsEditCompleteTcpApi, MsEditCompleteDubboApi, MsEditCompleteSqlApi}, components: {MsEditCompleteHttpApi, MsEditCompleteTcpApi, MsEditCompleteDubboApi, MsEditCompleteSqlApi},
data() { data() {
return { return {
reqUrl: "", reqUrl: "",
request: Sampler, request: Sampler,
config: {}, config: {},
response: {}, response: {},
maintainerOptions: [], maintainerOptions: [],
} }
}, },
props: { props: {
currentApi: {}, currentApi: {},

View File

@ -11,6 +11,7 @@
@edit="edit" @edit="edit"
@drag="drag" @drag="drag"
@remove="remove" @remove="remove"
@refresh="list"
@nodeSelectEvent="nodeChange" @nodeSelectEvent="nodeChange"
ref="nodeTree"> ref="nodeTree">
@ -33,26 +34,26 @@
</template> </template>
<script> <script>
import MsAddBasisApi from "../basis/AddBasisApi"; import MsAddBasisApi from "../basis/AddBasisApi";
import SelectMenu from "../../../../track/common/SelectMenu"; import SelectMenu from "../../../../track/common/SelectMenu";
import {OPTIONS} from "../../model/JsonData"; import {OPTIONS} from "../../model/JsonData";
import ApiImport from "../import/ApiImport"; import ApiImport from "../import/ApiImport";
import {getCurrentProjectID} from "@/common/js/utils"; import {getCurrentProjectID} from "@/common/js/utils";
import MsNodeTree from "../../../../track/common/NodeTree"; import MsNodeTree from "../../../../track/common/NodeTree";
import ApiModuleHeader from "./ApiModuleHeader"; import ApiModuleHeader from "./ApiModuleHeader";
import {buildNodePath} from "../../model/NodeTree"; import {buildNodePath} from "../../model/NodeTree";
export default { export default {
name: 'MsApiModule', name: 'MsApiModule',
components: { components: {
ApiModuleHeader, ApiModuleHeader,
MsNodeTree, MsNodeTree,
MsAddBasisApi, MsAddBasisApi,
SelectMenu, SelectMenu,
ApiImport ApiImport
}, },
data() { data() {
return { return {
result: {}, result: {},
condition: { condition: {
protocol: OPTIONS[0].value, protocol: OPTIONS[0].value,

View File

@ -44,29 +44,29 @@
</template> </template>
<script> <script>
import {downloadFile, getUUID} from "@/common/js/utils"; import {getUUID, uuid} from "@/common/js/utils";
import MsApiCaseList from "../case/ApiCaseList"; import MsApiCaseList from "../case/ApiCaseList";
import MsContainer from "../../../../common/components/MsContainer"; import MsContainer from "../../../../common/components/MsContainer";
import MsBottomContainer from "../BottomContainer"; import MsBottomContainer from "../BottomContainer";
import {parseEnvironment} from "../../model/EnvironmentModel"; import {parseEnvironment} from "../../model/EnvironmentModel";
import ApiEnvironmentConfig from "../environment/ApiEnvironmentConfig"; import ApiEnvironmentConfig from "../environment/ApiEnvironmentConfig";
import MsRequestResultTail from "../response/RequestResultTail"; import MsRequestResultTail from "../response/RequestResultTail";
import MsRun from "../Run"; import MsRun from "../Run";
import MsBasisParameters from "../request/dubbo/BasisParameters"; import MsBasisParameters from "../request/dubbo/BasisParameters";
import {REQ_METHOD} from "../../model/JsonData"; import {REQ_METHOD} from "../../model/JsonData";
import MsJmxStep from "../step/JmxStep"; import MsJmxStep from "../step/JmxStep";
export default { export default {
name: "RunTestDubboPage", name: "RunTestDubboPage",
components: { components: {
MsApiCaseList, MsApiCaseList,
MsContainer, MsContainer,
MsBottomContainer, MsBottomContainer,
MsRequestResultTail, MsRequestResultTail,
ApiEnvironmentConfig, ApiEnvironmentConfig,
MsRun, MsRun,
MsBasisParameters, MsBasisParameters,
MsJmxStep MsJmxStep
}, },
data() { data() {
return { return {
@ -161,12 +161,14 @@
}, },
saveAsApi() { saveAsApi() {
let data = {}; let data = {};
this.api.request.id = uuid();
data.request = JSON.stringify(this.api.request); data.request = JSON.stringify(this.api.request);
data.method = this.api.method; data.method = this.api.method;
data.status = this.api.status; data.status = this.api.status;
data.userId = this.api.userId; data.userId = this.api.userId;
data.description = this.api.description; data.description = this.api.description;
this.$emit('saveAsApi', data); this.$emit('saveAsApi', data);
this.$emit('refresh');
}, },
updateApi() { updateApi() {
let url = "/api/definition/update"; let url = "/api/definition/update";

View File

@ -44,29 +44,29 @@
</template> </template>
<script> <script>
import {downloadFile, getUUID} from "@/common/js/utils"; import {getUUID, uuid} from "@/common/js/utils";
import MsApiCaseList from "../case/ApiCaseList"; import MsApiCaseList from "../case/ApiCaseList";
import MsContainer from "../../../../common/components/MsContainer"; import MsContainer from "../../../../common/components/MsContainer";
import MsBottomContainer from "../BottomContainer"; import MsBottomContainer from "../BottomContainer";
import {parseEnvironment} from "../../model/EnvironmentModel"; import {parseEnvironment} from "../../model/EnvironmentModel";
import ApiEnvironmentConfig from "../environment/ApiEnvironmentConfig"; import ApiEnvironmentConfig from "../environment/ApiEnvironmentConfig";
import MsRequestResultTail from "../response/RequestResultTail"; import MsRequestResultTail from "../response/RequestResultTail";
import MsRun from "../Run"; import MsRun from "../Run";
import MsBasisParameters from "../request/database/BasisParameters"; import MsBasisParameters from "../request/database/BasisParameters";
import {REQ_METHOD} from "../../model/JsonData"; import {REQ_METHOD} from "../../model/JsonData";
import MsJmxStep from "../step/JmxStep"; import MsJmxStep from "../step/JmxStep";
export default { export default {
name: "RunTestSQLPage", name: "RunTestSQLPage",
components: { components: {
MsApiCaseList, MsApiCaseList,
MsContainer, MsContainer,
MsBottomContainer, MsBottomContainer,
MsRequestResultTail, MsRequestResultTail,
ApiEnvironmentConfig, ApiEnvironmentConfig,
MsRun, MsRun,
MsBasisParameters, MsBasisParameters,
MsJmxStep MsJmxStep
}, },
data() { data() {
return { return {
@ -160,12 +160,14 @@
}, },
saveAsApi() { saveAsApi() {
let data = {}; let data = {};
this.api.request.id = uuid();
data.request = JSON.stringify(this.api.request); data.request = JSON.stringify(this.api.request);
data.method = this.api.method; data.method = this.api.method;
data.status = this.api.status; data.status = this.api.status;
data.userId = this.api.userId; data.userId = this.api.userId;
data.description = this.api.description; data.description = this.api.description;
this.$emit('saveAsApi', data); this.$emit('saveAsApi', data);
this.$emit('refresh');
}, },
updateApi() { updateApi() {
let url = "/api/definition/update"; let url = "/api/definition/update";
@ -175,7 +177,7 @@
if (this.syncTabs.indexOf(this.api.id) === -1) { if (this.syncTabs.indexOf(this.api.id) === -1) {
this.syncTabs.push(this.api.id); this.syncTabs.push(this.api.id);
} }
this.$emit('saveApi', this.api); this.$emit('refresh');
}); });
}, },
selectTestCase(item) { selectTestCase(item) {

View File

@ -54,29 +54,29 @@
</template> </template>
<script> <script>
import MsApiRequestForm from "../request/http/ApiHttpRequestForm"; import MsApiRequestForm from "../request/http/ApiHttpRequestForm";
import {downloadFile, getUUID, getCurrentProjectID} from "@/common/js/utils"; import {getUUID, uuid} from "@/common/js/utils";
import MsApiCaseList from "../case/ApiCaseList"; import MsApiCaseList from "../case/ApiCaseList";
import MsContainer from "../../../../common/components/MsContainer"; import MsContainer from "../../../../common/components/MsContainer";
import MsBottomContainer from "../BottomContainer"; import MsBottomContainer from "../BottomContainer";
import MsRequestResultTail from "../response/RequestResultTail"; import MsRequestResultTail from "../response/RequestResultTail";
import MsRun from "../Run"; import MsRun from "../Run";
import MsBasisParameters from "../request/tcp/TcpBasisParameters"; import MsBasisParameters from "../request/tcp/TcpBasisParameters";
import {REQ_METHOD} from "../../model/JsonData"; import {REQ_METHOD} from "../../model/JsonData";
import EnvironmentSelect from "../environment/EnvironmentSelect"; import EnvironmentSelect from "../environment/EnvironmentSelect";
import MsJmxStep from "../step/JmxStep"; import MsJmxStep from "../step/JmxStep";
export default { export default {
name: "RunTestTCPPage", name: "RunTestTCPPage",
components: { components: {
MsJmxStep, MsJmxStep,
EnvironmentSelect, EnvironmentSelect,
MsApiRequestForm, MsApiRequestForm,
MsApiCaseList, MsApiCaseList,
MsContainer, MsContainer,
MsBottomContainer, MsBottomContainer,
MsRequestResultTail, MsRequestResultTail,
MsRun, MsRun,
MsBasisParameters MsBasisParameters
}, },
data() { data() {
@ -173,12 +173,14 @@
}, },
saveAsApi() { saveAsApi() {
let data = {}; let data = {};
this.api.request.id = uuid();
data.request = JSON.stringify(this.api.request); data.request = JSON.stringify(this.api.request);
data.method = this.api.method; data.method = this.api.method;
data.status = this.api.status; data.status = this.api.status;
data.userId = this.api.userId; data.userId = this.api.userId;
data.description = this.api.description; data.description = this.api.description;
this.$emit('saveAsApi', data); this.$emit('saveAsApi', data);
this.$emit('refresh');
}, },
updateApi() { updateApi() {
let url = "/api/definition/update"; let url = "/api/definition/update";

View File

@ -14,11 +14,11 @@
<el-form :inline="true"> <el-form :inline="true">
<el-form-item :label="$t('load_test.thread_num')"> <el-form-item :label="$t('load_test.thread_num')">
<el-input-number <el-input-number
:disabled="true" :disabled="true"
:placeholder="$t('load_test.input_thread_num')" :placeholder="$t('load_test.input_thread_num')"
v-model="threadGroup.threadNumber" v-model="threadGroup.threadNumber"
:min="1" :min="1"
size="mini"/> size="mini"/>
</el-form-item> </el-form-item>
<br> <br>
<el-form-item> <el-form-item>
@ -31,72 +31,72 @@
<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="true" :disabled="true"
v-model="threadGroup.duration" v-model="threadGroup.duration"
:min="1" :min="1"
@change="calculateChart(threadGroup)" @change="calculateChart(threadGroup)"
size="mini"/> size="mini"/>
</el-form-item> </el-form-item>
<br> <br>
<el-form-item :label="$t('load_test.rps_limit')"> <el-form-item :label="$t('load_test.rps_limit')">
<el-switch v-model="threadGroup.rpsLimitEnable" @change="calculateTotalChart()"/> <el-switch v-model="threadGroup.rpsLimitEnable" @change="calculateTotalChart()"/>
&nbsp; &nbsp;
<el-input-number <el-input-number
:disabled="true " :disabled="true "
v-model="threadGroup.rpsLimit" v-model="threadGroup.rpsLimit"
@change="calculateChart(threadGroup)" @change="calculateChart(threadGroup)"
:min="1" :min="1"
size="mini"/> size="mini"/>
</el-form-item> </el-form-item>
<br> <br>
<el-form-item :label="$t('load_test.ramp_up_time_within')"> <el-form-item :label="$t('load_test.ramp_up_time_within')">
<el-input-number <el-input-number
:disabled="true" :disabled="true"
:min="1" :min="1"
:max="threadGroup.duration" :max="threadGroup.duration"
v-model="threadGroup.rampUpTime" v-model="threadGroup.rampUpTime"
@change="calculateChart(threadGroup)" @change="calculateChart(threadGroup)"
size="mini"/> size="mini"/>
</el-form-item> </el-form-item>
<el-form-item :label="$t('load_test.ramp_up_time_minutes')"> <el-form-item :label="$t('load_test.ramp_up_time_minutes')">
<el-input-number <el-input-number
:disabled="true" :disabled="true"
:min="1" :min="1"
:max="Math.min(threadGroup.threadNumber, threadGroup.rampUpTime)" :max="Math.min(threadGroup.threadNumber, threadGroup.rampUpTime)"
v-model="threadGroup.step" v-model="threadGroup.step"
@change="calculateChart(threadGroup)" @change="calculateChart(threadGroup)"
size="mini"/> size="mini"/>
</el-form-item> </el-form-item>
<el-form-item :label="$t('load_test.ramp_up_time_times')"/> <el-form-item :label="$t('load_test.ramp_up_time_times')"/>
</div> </div>
<div v-if="threadGroup.threadType === 'ITERATION'"> <div v-if="threadGroup.threadType === 'ITERATION'">
<el-form-item :label="$t('load_test.iterate_num')"> <el-form-item :label="$t('load_test.iterate_num')">
<el-input-number <el-input-number
:disabled="true" :disabled="true"
v-model="threadGroup.iterateNum" v-model="threadGroup.iterateNum"
:min="1" :min="1"
@change="calculateChart(threadGroup)" @change="calculateChart(threadGroup)"
size="mini"/> size="mini"/>
</el-form-item> </el-form-item>
<br> <br>
<el-form-item :label="$t('load_test.rps_limit')"> <el-form-item :label="$t('load_test.rps_limit')">
<el-switch v-model="threadGroup.rpsLimitEnable" @change="calculateTotalChart()"/> <el-switch v-model="threadGroup.rpsLimitEnable" @change="calculateTotalChart()"/>
&nbsp; &nbsp;
<el-input-number <el-input-number
:disabled="true || !threadGroup.rpsLimitEnable" :disabled="true || !threadGroup.rpsLimitEnable"
v-model="threadGroup.rpsLimit" v-model="threadGroup.rpsLimit"
@change="calculateChart(threadGroup)" @change="calculateChart(threadGroup)"
:min="1" :min="1"
size="mini"/> size="mini"/>
</el-form-item> </el-form-item>
<br> <br>
<el-form-item :label="$t('load_test.ramp_up_time_within')"> <el-form-item :label="$t('load_test.ramp_up_time_within')">
<el-input-number <el-input-number
:disabled="true" :disabled="true"
:min="1" :min="1"
v-model="threadGroup.iterateRampUp" v-model="threadGroup.iterateRampUp"
@change="calculateChart(threadGroup)" @change="calculateChart(threadGroup)"
size="mini"/> size="mini"/>
</el-form-item> </el-form-item>
<el-form-item :label="$t('load_test.ramp_up_time_seconds')"/> <el-form-item :label="$t('load_test.ramp_up_time_seconds')"/>
</div> </div>
@ -129,11 +129,11 @@ const ITERATE_RAMP_UP = "iterateRampUpTime";
const hexToRgba = function (hex, opacity) { const hexToRgba = function (hex, opacity) {
return 'rgba(' + parseInt('0x' + hex.slice(1, 3)) + ',' + parseInt('0x' + hex.slice(3, 5)) + ',' return 'rgba(' + parseInt('0x' + hex.slice(1, 3)) + ',' + parseInt('0x' + hex.slice(3, 5)) + ','
+ parseInt('0x' + hex.slice(5, 7)) + ',' + opacity + ')'; + parseInt('0x' + hex.slice(5, 7)) + ',' + opacity + ')';
} }
const hexToRgb = function (hex) { const hexToRgb = function (hex) {
return 'rgb(' + parseInt('0x' + hex.slice(1, 3)) + ',' + parseInt('0x' + hex.slice(3, 5)) return 'rgb(' + parseInt('0x' + hex.slice(1, 3)) + ',' + parseInt('0x' + hex.slice(3, 5))
+ ',' + parseInt('0x' + hex.slice(5, 7)) + ')'; + ',' + parseInt('0x' + hex.slice(5, 7)) + ')';
} }
export default { export default {
@ -469,11 +469,12 @@ export default {
}, },
}, },
watch: { watch: {
'report.testId': { report: {
handler() { handler() {
this.getJmxContent(); this.getJmxContent();
}, },
} deep: true
},
} }
} }
</script> </script>

View File

@ -220,6 +220,10 @@ export default {
if (dropType === "none" || dropType === undefined) { if (dropType === "none" || dropType === undefined) {
return; return;
} }
if (dropNode.data.id === 'root' && dropType === 'before') {
this.$emit('refresh');
return false;
}
let param = this.buildParam(draggingNode, dropNode, dropType); let param = this.buildParam(draggingNode, dropNode, dropType);
let list = []; let list = [];
this.getNodeTree(this.treeNodes, draggingNode.data.id, list); this.getNodeTree(this.treeNodes, draggingNode.data.id, list);

View File

@ -8,25 +8,26 @@
@drag="drag" @drag="drag"
@remove="remove" @remove="remove"
@nodeSelectEvent="nodeChange" @nodeSelectEvent="nodeChange"
@refresh="list"
ref="nodeTree"/> ref="nodeTree"/>
</template> </template>
<script> <script>
import NodeEdit from "./NodeEdit"; import NodeEdit from "./NodeEdit";
import {getCurrentProjectID} from "../../../../common/js/utils"; import {getCurrentProjectID} from "../../../../common/js/utils";
import MsNodeTree from "./NodeTree"; import MsNodeTree from "./NodeTree";
export default { export default {
name: "TestCaseNodeTree", name: "TestCaseNodeTree",
components: {MsNodeTree, NodeEdit }, components: {MsNodeTree, NodeEdit},
data() { data() {
return { return {
defaultProps: { defaultProps: {
children: "children", children: "children",
label: "label" label: "label"
}, },
result: {}, result: {},
treeNodes: [], treeNodes: [],
projectId: "" projectId: ""
}; };
}, },