背景
因为目前推出去使用的API自动化测试框架,报告部分采用的是Allure,RPC自动化测试模块并非采用泛化方式调用,这样就意味着没有统一的调用方法,那么我们希望最后Allure报告中能自动把 RPC调用的请求参数和RPC返回的数据自动的添加到报告中。
Filter 调用拦截扩展
通过Dubbo 的帮助文档,可以看到Dubbo 提供了消费者和生产者的调用过程中的拦截器,也就是说每次 消费者发起请求和生产者返回请求都会经过拦截器。那这不可以尝试在拦截器中获取到请求的参数和返回的数据,并把他们记录到报告中,这样就不需要每个RPC请求发起时都去添加报告的步骤。
实现
有了思路就具体看下实现代码:
package com.luban.common.utils;import com.alibaba.fastjson.JSONArray;import com.alibaba.fastjson.JSONObject;import com.luban.common.report.TestStep;import lombok.extern.slf4j.Slf4j;import org.apache.dubbo.common.constants.CommonConstants;import org.apache.dubbo.common.extension.Activate;import org.apache.dubbo.rpc.*;import java.util.Map;@Activate(group = {CommonConstants.CONSUMER})@Slf4jpublic class DubboReportFilter implements Filter {@Overridepublic Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {String name = invoker.getInterface().getName();Object[] args = invocation.getArguments();String method = invocation.getMethodName();String prefix = "调用服务:" + name + "." + method;Result result = invoker.invoke(invocation);Map<String, String> map = invocation.getAttachments();String version = "/version: " + map.get("version");String group = "/group: " + map.get("group");String request = TestStep.rpcRequestStep(prefix + version + group, JSONArray.toJSONString(args));String response = TestStep.respondStep(JSONObject.toJSONString(result.getValue()));log.info("RPC请求参数: {}", request);log.info("PRC请求结果: {}", response);return result;}}
我们去实现Dubbo Filter 接口,重写 invoke 方法, 我们去实现 Filter 接口,重写 invoke 方法, invocation.getArguments() 用于获取入参,并返回一个数组。 Result result = invoker.invoke(invocation) 获取到RPC的返回。 拿到入参和返回Json后,调用写报告方法,如下案例中的 rpcRequestStep() 等。
@Attachment("请求报文")
public static String rpcRequestStep(String url, String body) {
String str = body;
try {
//格式化json串
JSONArray jsonObject = JSONArray.parseArray(str);
str = JSONObject.toJSONString(jsonObject, true);
} catch (Exception e) {
log.error("请求报文非json格式,解析错误");
}
//报告展现请求报文
return url + "\n" + str;
}
写完报告插入后,我们需要在resourse 先新建 META-INF/dubbo/org.apache.dubbo.rpc.Filter 文件,并添加如下
# xxx=包名.类名

