背景
因为目前推出去使用的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})
@Slf4j
public class DubboReportFilter implements Filter {
@Override
public 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=包名.类名