一跃巡、寫(xiě)在前面
最近公司項(xiàng)目進(jìn)行服務(wù)拆分,需要將單體項(xiàng)目拆分為多個(gè)微服務(wù)牧愁。測(cè)試組需要對(duì)所有的接口進(jìn)行測(cè)試素邪。測(cè)試接口達(dá)到400之多,這個(gè)是后話了猪半。
服務(wù)拆分后兔朦,進(jìn)行接口測(cè)試,又有哪些注意事項(xiàng)能磨确?以下兩點(diǎn)必須要關(guān)注到:
1沽甥、正常參數(shù)下接口的聯(lián)通性。接口返回狀態(tài)碼為200乏奥。并且服務(wù)端返回的狀態(tài)碼也是正常的摆舟,比如"code":"0000",這個(gè)狀態(tài)碼是根據(jù)后端接口定義的
2邓了、
新服務(wù)端接口
返回?cái)?shù)據(jù)的字段要和老服務(wù)端接口
的字段是一樣的恨诱。比如老服務(wù)端接口
返回的數(shù)據(jù)是一個(gè)json串:{“code”:“0000”, "username":"xixi"}
,那么新服務(wù)端接口
返回的串也必須要有code
和username
今天要說(shuō)的是骗炉,如何使用java代碼生成部分js代碼照宝,完成新老服務(wù)端接口字段(json數(shù)據(jù),鍵)一致性的檢查句葵。提高工作效率
二厕鹃、字段一致性斷言
字段一致性思路:
1、獲取老服務(wù)端接口的返回值乍丈,查看返回的json數(shù)據(jù)包含了哪些鍵
2熊响、獲取新服務(wù)端接口的返回值,將步驟1得到的鍵和當(dāng)前獲得的鍵比較诗赌,檢查新接口是否有缺少鍵字段一致性斷言
現(xiàn)在有新老服務(wù)器接口http://old/getImage和http://new/getImage。老服務(wù)端接口返回的json數(shù)據(jù)如下秸弛,
{
"requestId": "47d145b1d0164ac7b9bc2e82b0ae3d3b",
"msg": "",
"code": "0000",
"data": {
"result": [
{
"id": 513,
"cover": "https://img.test/album/20180404/o_1522840084933.jpg",
"name": "高能反轉(zhuǎn)的燒腦神劇",
"videoCount": 8,
"type": "season",
"seasonList": null,
"brief": "高智商燒腦懸疑英美劇铭若,讓我們的腦細(xì)胞躁動(dòng)起來(lái)吧~~"
},
{
"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年度冷門(mén)好劇",
"videoCount": 5,
"type": "season_toplist",
"seasonList": null,
"brief": "冷門(mén)好劇叼屠,一般人我不告訴他瞳腌。"
},
{
"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斷言如下挑宠,函數(shù)checkValue對(duì)于所有的接口是不變的,唯一改變的是數(shù)組颓影,以及數(shù)組里面的值各淀。如果是幾個(gè)接口,返回?cái)?shù)據(jù)量少诡挂,可以通過(guò)肉眼碎浇,完成字段的檢查。如果數(shù)據(jù)量大璃俗,并且接口多奴璃,還是得用代碼。
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
每個(gè)接口的鍵一致性檢查城豁,檢查函數(shù)是不變的苟穆,變的是檢查的鍵,我們的代碼需要完成的工作就是能過(guò)將我們的json解析成下面的數(shù)據(jù)
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代碼鞭缭。使用時(shí),只需要將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);
}
}