From d5b6341b21352444de83d9cb470514a63c50b93d Mon Sep 17 00:00:00 2001 From: liangdaliang Date: Thu, 24 Apr 2025 09:15:40 +0800 Subject: [PATCH] =?UTF-8?q?Jmeter=20Json=E6=8F=90=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test-common/pom.xml | 5 ++ .../core/domain/model/JmeterRequest.java | 80 +++---------------- .../test/common/utils/JMeterGroupUtil.java | 43 +++++++++- .../PerformanceTestCaseReportServiceImpl.java | 18 +++++ 4 files changed, 72 insertions(+), 74 deletions(-) diff --git a/test-common/pom.xml b/test-common/pom.xml index faa1abe..12e09f9 100644 --- a/test-common/pom.xml +++ b/test-common/pom.xml @@ -162,6 +162,11 @@ selenium-java 4.30.0 + + org.projectlombok + lombok + provided + diff --git a/test-common/src/main/java/com/test/common/core/domain/model/JmeterRequest.java b/test-common/src/main/java/com/test/common/core/domain/model/JmeterRequest.java index 98cec0a..9de0668 100644 --- a/test-common/src/main/java/com/test/common/core/domain/model/JmeterRequest.java +++ b/test-common/src/main/java/com/test/common/core/domain/model/JmeterRequest.java @@ -1,10 +1,15 @@ package com.test.common.core.domain.model; +import lombok.Data; + +import java.util.List; + /** * @author liangdaliang * @Description:Jmeter调用参数 * @date 2025-02-19 10:55 */ +@Data public class JmeterRequest { /** * 用例步骤id @@ -51,75 +56,8 @@ public class JmeterRequest { */ private String jmeterHomePath; - public String getTestCaseName() { - return testCaseName; - } - - public void setTestCaseName(String testCaseName) { - this.testCaseName = testCaseName; - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - public int getPort() { - return port; - } - - public void setPort(int port) { - this.port = port; - } - - public String getMethod() { - return method; - } - - public void setMethod(String method) { - this.method = method; - } - - public String getRequestBody() { - return requestBody; - } - - public void setRequestBody(String requestBody) { - this.requestBody = requestBody; - } - - public String getRequestParams() { - return requestParams; - } - - public void setRequestParams(String requestParams) { - this.requestParams = requestParams; - } - - public String getRequestHeader() { - return requestHeader; - } - - public void setRequestHeader(String requestHeader) { - this.requestHeader = requestHeader; - } - - public String getJmeterHomePath() { - return jmeterHomePath; - } - - public void setJmeterHomePath(String jmeterHomePath) { - this.jmeterHomePath = jmeterHomePath; - } + /** + * jmeter提取表达式 + */ + private List extractionRuleList; } diff --git a/test-common/src/main/java/com/test/common/utils/JMeterGroupUtil.java b/test-common/src/main/java/com/test/common/utils/JMeterGroupUtil.java index 5e46c9f..fc63ada 100644 --- a/test-common/src/main/java/com/test/common/utils/JMeterGroupUtil.java +++ b/test-common/src/main/java/com/test/common/utils/JMeterGroupUtil.java @@ -11,6 +11,8 @@ import org.apache.jmeter.control.LoopController; import org.apache.jmeter.control.gui.LoopControlPanel; import org.apache.jmeter.control.gui.TestPlanGui; import org.apache.jmeter.engine.StandardJMeterEngine; +import org.apache.jmeter.extractor.json.jsonpath.JSONPostProcessor; +import org.apache.jmeter.extractor.json.jsonpath.gui.JSONPostProcessorGui; import org.apache.jmeter.protocol.http.control.Header; import org.apache.jmeter.protocol.http.control.HeaderManager; import org.apache.jmeter.protocol.http.control.gui.HttpTestSampleGui; @@ -92,8 +94,8 @@ public class JMeterGroupUtil { List resultCollector = getResultCollector(replayLogPath, summaryReportPath); // 5. 构建测试树,新增每个用例下的http请求节点 - HashTree firstTreeTestPlan = new HashTree(); - HashTree secondHashTree = new HashTree(); + HashTree firstTreeTestPlan = new ListedHashTree(); + HashTree secondHashTree = new ListedHashTree(); ListedHashTree thirdHashTree = new ListedHashTree(); dealHttpHashTreeWithRequestList(thirdHashTree, jmeterGroupRequest.getJmeterRequestList()); @@ -194,11 +196,18 @@ public class JMeterGroupUtil { } } HeaderManager headerManager = createHeaderManager(headerMap); + List extractionRuleList = jmeterRequest.getExtractionRuleList(); if (headerManager != null) { fourHashTree.add(headerManager); + createJsonPostProcessor(extractionRuleList, fourHashTree); thirdHashTree.add(httpSampler, fourHashTree); } else { - thirdHashTree.add(httpSampler); + createJsonPostProcessor(extractionRuleList, fourHashTree); + if (fourHashTree.isEmpty()) { + thirdHashTree.add(httpSampler); + } else { + thirdHashTree.add(httpSampler, fourHashTree); + } } } catch (Exception e) { @@ -208,6 +217,34 @@ public class JMeterGroupUtil { } } + /** + * 创建Json参数提取 + * @param extractionRuleList + * @param fourHashTree + * @return + */ + private static void createJsonPostProcessor(List extractionRuleList, HashTree fourHashTree) { + if (extractionRuleList != null) { + for (String extractionRule : extractionRuleList) { + String[] array = extractionRule.split(","); + JSONPostProcessor jsonExtractor = new JSONPostProcessor(); + jsonExtractor.setName("提取" + array[0]); + jsonExtractor.setProperty(TestElement.TEST_CLASS, JSONPostProcessor.class.getName()); + jsonExtractor.setProperty(TestElement.GUI_CLASS, JSONPostProcessorGui.class.getName()); + jsonExtractor.setEnabled(true); + if (array[1].startsWith("$")) { + jsonExtractor.setJsonPathExpressions(array[1]); // JSONPath 表达式 + } else { + jsonExtractor.setJsonPathExpressions("$." + array[1]); // JSONPath 表达式 + } + jsonExtractor.setMatchNumbers("1"); // 0表示随机,1表示第一个 + jsonExtractor.setRefNames(array[0]); // 存储变量名 + jsonExtractor.setDefaultValues(""); + fourHashTree.add(jsonExtractor); + } + } + } + /** * 创建测试计划 * @param name diff --git a/test-test/src/main/java/com/test/test/service/impl/PerformanceTestCaseReportServiceImpl.java b/test-test/src/main/java/com/test/test/service/impl/PerformanceTestCaseReportServiceImpl.java index f46ea7c..144b4a5 100644 --- a/test-test/src/main/java/com/test/test/service/impl/PerformanceTestCaseReportServiceImpl.java +++ b/test-test/src/main/java/com/test/test/service/impl/PerformanceTestCaseReportServiceImpl.java @@ -2,14 +2,17 @@ package com.test.test.service.impl; import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; import com.test.common.core.domain.model.*; import com.test.common.utils.DateUtils; import com.test.common.utils.JMeterGroupUtil; import com.test.common.utils.SecurityUtils; +import com.test.common.utils.StringUtils; import com.test.test.domain.PerformanceTest; import com.test.test.domain.PerformanceTestCase; import com.test.test.domain.PerformanceTestCaseReport; import com.test.test.domain.TestCaseStep; +import com.test.test.domain.qo.ExtractionRule; import com.test.test.mapper.PerformanceTestCaseMapper; import com.test.test.mapper.PerformanceTestCaseReportMapper; import com.test.test.mapper.PerformanceTestMapper; @@ -21,6 +24,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; +import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -164,6 +168,20 @@ public class PerformanceTestCaseReportServiceImpl implements IPerformanceTestCas jmeterRequest.setRequestBody(testCaseStep.getRequestBody()); jmeterRequest.setRequestParams(testCaseStep.getRequestParams()); jmeterRequest.setRequestHeader(testCaseStep.getRequestHeader()); + // Json提取表达式 + String assignment = testCaseStep.getAssignment(); + if (!StringUtils.isEmpty(assignment) && !"[]".equals(assignment)) { + Gson gson = new Gson(); + Type ruleListType = new TypeToken>() {}.getType(); + List rules = gson.fromJson(assignment, ruleListType); + if (!CollectionUtils.isEmpty(rules)) { + List extractionRuleList = new ArrayList<>(); + for (ExtractionRule rule : rules) { + extractionRuleList.add(rule.getName() + "," + rule.getPath()); + jmeterRequest.setExtractionRuleList(extractionRuleList); + } + } + } log.info("getRequestHeader:{}", jmeterRequest.getRequestHeader()); return jmeterRequest; }