package com.rabbit.service.Impl;
import com.jayway.jsonpath.JsonPath;
import com.rabbit.model.TApiResult;
import com.rabbit.model.TApi;
import com.rabbit.model.po.*;
import com.rabbit.service.RequestExecutorServer;
import com.rabbit.service.TApiService;
import com.rabbit.service.TFileInfoService;
import com.rabbit.utils.BeanUtils;
import com.rabbit.utils.MyStringUtils;
import com.rabbit.utils.StringUtilHelper;
import com.rabbit.utils.apitest.ApiUtil;
import io.restassured.RestAssured;
import io.restassured.config.EncoderConfig;
import io.restassured.config.HttpClientConfig;
import io.restassured.http.Header;
import io.restassured.path.xml.XmlPath;
import io.restassured.response.Response;
import io.restassured.specification.RequestSpecification;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.io.File;
import java.net.ConnectException;
import java.net.URLDecoder;
import java.net.UnknownHostException;
import java.util.*;
import static io.restassured.config.JsonConfig.jsonConfig;
import static io.restassured.config.SSLConfig.sslConfig;
import static io.restassured.path.json.config.JsonPathConfig.NumberReturnType.BIG_DECIMAL;
@Slf4j
@Service
public class RequestExecutorImpl implements RequestExecutorServer {
@Resource
private TFileInfoService fileInfoService;
@Resource
private TApiService apiService;
@Override
public TApiResult executeHttpRequest(TApi tApi, Map<String, Object> gVars, Map<String, Object> caseVars, List<ApiParam> params) {
TApiResult tApiResult = new TApiResult();
if (params != null) {
for (ApiParam apiParam : params) {
apiParam.setValue(MyStringUtils.replaceKeyFromMap(apiParam.getValue(), gVars, caseVars));
}
}
beforeHandle(tApi, gVars, caseVars);
tApiResult.setCreateTime(new Date());
RequestSpecification requestSpecification = RestAssured.given();
trustAllHosts(requestSpecification);
applyHeaders(requestSpecification, tApi, gVars, caseVars, tApiResult, params);
applyQueryParameters(requestSpecification, tApi, gVars, caseVars, tApiResult, params);
log.info("开始请求执行接口");
tApi.setDomain(MyStringUtils.replaceKeyFromMap(tApi.getDomain(), gVars, caseVars));
tApiResult.setReqMethod(tApi.getMethod());
if (!tApi.getMethod().equalsIgnoreCase("get")) {
tApiResult.setReqBodyType(tApi.getReqBodyType());
if (tApi.getReqBodyType() == null) {
} else if (tApi.getReqBodyType().equals("form")) {
applyFormParam(requestSpecification, tApi, gVars, caseVars, tApiResult, params);
} else if (tApi.getReqBodyType().equals("raw")) {
applyRawParam(requestSpecification, tApi, gVars, caseVars, tApiResult, params);
}
}
Response response = null;
if (!tApi.getPath().startsWith("/")) {
tApi.setPath("/" + tApi.getPath());
}
String url = tApi.getDomain() + tApi.getPath();
if (url.indexOf("?") != -1) {
url = url.substring(0, url.indexOf("?"));
}
url = MyStringUtils.replaceKeyFromMap(url, gVars, caseVars);
tApiResult.setReqUrl(url);
try {
switch (tApi.getMethod().toUpperCase()) {
case "GET":
response = requestSpecification.when().get(url);
break;
case "POST":
response = requestSpecification.when().post(url);
break;
case "PATCH":
response = requestSpecification.when().patch(url);
break;
case "DELETE":
response = requestSpecification.when().delete(url);
break;
case "PUT":
response = requestSpecification.when().put(url);
break;
case "OPTIONS":
response = requestSpecification.when().options(url);
break;
case "HEAD":
response = requestSpecification.when().head(url);
break;
default:
tApiResult.setException(String.format("不支持这个请求 %s.", url));
}
} catch (Exception e) {
tApiResult.setResultType(-1);
if (e instanceof UnknownHostException) {
tApiResult.setException("请求异常,URL[" + e.getMessage() + "]无法连接");
} else if (e instanceof ConnectException) {
tApiResult.setException("请求异常,URL[" + tApi.getDomain() + "]无法连接");
} else {
tApiResult.setException("请求异常:" + e.getMessage());
e.printStackTrace();
}
log.info("请求异常:{}", e.getMessage());
long time = new Date().getTime() - tApiResult.getCreateTime().getTime();
tApiResult.setRspTime(time);
return tApiResult;
}
tApiResult.setRspStatusCode(response.getStatusCode());
tApiResult.setRspTime(response.getTime());
tApiResult.setRspBodySize(response.getBody().asByteArray().length);
List<com.rabbit.model.po.Header> listHeader = new ArrayList<>();
response.getHeaders().asList().forEach(x -> {
com.rabbit.model.po.Header header = new com.rabbit.model.po.Header();
header.setKey(x.getName());
header.setValue(x.getValue());
listHeader.add(header);
});
tApiResult.setRspHeaders(listHeader);
tApiResult.setRspBody(response.getBody().prettyPrint());
tApiResult.setRspBodyType(StringUtilHelper.checkStringFormat(tApiResult.getRspBody()));
Boolean handResult = handleAssert(tApi, caseVars, tApiResult); //断言
handleExtract(tApi, caseVars, tApiResult); //提取参数
if (handResult) {
//响应断言成功
tApiResult.setResultType(1);
} else {
//断言失败
tApiResult.setResultType(0);
}
return tApiResult;
}
private void beforeHandle(TApi tApi, Map<String, Object> gVars, Map<String, Object> caseVars) {
//前置处理器
List<Action> beforeExcs = tApi.getBeforeExcs();
if (beforeExcs != null) {
for (Action action : beforeExcs) {
apiService.runAction(action, gVars, caseVars);
}
}
}
//trust all hosts regardless if the SSL certificate is invalid
private void trustAllHosts(RequestSpecification requestSpecification) {
RestAssured.config = RestAssured.config().sslConfig(sslConfig().relaxedHTTPSValidation());
RestAssured.config = RestAssured.config().jsonConfig(jsonConfig().numberReturnType(BIG_DECIMAL));
Map<String, Object> httpClientParams = new HashMap<String, Object>();
httpClientParams.put("http.connection.timeout", 60000);
httpClientParams.put("http.socket.timeout", 60000);
httpClientParams.put("http.connection.manager.timeout", 60000);
RestAssured.config = RestAssured.config().httpClient(HttpClientConfig.httpClientConfig().addParams(httpClientParams));
// RestAssured.config = RestAssured.config().encoderConfig(EncoderConfig.encoderConfig().defaultContentCharset("UTF-8"));
RestAssured.config = RestAssured.config().encoderConfig(EncoderConfig.encoderConfig().appendDefaultContentCharsetToContentTypeIfUndefined(false));
requestSpecification.config(RestAssured.config);
}
private void applyHeaders(RequestSpecification requestSpecification, TApi tApi, Map<String, Object> gVars, Map<String, Object> caseVars, TApiResult TApiResult, List<ApiParam> params) {
List<com.rabbit.model.po.Header> headers = tApi.getReqHeader();
for (com.r
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
基于经典技术组合(Spring Boot、Spring Security、MyBatis、Jwt、Vue),目前版本已支持UI自动化和接口自动化。平台采用关键字驱动,测试人员无需任何代码基础,即可轻松完成复杂的自动化测试工作。 软件架构 前端技术栈:vue+vuex+elementui+axios 后端技术栈:springboot+mybatis+druid+mysql+security+jwt+quartz+hessian+selenium+appium token可以支持数据库和redis缓存两种实现 完善的权限管理,细化到按钮和接口级别 前后端分离,通过token进行数据交互,可独立部署 动态菜单,通过菜单管理统一管理访问路由 集成动态定时任务,支持多线程,方便配置 自动化采用服务端客户端分离:服务端维护用例,客户端执行用例 您所看到的只是自动化平台控制端,如果需要执行自动化脚本,还需要客户端代码部署到执行机,后续会更新用户手册
资源推荐
资源详情
资源评论
收起资源包目录
基于Spring Boot+Vue实现的自动化测试平台源码+数据库,支持UI自动化和接口自动化 (451个子文件)
chunk-elementUI.ded27da0.css 228KB
chunk-f98915dc.9ba99769.css 37KB
chunk-libs.39229353.css 22KB
app.ac3a8bf6.css 18KB
chunk-d91d359a.c5731058.css 12KB
chunk-e0c8dda4.f38c1fb9.css 896B
chunk-7a9d5077.d71acd00.css 802B
chunk-e8bb87ac.55938bd6.css 406B
admin-server.log.error 21KB
web-report-zh.ftl 21KB
web-report-en.ftl 20KB
api-test.ftl 4KB
ui-test-new.ftl 4KB
ui-test.ftl 4KB
task-body.ftl 3KB
ui.ftl 43B
test.html 17KB
index.html 4KB
ui-test - 副本.html 4KB
favicon1.ico 162KB
favicon.ico 55KB
favicon.ico 55KB
RequestExecutorImpl.java 25KB
Convert.java 24KB
RequestExecutor.java 17KB
TJmeterScriptServiceImpl.java 14KB
JmeterController.java 12KB
TTestcaseUiNewServiceImpl.java 9KB
FileUtils.java 9KB
ExcApiServiceImpl.java 8KB
TApiServiceImpl.java 8KB
MyStringUtils.java 8KB
TTestcaseApiServiceImpl.java 7KB
DbUtil.java 7KB
JobServiceImpl.java 7KB
ExcUiServiceImpl.java 6KB
IdWorker.java 6KB
ApiController.java 6KB
ScheduleUtils.java 6KB
ZipUtils.java 6KB
UserController.java 6KB
TTestsuiteUiServiceImpl.java 5KB
TFileInfoServiceImpl.java 5KB
TTestStepUiNewLogServiceImpl.java 5KB
SysDictController.java 5KB
ApiTestCaseController.java 5KB
ApiUtil.java 5KB
UiPlanLogNewController.java 5KB
JobController.java 5KB
TokenServiceDbImpl.java 5KB
TStepApiServiceImpl.java 5KB
ClientServiceImpl.java 5KB
SendMailSeviceImpl.java 4KB
PageElementServiceImpl.java 4KB
TestSuiteApiController.java 4KB
TestSuiteUiController.java 4KB
SecurityHandlerConfig.java 4KB
PageElementController.java 4KB
TokenServiceJWTImpl.java 4KB
ProjectPageController.java 4KB
FileUploadUtils.java 4KB
ProjectPageServiceImpl.java 4KB
ZipTest.java 4KB
DeviceController.java 4KB
GlobalParamServiceImpl.java 4KB
XmlUtils.java 4KB
DateUtils.java 4KB
ScheduleJob.java 4KB
GlobalParameController.java 4KB
UserServiceImpl.java 4KB
SecurityConfig.java 4KB
AesEncryptUtil.java 4KB
LoginUser.java 4KB
ApiTestReportController.java 3KB
PermissionController.java 3KB
BeanUtils.java 3KB
InterfaceController.java 3KB
DatabaseController.java 3KB
DeviceServiceImpl.java 3KB
FileControl.java 3KB
ApiEnvController.java 3KB
serviceNewExporter.java 3KB
FlagController.java 3KB
TPlanSuiteApiServiceImpl.java 3KB
UiTestCaseNewController.java 3KB
NetUtil.java 3KB
ClientController.java 3KB
TTestDatabeseServiceImpl.java 3KB
TStepUiNewServiceImpl.java 3KB
UserDetailsServiceImpl.java 3KB
TokenFilter.java 3KB
RemoveDruidAdConfig.java 3KB
SpringUtils.java 3KB
EnvController.java 3KB
ProjectController.java 3KB
TGlobalParam.java 3KB
TTestsuiteApiServiceImpl.java 3KB
TTestPlanUiNewLogServiceImpl.java 3KB
NetTest.java 2KB
RoleController.java 2KB
共 451 条
- 1
- 2
- 3
- 4
- 5
资源评论
云哲-吉吉2021
- 粉丝: 3214
- 资源: 1130
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功