一、写在前面
最近公司项目进行服务拆分,需要将单体项目拆分为多个微服务。测试组需要对所有的接口进行测试。测试接口达到400之多,这个是后话了。
服务拆分后,进行接口测试,又有哪些注意事项能?以下两点必须要关注到:
1、正常参数下接口的联通性。接口返回状态码为200。并且服务端返回的状态码也是正常的,比如"code":"0000",这个状态码是根据后端接口定义的
2、
新服务端接口
返回数据的字段要和老服务端接口
的字段是一样的。比如老服务端接口
返回的数据是一个json串:{“code”:“0000”, "username":"xixi"}
,那么新服务端接口
返回的串也必须要有code
和username
今天要说的是,如何使用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);
}
}