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

图片来源网络

一、写在前面

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

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

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

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

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

二、字段一致性断言

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

  • 字段一致性断言
    现在有新老服务器接口http://old/getImage和http://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
  • 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 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 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 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);
    }
}
运行结果

你可能感兴趣的:(使用java代码生成部分js代码,完成接口测试)