提交 ed8ae56e authored 作者: 黄夏豪's avatar 黄夏豪

fix(base): 修复了jsonPath无法正确替换的问题

fix(base): 修改了HttpClient执行器的作用域
上级 45ab62d4
...@@ -3,7 +3,22 @@ package org.matrix.actuators.httpclient; ...@@ -3,7 +3,22 @@ package org.matrix.actuators.httpclient;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import io.netty.handler.codec.http.HttpHeaderValues; import io.netty.handler.codec.http.HttpHeaderValues;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.http.client.CookieStore;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.config.SocketConfig;
import org.apache.http.conn.HttpHostConnectException; import org.apache.http.conn.HttpHostConnectException;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.TrustStrategy;
import org.apache.http.impl.NoConnectionReuseStrategy;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.client.DefaultHttpRequestRetryHandler;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.matrix.actuators.Actuator; import org.matrix.actuators.Actuator;
import org.matrix.actuators.util.CompleteExpressionUtil; import org.matrix.actuators.util.CompleteExpressionUtil;
import org.apache.http.Consts; import org.apache.http.Consts;
...@@ -20,6 +35,7 @@ import org.apache.http.entity.mime.MultipartEntityBuilder; ...@@ -20,6 +35,7 @@ import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.message.BasicNameValuePair; import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils; import org.apache.http.util.EntityUtils;
import org.matrix.config.HttpRequestConfig;
import org.matrix.database.entity.Environment; import org.matrix.database.entity.Environment;
import org.matrix.database.service.IEnvironmentService; import org.matrix.database.service.IEnvironmentService;
import org.matrix.exception.GlobalException; import org.matrix.exception.GlobalException;
...@@ -29,16 +45,19 @@ import org.springframework.http.HttpMethod; ...@@ -29,16 +45,19 @@ import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.net.ssl.SSLContext;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.security.cert.X509Certificate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.ZoneOffset; import java.time.ZoneOffset;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -55,7 +74,7 @@ public class HttpClientActuator implements Actuator { ...@@ -55,7 +74,7 @@ public class HttpClientActuator implements Actuator {
private static final String PATTERN_URL = "(https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]"; private static final String PATTERN_URL = "(https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]";
final final
CloseableHttpClient client; HttpRequestConfig httpRequestConfig;
final final
CompleteExpressionUtil completeExpressionUtil; CompleteExpressionUtil completeExpressionUtil;
...@@ -63,10 +82,10 @@ public class HttpClientActuator implements Actuator { ...@@ -63,10 +82,10 @@ public class HttpClientActuator implements Actuator {
final final
IEnvironmentService environmentService; IEnvironmentService environmentService;
public HttpClientActuator(CloseableHttpClient client, CompleteExpressionUtil completeExpressionUtil, IEnvironmentService environmentService) { public HttpClientActuator(CompleteExpressionUtil completeExpressionUtil, IEnvironmentService environmentService, HttpRequestConfig httpRequestConfig) {
this.client = client;
this.completeExpressionUtil = completeExpressionUtil; this.completeExpressionUtil = completeExpressionUtil;
this.environmentService = environmentService; this.environmentService = environmentService;
this.httpRequestConfig = httpRequestConfig;
} }
/** /**
...@@ -144,7 +163,7 @@ public class HttpClientActuator implements Actuator { ...@@ -144,7 +163,7 @@ public class HttpClientActuator implements Actuator {
} }
requestBase.setHeaders(httpRequestDetail.getHeadersArray()); requestBase.setHeaders(httpRequestDetail.getHeadersArray());
try { try {
response = client.execute(requestBase); response = httpRequestConfig.getClient().execute(requestBase);
Long endTime = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli(); Long endTime = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
return new HttpResponseDetail( return new HttpResponseDetail(
url, url,
...@@ -348,4 +367,6 @@ public class HttpClientActuator implements Actuator { ...@@ -348,4 +367,6 @@ public class HttpClientActuator implements Actuator {
} }
} }
...@@ -14,6 +14,7 @@ import org.matrix.actuators.httpclient.HttpClientActuator; ...@@ -14,6 +14,7 @@ import org.matrix.actuators.httpclient.HttpClientActuator;
import org.matrix.actuators.move.MoveActuator; import org.matrix.actuators.move.MoveActuator;
import org.matrix.actuators.move.MoveStrategy; import org.matrix.actuators.move.MoveStrategy;
import org.matrix.actuators.util.ThreadUtil; import org.matrix.actuators.util.ThreadUtil;
import org.matrix.config.HttpRequestConfig;
import org.matrix.database.entity.*; import org.matrix.database.entity.*;
import org.matrix.actuators.checkpoint.CheckPoint; import org.matrix.actuators.checkpoint.CheckPoint;
import org.matrix.actuators.checkpoint.CheckPointResult; import org.matrix.actuators.checkpoint.CheckPointResult;
...@@ -48,6 +49,9 @@ import static org.matrix.enums.ModuleType.CASE_ACTUATOR; ...@@ -48,6 +49,9 @@ import static org.matrix.enums.ModuleType.CASE_ACTUATOR;
@Component @Component
public class CaseActuator implements Actuator { public class CaseActuator implements Actuator {
@Autowired
HttpRequestConfig httpRequestConfig;
final final
IDataSourceService dataSourceService; IDataSourceService dataSourceService;
...@@ -76,7 +80,6 @@ public class CaseActuator implements Actuator { ...@@ -76,7 +80,6 @@ public class CaseActuator implements Actuator {
* 执行测试用例,这个方法对内使用,由其他执行器调用 * 执行测试用例,这个方法对内使用,由其他执行器调用
*/ */
public TestDataExecuteResult executeTestCase(TestCaseBTO testCaseBto, Long envId, Long projectId) { public TestDataExecuteResult executeTestCase(TestCaseBTO testCaseBto, Long envId, Long projectId) {
try {
LogQueueRuntime.addNewLog(this.getClass(), CASE_ACTUATOR, "开始执行用例!!"); LogQueueRuntime.addNewLog(this.getClass(), CASE_ACTUATOR, "开始执行用例!!");
LogQueueRuntime.addNewLog(this.getClass(), CASE_ACTUATOR, String.format("当前正在执行用例ID: %s 用例名: %s", testCaseBto.getTestCase().getId(), testCaseBto.getTestCase().getName())); LogQueueRuntime.addNewLog(this.getClass(), CASE_ACTUATOR, String.format("当前正在执行用例ID: %s 用例名: %s", testCaseBto.getTestCase().getId(), testCaseBto.getTestCase().getName()));
//执行前置动作 //执行前置动作
...@@ -116,9 +119,6 @@ public class CaseActuator implements Actuator { ...@@ -116,9 +119,6 @@ public class CaseActuator implements Actuator {
//将线程中正在执行的DataId清除 //将线程中正在执行的DataId清除
LogQueueRuntime.clearTestData(); LogQueueRuntime.clearTestData();
return testDataExecuteResult; return testDataExecuteResult;
} finally {
LogQueueRuntime.remove(ThreadUtil.currentThreadId());
}
} }
...@@ -128,7 +128,6 @@ public class CaseActuator implements Actuator { ...@@ -128,7 +128,6 @@ public class CaseActuator implements Actuator {
public List<TestDataExecuteResult> executeTestCases(TestCaseListDataBto testCaseBto, Long envId, Long projectId) { public List<TestDataExecuteResult> executeTestCases(TestCaseListDataBto testCaseBto, Long envId, Long projectId) {
LogQueueRuntime.addNewLog(this.getClass(), CASE_ACTUATOR, "[用例执行器] 开始执行用例!!"); LogQueueRuntime.addNewLog(this.getClass(), CASE_ACTUATOR, "[用例执行器] 开始执行用例!!");
List<TestDataExecuteResult> resultList = new ArrayList<>(); List<TestDataExecuteResult> resultList = new ArrayList<>();
try {
LogQueueRuntime.addNewLog(this.getClass(), CASE_ACTUATOR, String.format("[用例执行器] 当前正在执行用例ID: %s 用例名: %s", testCaseBto.getTestCase().getId(), testCaseBto.getTestCase().getName())); LogQueueRuntime.addNewLog(this.getClass(), CASE_ACTUATOR, String.format("[用例执行器] 当前正在执行用例ID: %s 用例名: %s", testCaseBto.getTestCase().getId(), testCaseBto.getTestCase().getName()));
//执行前置动作 //执行前置动作
LogQueueRuntime.addNewLog(this.getClass(), CASE_ACTUATOR, "[用例执行器] 开始执行前置动作!!"); LogQueueRuntime.addNewLog(this.getClass(), CASE_ACTUATOR, "[用例执行器] 开始执行前置动作!!");
...@@ -160,7 +159,7 @@ public class CaseActuator implements Actuator { ...@@ -160,7 +159,7 @@ public class CaseActuator implements Actuator {
TestDataExecuteResult testDataExecuteResult = new TestDataExecuteResult( TestDataExecuteResult testDataExecuteResult = new TestDataExecuteResult(
dataStartTime, dataStartTime,
LocalDateTime.now(), LocalDateTime.now(),
checkPointResult.getFailNum()>0?false:true, checkPointResult.getFailNum() == null || checkPointResult.getFailNum() <= 0,
testCaseBto.getTestCase().getId(), testCaseBto.getTestCase().getId(),
testData.getId(), testData.getId(),
baseTestCaseResponseDetail, baseTestCaseResponseDetail,
...@@ -187,13 +186,14 @@ public class CaseActuator implements Actuator { ...@@ -187,13 +186,14 @@ public class CaseActuator implements Actuator {
resultList.add(testDataExecuteResult); resultList.add(testDataExecuteResult);
changeExecutionHistoryStatus(ExecutionHistoryStatus.ERROR); changeExecutionHistoryStatus(ExecutionHistoryStatus.ERROR);
LogQueueRuntime.addNewLog(this.getClass(), CASE_ACTUATOR, String.format("[用例执行器] 执行数据组ID:%s 数据组名称:%s 产生错误:%s", testData.getId(), testData.getName(), e.getMessage())); LogQueueRuntime.addNewLog(this.getClass(), CASE_ACTUATOR, String.format("[用例执行器] 执行数据组ID:%s 数据组名称:%s 产生错误:%s", testData.getId(), testData.getName(), e.getMessage()));
}finally {
clearMoveData();
//将线程中正在执行的DataId清除
LogQueueRuntime.clearTestData();
//将线程中的浏览器清除掉
httpRequestConfig.clear();
} }
} }
} finally {
clearMoveData();
//将线程中正在执行的DataId清除
LogQueueRuntime.clearTestData();
}
return resultList; return resultList;
} }
...@@ -243,7 +243,7 @@ public class CaseActuator implements Actuator { ...@@ -243,7 +243,7 @@ public class CaseActuator implements Actuator {
projectId projectId
); );
} }
return null; return new CheckPointResult();
} }
private HttpResponseDetail getHttpResponseDetail( private HttpResponseDetail getHttpResponseDetail(
......
...@@ -76,12 +76,14 @@ public class CompleteExpressionUtil { ...@@ -76,12 +76,14 @@ public class CompleteExpressionUtil {
String result = expression; String result = expression;
Pattern pattern = Pattern.compile(regex); Pattern pattern = Pattern.compile(regex);
Matcher mat = pattern.matcher(result); Matcher mat = pattern.matcher(result);
StringBuffer sBuffer=new StringBuffer();
while (mat.find()) { while (mat.find()) {
String group = mat.group(); String group = mat.group();
String read = biFunction.apply(sourceContent,group); String read = biFunction.apply(sourceContent,group);
result = mat.replaceAll(read); mat.appendReplacement(sBuffer,read);
} }
return result; mat.appendTail(sBuffer);
return sBuffer.toString();
} }
private static SqlExpActuator getSqlExpActuator(){ private static SqlExpActuator getSqlExpActuator(){
......
...@@ -35,12 +35,18 @@ import java.util.concurrent.TimeUnit; ...@@ -35,12 +35,18 @@ import java.util.concurrent.TimeUnit;
@Component @Component
public class HttpRequestConfig { public class HttpRequestConfig {
/** ThreadLocal<CloseableHttpClient> threadLocal = new ThreadLocal<>();
* HttpClient的Cookie管理器,可在其他类中调用该Bean清空Cookie缓存。
* 主要针对某些网站Cookie多次使用会造成Cookie失效的问题 public CloseableHttpClient getClient(){
*/ CloseableHttpClient closeableHttpClient = threadLocal.get();
public CookieStore cookieStore(){ if (closeableHttpClient==null){
return new BasicCookieStore(); threadLocal.set(client());
}
return threadLocal.get();
}
public void clear(){
threadLocal.remove();
} }
/** /**
...@@ -89,10 +95,11 @@ public class HttpRequestConfig { ...@@ -89,10 +95,11 @@ public class HttpRequestConfig {
} }
} }
@Bean /**
CloseableHttpClient getHttpClient() { * HttpClient的Cookie管理器,可在其他类中调用该Bean清空Cookie缓存。
return client(); * 主要针对某些网站Cookie多次使用会造成Cookie失效的问题
*/
public CookieStore cookieStore(){
return new BasicCookieStore();
} }
} }
...@@ -93,7 +93,7 @@ public class TestController { ...@@ -93,7 +93,7 @@ public class TestController {
"}", hello.getName()); "}", hello.getName());
} }
@GetMapping("/sendMessage") @PostMapping("/sendMessage")
public ResponseEntity sendMessage(String tableName) { public ResponseEntity sendMessage(String tableName) {
JSONObject jsonObject = new JSONObject(); JSONObject jsonObject = new JSONObject();
jsonObject.put("message", String.format("你好: %s", tableName)); jsonObject.put("message", String.format("你好: %s", tableName));
......
package org.matrix.fs.controller; package org.matrix.fs.controller;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.InputStreamResource; import org.springframework.core.io.InputStreamResource;
import org.springframework.core.io.UrlResource; import org.springframework.core.io.UrlResource;
...@@ -21,8 +23,10 @@ import java.io.IOException; ...@@ -21,8 +23,10 @@ import java.io.IOException;
@Slf4j @Slf4j
@RestController @RestController
@RequestMapping @RequestMapping
@Api(tags = "文件系统获取测试URL")
public class FileSysController { public class FileSysController {
@ApiOperation(value = "获取页面")
@GetMapping("/report") @GetMapping("/report")
public ResponseEntity downloadAlertWeb(HttpServletRequest request, public ResponseEntity downloadAlertWeb(HttpServletRequest request,
@RequestParam String fileName) { @RequestParam String fileName) {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论