背景

因为目前推出去使用的API自动化测试框架,报告部分采用的是Allure,RPC自动化测试模块并非采用泛化方式调用,这样就意味着没有统一的调用方法,那么我们希望最后Allure报告中能自动把 RPC调用的请求参数和RPC返回的数据自动的添加到报告中。

Filter 调用拦截扩展

通过Dubbo 的帮助文档,可以看到Dubbo 提供了消费者和生产者的调用过程中的拦截器,也就是说每次 消费者发起请求和生产者返回请求都会经过拦截器。那这不可以尝试在拦截器中获取到请求的参数和返回的数据,并把他们记录到报告中,这样就不需要每个RPC请求发起时都去添加报告的步骤。

实现

有了思路就具体看下实现代码:

  1. package com.luban.common.utils;
  2. import com.alibaba.fastjson.JSONArray;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.luban.common.report.TestStep;
  5. import lombok.extern.slf4j.Slf4j;
  6. import org.apache.dubbo.common.constants.CommonConstants;
  7. import org.apache.dubbo.common.extension.Activate;
  8. import org.apache.dubbo.rpc.*;
  9. import java.util.Map;
  10. @Activate(group = {CommonConstants.CONSUMER})
  11. @Slf4j
  12. public class DubboReportFilter implements Filter {
  13. @Override
  14. public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
  15. String name = invoker.getInterface().getName();
  16. Object[] args = invocation.getArguments();
  17. String method = invocation.getMethodName();
  18. String prefix = "调用服务:" + name + "." + method;
  19. Result result = invoker.invoke(invocation);
  20. Map<String, String> map = invocation.getAttachments();
  21. String version = "/version: " + map.get("version");
  22. String group = "/group: " + map.get("group");
  23. String request = TestStep.rpcRequestStep(prefix + version + group, JSONArray.toJSONString(args));
  24. String response = TestStep.respondStep(JSONObject.toJSONString(result.getValue()));
  25. log.info("RPC请求参数: {}", request);
  26. log.info("PRC请求结果: {}", response);
  27. return result;
  28. }
  29. }

我们去实现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=包名.类名

image.png

官方文档

https://dubbo.apache.org/zh/docs/v2.7/dev/impls/filter/