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;
}