代码改变世界

【接口自动化框架实践】5、优化用例执行打印台为空白的问题

2019-11-21 20:51  昆山玉乐  阅读(213)  评论(0编辑  收藏  举报
为解决这个问题我们先来了解一下Filter
Filter是Spring框架中的一个过滤器,然而过滤器顾名思义就是对其中请求的信息进行处理,然后再传送。Filter不像Servlet,它不能产生一个请求或者响应,它只能修改对某一资源的请求,或修改从某一的响应。
    定义:Filter是实现了javax.servlet.Filter接口的服务端程序,主要用途:是过滤字符编码、做一些业务逻辑判断,主要用于对用户请求进行预处理。
工作原理:1、主要在web.xml文件中配置好要拦截的客户端请求,它都会帮你拦截到请求,此时你就可以对请求和请求和响应做一些相关操作(统一设置编码,简化操作;同时还可进行逻辑判断,如用户是否已经登陆、有没有权限访问该页面等等工作)。2、它启动是随WEB应用的启动而启动,只需要初始化一次,以后都可以进行拦截,只有当web应用关闭的时候才停止。它与Servlet区别:它不能直接向用户生成响应。完整的流程为:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。
1、Filter有如下几个用处。
   在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest。
   根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据。
   在HttpServletResponse到达客户端之前,拦截HttpServletResponse。
   根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。
2、Filter有如下几个种类。   
   用户授权的Filter:Filter负责检查用户请求,根据请求过滤用户非法请求。
   日志Filter:详细记录某些特殊的用户请求。
   负责解码的Filter:包括对非标准编码的请求解码。
   能改变XML内容的XSLTFilter等。
   Filter可负责拦截多个请求或响应;一个请求或响应也可被多个请求拦截。
简单的理解就是filter拦截请求,对信息进行处理,然后提交给服务器处理,然后对服务器的响应还可以再处理,类似一个信息处理中间商,理解为房屋中介。

 

那么基于filter的特性,我们就可以通过filter获取我们所测试接口的各种信息,比如接口api和方法名、接口入参、接口出参。
 
废话不多说,我们来实现它吧。
 
1、首先filter接口实现类
package autoTest.qa.filter;
 
import autoTest.qa.utils.JsonUtils;
import com.alibaba.dubbo.rpc.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
public class DubboInvokingFilter implements Filter {
 
private static final Logger logger = LoggerFactory.getLogger("DubboInvokingFilter");
 
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
//获取接口的api和方法名
String fullMethodName = invoker.getInterface().getCanonicalName() + "#" + invocation.getMethodName();
logger.info("**********> dubbo调用: {}", fullMethodName);
int i = 1;
String inParam = "";
for (Object arg: invocation.getArguments()) {
logger.info("参数{}: {}", i, JsonUtils.toJsonString(arg));
 
//获取接口入参
inParam = JsonUtils.toJsonString(arg);
 
}
//获取接口出参
Result result = invoker.invoke(invocation);
logger.info("结果: {}", JsonUtils.toJsonString(result.getValue()));
String outParam = JsonUtils.toJsonString(result.getValue());
 
return result;
}
}
 
 
这里有用到一个json字符串转换的类,需手动添加
package autoTest.qa.utils;
/**
* json字符串, Map(JSONObject), pojo对象的互相转换,和json-path形式的属性获取方法
*/
 
import com.alibaba.fastjson.*;
import java.util.List;
import java.util.Map;
 
public class JsonUtils {
public static String toJsonString(Object object) {
return JSON.toJSONString(object);
}
 
public static String toJsonString(Map<String, Object> map) {
return JSON.toJSONString(map);
}
 
public static JSONObject toJsonObject(String jsonString) {
return JSON.parseObject(jsonString);
}
 
public static JSONArray toJsonArray(String jsonString) {
return JSON.parseArray(jsonString);
}
 
public static JSONObject toJsonObject(Object object) {
return (JSONObject) JSON.toJSON(object);
}
 
public static <T> T toObject(Map<String, Object> map, Class<T> clazz) {
return JSON.parseObject(toJsonString(map), clazz);
}
 
public static JSONArray toJsonArray(List<Object> object) {
return (JSONArray) JSON.toJSON(object);
}
 
public static <T> T toObject(String jsonString, Class<T> clazz) {
return JSON.parseObject(jsonString, clazz);
}
 
public static Object readPath(String jsonString, String jsonPath) {
return JSONPath.read(jsonString, jsonPath);
}
}
 
 
2、src/main/java/resources中配置filter,并指向1中的filter实现类
src/main/java/resources下新建directory:META-INF
在META-INF下建文件夹dubbo
在dubbo下建file,命名为com.alibaba.dubbo.rpc.Filter
内容为:
dubboInvokingFilter=autoTest.qa.filter.DubboInvokingFilter
 
3、dubbo-application-name.xml中开启filter
<dubbo:consumer check="false" timeout="10000" />
加上filter="dubboInvokingFilter",其中dubboInvokingFilter为2步中的com.alibaba.dubbo.rpc.Filter文件的变量名
 
<?xml version="1.0" encoding="UTF-8"?>
<!-- - Copyright 1999-2011 Alibaba Group. - - Licensed under the Apache License,
Version 2.0 (the "License"); - you may not use this file except in compliance
with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0
- - Unless required by applicable law or agreed to in writing, software -
distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the
License for the specific language governing permissions and - limitations
under the License. -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
 
<dubbo:application name="auto-test"/>
<dubbo:consumer check="false" timeout="10000" filter="dubboInvokingFilter"/>
 
</beans>
 
 
然后运行测试类
打印台就有接口api#方法名、入参、出参
完美实现