列表展示大概如下:
前端配置页,则是对入参进行二次封装。
返回结果的处理部分,与http请求基本一致
bean文件
代码语言:javascript复制@Data
public class DubboCase {
/** 主键id */
private int id;
/** 创建人 */
private String createrName;
/** 创建人code */
private String createrCode;
/** 创建时间 */
@JsonFormat(locale="zh", timezone="GMT 8", pattern="yyyy-MM-dd")
private Date createDate;
/** 更新人 */
private String updaterName;
/** 更新人 */
private String updaterCode;
/** 更新时间 */
@JsonFormat(locale="zh", timezone="GMT 8", pattern="yyyy-MM-dd")
private Date updateDate;
/** 所属系统名称 */
private String systemName;
/** 前端填写的apiName */
private String apiName;
/** 传给dubbo服务器的接口名 */
private String apiNameValue;
/** zookeeper地址 */
private String zkAddress;
/** 服务名 */
private String serviceName;
/** 分组 */
private String groupName;
/** zookeeper版本 */
private String version;
/** 入参 */
private String params;
/** 函数名 */
private String functionName;
/** 类名 */
private String className;
/** 备注 */
private String description;
/** 需要保存的变量 */
private String variableListValue;
private List<VariableSave> variableList;
/** 校验方式 */
private String expectedListValue;
private List<Expected> expectedList;
/** 最后一次请求状态 */
private Boolean status;
/** 响应结果 */
private String result;
}
service层
与http请求的处理基本一致,都是逐条case遍历进行处理,区别在于String result = ApiTestUtils.doDubboRequest(dubboCase);
代码语言:javascript复制@Override
public ResponseVo excuteRequest(Integer[] ids) {
ResponseVo responseVo = new ResponseVo();
// 全局变量赋值
List<Variable> variableList = apiTestConfigMapper.selectGlobalVariable();
for (Variable variable:variableList){
ApiTestConfig.globalVariableMap.put(variable.getVariableName(), variable.getVariableValue());
}
// 获取当前选中的所有case
List<DubboCase> caseList = dubboCaseMapper.selectDubboCaseListByIds(ids);
// 遍历caseList,进行http请求
for (DubboCase dubboCase :caseList){
String result = ApiTestUtils.doDubboRequest(dubboCase);
// 保存变量
ApiTestUtils.saveVariable(result, dubboCase.getVariableListValue(), ApiTestConfig.GLOBAL_COLLECTION_ID);
// 判断是否通过了所有校验条件
if (ApiTestUtils.verifyResult(result, dubboCase.getExpectedListValue(), ApiTestConfig.GLOBAL_COLLECTION_ID)){
dubboCase.setStatus(Boolean.TRUE);
} else {
dubboCase.setStatus(Boolean.FALSE);
}
// 给testCase的执行状态进行赋值
dubboCase.setResult(result);
// 更新数据库保存的信息
setJsonValue(dubboCase);
dubboCaseMapper.updateDubboCase(dubboCase);
// 将执行后的结果返回给前端
responseVo.setIsSuccess(Boolean.TRUE);
responseVo.setResult(dubboCase);
}
return responseVo;
}
ApiTestUtils
代码语言:javascript复制public static String doDubboRequest(DubboCase dubboCase){
ApplicationConfig application = new ApplicationConfig();
application.setName(getVariable(dubboCase.getApiNameValue()));
// 连接注册中心配置
RegistryConfig registry = new RegistryConfig();
registry.setAddress(getVariable(dubboCase.getZkAddress()));
ReferenceConfig<GenericService> reference = new ReferenceConfig<>();
reference.setApplication(application);
reference.setRegistry(registry);
reference.setInterface(getVariable(dubboCase.getServiceName()));
// 声明为泛化接口
reference.setGeneric(true);
reference.setGroup(getVariable(dubboCase.getGroupName()));
reference.setVersion(getVariable(dubboCase.getVersion()));
try {
ReferenceConfigCache cache = ReferenceConfigCache.getCache();
GenericService genericService = cache.get(reference);
HashMap<String, Object> maps = EntityUtil.jsonToMap(getVariable(dubboCase.getParams()));
// 基本类型以及Date,List,Map等不需要转换,直接调用
Object result = genericService.$invoke(getVariable(dubboCase.getFunctionName()),
new String[]{getVariable(dubboCase.getClassName())},
new Object[]{maps});
return JSON.toJSONString(result);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
目前Dubbo请求只支持调试执行,最近考虑在场景执行里,支持http与dubbo的混合执行。emm,如果场景支持多类型接口了,可能顺便会把sql执行,显示等待,函数助手等功能都加进去。这样,预计开源时间会推迟到3月以后。
有疑问的小伙伴欢迎在文章下方留言,我会根据问题不断优化文章内容!