使用java代码生成部分js代码,完成接口测试

图片来源网络

一、写在前面

最近公司项目进行服务拆分,需要将单体项目拆分为多个微服务。测试组需要对所有的接口进行测试。测试接口达到400之多,这个是后话了。

服务拆分后,进行接口测试,又有哪些注意事项能?以下两点必须要关注到:

  • 1、正常参数下接口的联通性。接口返回状态码为200。并且服务端返回的状态码也是正常的,比如"code":"0000",这个状态码是根据后端接口定义的

  • 2、新服务端接口返回数据的字段要和老服务端接口的字段是一样的。比如老服务端接口返回的数据是一个json串:{“code”:“0000”, "username":"xixi"},那么新服务端接口返回的串也必须要有codeusername

今天要说的是,如何使用java代码生成部分js代码,完成新老服务端接口字段(json数据,键)一致性的检查。提高工作效率

二、字段一致性断言

  • 字段一致性思路:
    1、获取老服务端接口的返回值,查看返回的json数据包含了哪些键
    2、获取新服务端接口的返回值,将步骤1得到的键和当前获得的键比较,检查新接口是否有缺少键

  • 字段一致性断言
    现在有新老服务器接口http://old/getImagehttp://new/getImage。老服务端接口返回的json数据如下,

{
  "requestId": "47d145b1d0164ac7b9bc2e82b0ae3d3b",
  "msg": "",
  "code": "0000",
  "data": {
    "result": [
      {
        "id": 513,
        "cover": "https://img.test/album/20180404/o_1522840084933.jpg",
        "name": "高能反转的烧脑神剧",
        "videoCount": 8,
        "type": "season",
        "seasonList": null,
        "brief": "高智商烧脑悬疑英美剧,让我们的脑细胞躁动起来吧~~"
      },
      {
        "id": 419,
        "cover": "https://img.test/album/20180108/o_1515392963542.jpg",
        "name": "2017年度最佳人气惊悚类",
        "videoCount": 5,
        "type": "season_toplist",
        "seasonList": null,
        "brief": "2017年度最佳人气惊悚类,排名基于惊悚类剧集在人人视频的播放量。"
      },
      {
        "id": 413,
        "cover": "https://img.test/album/20180108/o_1515391132388.jpg",
        "name": "2017年度冷门好剧",
        "videoCount": 5,
        "type": "season_toplist",
        "seasonList": null,
        "brief": "冷门好剧,一般人我不告诉他。"
      },
      {
        "id": 421,
        "cover": "https://img.test/album/20180108/o_1515393273366.jpg",
        "name": "2017年度最佳人气奇幻类",
        "videoCount": 5,
        "type": "season_toplist",
        "seasonList": null,
        "brief": "2017年度最佳人气奇幻类,排名基于奇幻类剧集在人人视频的播放量。"
      },
      {
        "id": 415,
        "cover": "https://img.test/album/20180108/o_1515391689541.jpg",
        "name": "2017年度最佳人气剧情类",
        "videoCount": 5,
        "type": "season_toplist",
        "seasonList": null,
        "brief": "2017年度最佳人气剧情类,排名基于剧情类剧集在人人视频的播放量。"
      }
    ],
    "total": 0,
    "isEnd": false
  }
}

新老接口字段一致性,js断言如下,函数checkValue对于所有的接口是不变的,唯一改变的是数组,以及数组里面的值。如果是几个接口,返回数据量少,可以通过肉眼,完成字段的检查。如果数据量大,并且接口多,还是得用代码。

function checkValue(data, keys){
    var flag = true
    var lessKey;
    for (var i=0; i<keys.length; i++){
        if (!data.hasOwnProperty(keys[i]) ){
            flag = false;
            lessKey = keys[i]
            break;
        }
    }

    assert.deepEqual(flag, true,"缺少字段"+lessKey);
}

var bodyKey=["msg","code","data","requestId"]
checkValue(body, bodyKey)

var result=["cover","videoCount","brief","name","seasonList","id","type"]
checkValue(body.data.result[0], result)

var dataKey=["result","total","isEnd"]
checkValue(body.data, dataKey)

  • java代码生成部分js
    每个接口的键一致性检查,检查函数是不变的,变的是检查的键,我们的代码需要完成的工作就是能过将我们的json解析成下面的数据
var bodyKey=["msg","code","data","requestId"]
checkValue(body, bodyKey)

var result=["cover","videoCount","brief","name","seasonList","id","type"]
checkValue(body.data.result[0], result)

var dataKey=["result","total","isEnd"]
checkValue(body.data, dataKey)

三、java生成js代码

以下是java代码。使用时,只需要将jsonStr值,替换成你电脑上需要解析的json文件的路径值。完整源码

public class JsonCreateJs {

    public static void main(String[] args) {

        String jsonStr ="E:\\body.json";
        String jsonData = Common.readPostmanJson(jsonStr);
        
        
        
        //System.out.println("assert.equal(status, 200)\nassert.deepEqual(body.code, \"0000\")  \n"); 
        
        JSONObject jsonObject = JSONObject.parseObject(jsonData);
        Set<String> bodyKey = jsonObject.keySet();
        boolean n = true;
        String body = "var bodyKey=[\"";
        for (String key : bodyKey) {
            if (n){
                body = body + key;
                n = false;
            }else{
                body = body +"\",\""+key;
            }
        }
        System.out.println(body+"\"]\ncheckValue(body, bodyKey)\n");
        
        JSONObject dataObject = jsonObject.getJSONObject("data");
        Set<String> dataKey= dataObject.keySet();
        body = "var dataKey=[\"";
        n = true;
        for (String key : dataKey) {
            if (n){
                body = body + key;
                n = false;
            }else{
                body = body +"\",\""+key;
            }
            
           
            if (JSON.parse(dataObject.getString(key)) instanceof JSONObject){
                System.out.print("var "+key+"=[");
                PrintResult(dataObject.getJSONObject(key), key, false);
                 
            }
            else if(JSON.parse(dataObject.getString(key)) instanceof JSONArray){
                
                JSONArray dataArray = dataObject.getJSONArray(key);
                if (dataArray.size()!=0){
                    System.out.print("var "+key+"=[");
                    PrintResult( dataArray.getJSONObject(0),key, true);
                }
                
            }
            
            
        }
        System.out.println(body+"\"]\ncheckValue(body.data, dataKey)");
    }

    public static void PrintResult(JSONObject dataObject, String key, boolean isArray){
        Set<String> key1 = dataObject.keySet();
        
        
        boolean flag = true;
        for (String keyi : key1){
            if (flag){
                System.out.print("\""+keyi);
                flag = false;
            }else{
                System.out.print("\",\""+keyi);
            }
            
            
        }
        
       String str =  (isArray==true) ? "\"]\ncheckValue(body.data."+key+"[0], "+key+")\n":"\"]\ncheckValue(body.data."+key+", "+key+")\n";
       System.out.println(str);
    }
}
运行结果
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 点击查看原文 Web SDK 开发手册 SDK 概述 网易云信 SDK 为 Web 应用提供一个完善的 IM 系统...
    layjoy阅读 13,984评论 0 15
  • 在一个方法内部定义的变量都存储在栈中,当这个函数运行结束后,其对应的栈就会被回收,此时,在其方法体中定义的变量将不...
    Y了个J阅读 4,450评论 1 14
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,156评论 1 32
  • 去年有段时间得空,就把谷歌GAE的API权威指南看了一遍,收获颇丰,特别是在自己几乎独立开发了公司的云数据中心之后...
    骑单车的勋爵阅读 20,733评论 0 41
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,820评论 1 45