接口联调及测试效率提升实践

东方盛慧科技大约 3 分钟心法秘籍经验

接口联调及测试效率提升实践

接口测试痛点(开发新东方四六级所遇到的)

  • 初期开发阶段后台前端交流扯皮
  • 只有接口文档,没有测试数据或测试数据不全 受开发人员严谨与否等因素,文档中字段与代码中字段或者结构是有小区别的,导致你封装接口数据战战兢兢(许多时候为避免返工,直接进入开发停滞状态或者只封装部分重要接口)
  • 后台接口频繁挂掉 开发初期极其常见且频繁,让你不停的联系接口开发人员、导致工作打断(如果开发人员临时不在或有事,开发陷入停滞)
  • 服务只在内网 没有离线数据 因网络原因导致前端开发工作停滞(或者另一种场景,产品经理等其它相关项目人员想在家或者非上班状态离线测试产品及跟踪其进度)
  • 彻底的无底线的 沦为后台人员,产品经理,测试人员的小白鼠 现在服务是不是挂了?接口通不通?你参数传的什么?等会我打个断点,你调用一下?返回数据是什么?有没有问题,导致你不停的点击、频繁的打包、启动app,只为了回答他们一个简单的问题,配合他们一个简单的操作。让其他同事肆意的打断你的工作

解决实践

一、思路描述
  1. 接口未开发阶段:采用rapopen in new window,进行接口地址的配置,参数的封装
  2. 接口部署阶段:
  • 离线数据解决:采用fiddleropen in new window代理抓包,并导出数据,配置到assets目录,拦截http请求(如果是https,需要设置证书并导出到手机),返回本地相应接口的离线数据
  • 接口测试需求:对每个接口进行单元测试封装,如果fiddler有记录的话也可以直接点击发送请求
二、实际操作
  1. 安装fiddler 设置代理,为了避免无用数据,设置filtters,一般把服务器域名配置上就可以了

  2. 手机或者电脑上设置代理到 代理服务器

  3. 写单元测试 封装接口(此处忽略)

  4. 导出fiddler里面所有数据,并放置到assets目录,如下图所示 Paste_Image.png

  5. 写okhttp拦截器,读取本地离线数据:

public class LocalJsonInterceptor implements Interceptor{
    public static final int SECOND = 1000;
    /**
     * 设置网络延时模拟 默认2秒
     */
    public static long mockNetDelay = 2;
    @Override
    public Response intercept(Chain chain) throws IOException {
        String responseString = createResponseBody(chain);

        Response response = new Response.Builder()
                .code(200)
                .message(responseString)
                .request(chain.request())
                .protocol(Protocol.HTTP_1_0)
                .body(ResponseBody.create(MediaType.parse("application/json"), responseString.getBytes()))
                .addHeader("content-type", "application/json")
                .build();
        return response;
    }

    /**
     * 读文件获取json字符串,生成ResponseBody
     *
     * @param chain
     * @return
     */
    private String createResponseBody(Chain chain) {

        HttpUrl uri = chain.request().url();
        String path = uri.url().getPath();
        String host = uri.host();
        try{

            if(mockNetDelay>0){
                Thread.sleep(mockNetDelay*SECOND);
            }
            return getresponseString(host,path);
        }catch (Exception e){
            ResponseBean bean = new ResponseBean();
            bean.setCode(-123);
            bean.setMessage("呵呵---->>读取本地json数据发生线程异常");
            Gson gson = new Gson();
            return gson.toJson(bean);
        }
    }

    public String getresponseString(String host,String path){
        try {
            String subPath = path.substring(0,path.lastIndexOf("/"));
            String method = path.substring(path.lastIndexOf("/")+1,path.length());
            String [] methodJson = App.getInstance().getAssets().list(host+subPath);
            Random random=new Random();
            int index = 0;
            // 随机50次 能不能找到 看命 此处可以随机同一接口不同场景下的返回数据
            int i;
            for(i= 0 ;i<50;i++){
                index=random.nextInt(methodJson.length);
                int findIndex = methodJson[index].indexOf("[");
                if(findIndex>=0){
                    if(method.equals(methodJson[index].substring(0,findIndex))){
                        break;
                    }
                }else if(method.equals(methodJson[index])){
                    break;
                }
            }
            if(i == 50){
                ResponseBean bean = new ResponseBean();
                bean.setCode(-122);
                bean.setMessage("呵呵---->>本地json数据未找到");
                Gson gson = new Gson();
                return gson.toJson(bean);
            }

            InputStream is = App.getInstance().getAssets().open(host+subPath+"/"+methodJson[index]);
            int size = is.available();

            byte[] buffer = new byte[size];
            is.read(buffer);
            is.close();
            String text = new String(buffer, "GB2312");
            return text;

        } catch (Exception e) {
            ResponseBean bean = new ResponseBean();
            bean.setCode(-121);
            bean.setMessage("local---->>"+e.toString());
            Gson gson = new Gson();
            return gson.toJson(bean);
        }
    }
}
上次编辑于:
贡献者: 雷勋