个人网站免费空间申请,遵义今天查出新冠,建立网站 英语怎么说,软件制作助手这是之前搞的接口自动化方案#xff0c;已经在业务测试中实现了使用postman编写接口脚本#xff0c;通过GitHubJenkinsemail html report实现了接口自动化#xff0c;现在分块整理一下。
postman脚本编写
1、创建集合 和 目录#xff1a;
一条业务线下的接口可以放到一个…这是之前搞的接口自动化方案已经在业务测试中实现了使用postman编写接口脚本通过GitHubJenkinsemail html report实现了接口自动化现在分块整理一下。
postman脚本编写
1、创建集合 和 目录
一条业务线下的接口可以放到一个集合里例如xxxOneAPI按照接口的业务分类创建文件夹例如user、dev、event、home、settings等一个接口的不同场景或者用例可以创建子文件夹这样就形成了postman接口用例的层级目录 2、请求URL
指定请求方式后就可以编辑请求的url了url的格式一般为
https://{{host}}/v1/user/register?uuid{{$guid}}t{{$timestamp}}
1因为在测试过程中会有不同的环境例如测试环境、准生产环境、生产环境等或者不同的大区例如中国区、北美区、欧洲区等这样把域名作为一个变量例如host使用双{}来引用
2query部分包含uuid和时间戳uuid是一个请求的唯一标识以及该接口在处理过程中请求其他相关的接口都会是相同的uuid查日志时会用到它时间戳是发生请求的时间。postman提供了生成uuid和时间戳的方法引用方式为{{$guid}}和{{$timestamp}}
3跟URL设置相关的是Params例如 3、编辑Headers
根据接口文档添加指定的header例如 如果多个接口使用的header是相同的可以使用Presets-Manage Presets添加公共header 这样在编辑后面的接口脚本时就可以直接选择已经编辑好的公共接口了。
注意header中一定要指定Content-Type例如application/x-www-form-urlencoded
4、编辑Body
1指定传输格式例如x-www-form-urlencoded
2设置环境变量并通过{{}}引用
5、编写Test
1添加断言断言有不用的方式例如
//断言状态code是200
pm.test(status code 是200,function(){ pm.response.to.have.status(200);
});
//断言整个返回的json串适用于当返回的json内容较少时
pm.test(Json串返回502 用户已存在, function () { pm.response.to.have.body({errno:502,errmsg:用户已存在,data:{countryAbbr:CN,countryCode:86}});
});
//断言json串中的Email是登录的Email
pm.test(json串中返回的Email是登录的Email, function () { var jsonData pm.response.json(); pm.expect(jsonData.data.email).to.eql(pm.environment.get(username));
});
//断言返回的Json串中包含字段email、sid_、xxxxUid_、 xxxxUsername_、uid_字段
pm.test(Json串中返回的字段包含email、sid_、xxxxUid_、 xxxxUsername_、uid_, function () { pm.expect(pm.response.text()).to.include(email); pm.expect(pm.response.text()).to.include(sid_); pm.expect(pm.response.text()).to.include(tuyaUid_); pm.expect(pm.response.text()).to.include(tuyaUsername_); pm.expect(pm.response.text()).to.include(uid_);
});
pm.test(上传成功已生成url, function () { pm.expect(pm.response.text()).to.include(url, https://d4fp4ynbqtcz4d.cloudfront.net/xxxxx/feedback);
});
2添加postman控制台的日志
console.log(注册的email字段是 pm.environment.get(unregisteredEmail));
3提取返回值 //提取uid_、sid_、xxxxUid_、xxxxUsername_ pm.environment.set(uid_, jsonData.data.uid_); pm.environment.set(sid_, jsonData.data.sid_); pm.environment.set(xxxxUid_, jsonData.data.xxxxUid_); pm.environment.set(xxxxUsername_, jsonData.data.xxxxUsername_);
});
4添加 if...else if...判断用于场景兼容
if(pm.response.to.have.body({errno:510,errmsg:新密码与原密码一样,data:{}})){ //断言 pm.test(Json返回510 新密码与原密码一样, function () { pm.response.to.have.body({errno:510,errmsg:新密码与原密码一样,data:{}});
})
}else if(pm.response.to.have.body({errno:112,errmsg:重复操作过于频繁请休息,data:{}})){ //断言 pm.test(Json返回112 重复操作过于频繁请休息, function () { pm.response.to.have.body({errno:112,errmsg:重复操作过于频繁请休息,data:{}});
})
}
5添加逻辑_1
var resData JSON.parse(responseBody);
tests[判断 errorno 是0] resData.errno 0
var xxxxxflag 0 //有mm设备标志
var listEnd resData.data.list.length //设备列表长度即设备数量
if(listEnd 0){ pm.environment.set(devSn, 1000); //该用户未绑定任何设备 console.log(该用户未绑定任何设备,devSn设置为1000)
}
else{ for(var i 0;ilistEnd;i){ //遍历设备列表role0的设备可以编辑设备名称role1的设备设置按钮置灰 if(resData.data.list[i].pid xxxxx resData.data.list[i].devType 1 resData.data.list[i].role 0){ xxxxxflag 1; //有mm设备并且role0标识设置为1 pm.environment.set(devSn, resData.data.list[i].sn); //获取mm产品的设备序列号作为修改设备名称接口的入参 pm.environment.set(devName, resData.data.list[i].name); //获取mm产品的设备名字作为修改设备名称接口的入参 tests[设备的pid是xxxxx] resData.data.list[i].pid xxxxx //有mm设备再去断言该值对于mm设备固定 tests[设备的devType是1] resData.data.list[i].devType 1 //该值对于mm设备固定 tests[设备的role是0] resData.data.list[i].role 0 //自由设备 break; } } if(xxxxxflag 0){ pm.environment.set(devSn, 2000); //该用户没有绑定mm设备的时候为该值修改设备名称是用作判断条件 console.log(该用户没有绑定mm设备或者没有自主设备不能修改设备名称,devSn设置为2000) }
}
console.log(设备的sn_是 pm.environment.get(devSn));
6添加逻辑_2
//三种事件基本类型RD提供
//TYPE_MM_EVENT_STAY event_stay // 【事件】DL250
//TYPE_MM_EVENT_PUSH event_push // 【事件】按mm
//TYPE_MM_EVENT_DAS event_das // 【事件】QQ
pm.test(校验返回的列表数据如下, function () { var jsonData pm.response.json(); if(jsonData.data.list.length 0){ //没有事件返回的情况 tests[没有该时间段的das事件事件列表返回为空] jsonData.errmsg 成功; }else{ //有事件的情况 var rightFlagBase 0; var rightFlagType 0; for(var i 0;ijsonData.data.list.length;i){ //有事件情况每个事件都应该符合要求pid是xxxxx、devTyep是1、sn是指定的设备 if(jsonData.data.list[i].pidxxxxxjsonData.data.list[i].devType1jsonData.data.list[i].snpm.environment.get(devSn)){ rightFlagBase 1; for(var j0;jjsonData.data.list[i].uniformType.length;j){ if([das,person,emergency].includes(jsonData.data.list[i].uniformType[j])jsonData.data.list[i].eventTypeevent_das){ //基本类型也要正确如业务上有调整变化此处。QQ的eventType是event_das rightFlagType 1; continue }else{ rightFlagType 0; break; } } if(rightFlagType 1){ continue; }else{ tests[第(i1)条数据不符合要求统一类型错误jsonData.data.list[i].uniformType] jsonData.data.errmsg 失败; console.log(统一类型是jsonData.data.list[i].uniformType不在指定列表当中); break; } }else{ rightFlagBase 0; tests[第(i1)条数据不符合要求断言失败] jsonData.data.errmsg 失败; console.log(第(i1)条数据不符合要求断言失败信息如下); console.log(pid是jsonData.data.list[i].pid); console.log(devType是jsonData.data.list[i].devType); console.log(sn是jsonData.data.list[i].sn); break; } } if(rightFlagBase 1 rightFlagType 1){ //完全信任正确标志在遍历完事件列表后如果返回数据正确该标志位都为1有一条数据不符合要求该标志位为0 tests[pid是xxxxx] jsonData.errmsg 成功; tests[devType是1] jsonData.errmsg 成功; tests[sn是 pm.environment.get(devSn)] jsonData.errmsg 成功; tests[返回的统一类型在指定列表当中[das,person,emergency]] jsonData.errmsg 成功; tests[QQ对应的eventType是event_das] jsonData.errmsg 成功; }else{ console.log(基本标志位是rightFlagBase); console.log(类型标志位是rightFlagType); } }
});
7添加逻辑_3
pm.test(断言信息如下, function () { var jsonData pm.response.json(); tests[返回结果是成功] jsonData.errmsg 成功; if(jsonData.data.list.length ! 0){ var rightFlag 0; //获取当前年、月与返回的日期对比 var date new Date(); var year date.getFullYear(); if((date.getMonth()1) 10){ var month 0(date.getMonth()1); //1-9月份需要修改月份格式例如07 }else{ var month date.getMonth()1 //10、11、12月不用修改格式 } //console.log(year:year); //console.log(month:month); for(var i 0;ijsonData.data.list.length;i){ if(jsonData.data.list[i].date.substr(0,4) year jsonData.data.list[i].date.substr(5,2) month jsonData.data.list[i].count ! 0){ //console.log(截取的年份是jsonData.data.list[i].date.substr(0,4)); //console.log(截取的月份是jsonData.data.list[i].date.substr(5,2)); //console.log(数量是jsonData.data.list[i].count) rightFlag 1; continue; }else{ rightFlag 0; break; } } if(rightFlag 1){ tests[返回月份正确并且该月事件数量不为0] jsonData.errmsg 成功; } }else{ tests[返回list是空前一个月没有事件] jsonData.errmsg 成功; } //pm.expect(jsonData.value).to.eql(100);
});
8添加逻辑_4
//获取当前时间戳并生成4小时又2分钟后的时间戳作为设置值传给后端
var timestamp new Date().getTime(); //当前时间戳
timestamp timestamp 4*60*60*1000 2*60*1000; //4小时又2分钟后的时间戳
console.log(当前时间戳timestamp)
pm.environment.set(timeStamp, timestamp);
//pm.globals.set(globalTemp, timestamp);
9定义方法、发送请求
//校验返回json串
pm.test(返回json串正确, function () { pm.response.to.have.body({errno:0,errmsg:成功,data:{}});
});
//调用 获取设置-根据key获取-notify 断言设置的 值 是否正确
function uuid() { var s []; var hexDigits 0123456789abcdef; for (var i 0; i 36; i) { s[i] hexDigits.substr(Math.floor(Math.random() * 0x10), 1); } s[14] 4; // bits 12-15 of the time_hi_and_version field to 0010 s[19] hexDigits.substr((s[19] 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01 s[8] s[13] s[18] s[23] -; var uuid s.join(); return uuid;
}
var tempL pm.environment.get(host);
var tempUuid uuid();
console.log(tempGuid:tempUuid)
var tempP pm.environment.get(pid);
const getRegStatus { url:https://tempL/v1/appSetting/getByKey?uuidtempUuid, method: POST, header: [Content-Type:application/x-www-form-urlencoded, zz-Pid: pm.environment.get(pid_), zz-Uid: pm.environment.get(uid_), zz-Sid: pm.environment.get(sid_), ], body: { mode: urlencoded, urlencoded: snpm.environment.get(devSn)devType1keyradar}
};
pm.sendRequest(getRegStatus, function (err, response) { //发送请求 console.log(response.json()); var jsonData response.json() pm.test(bearing值是111.0, function () { pm.expect(jsonData.data.list[0].value).to.eql(111.0); }); pm.test(locate值是{\longitude\:116.56605774760248,\latitude\:39.97220103883733}, function () { pm.expect(jsonData.data.list[1].value).to.eql({\longitude\:116.56605774760248,\latitude\:39.97220103883733}); }); pm.test(distance值是914cm即30ft, function () { pm.expect(jsonData.data.list[2].value).to.eql(914); });
});
6、编写Pre-request Script
1调用方法
//生成当前时间戳
var timeNow new Date().getTime();
pm.environment.set(timeLt, timeNow); //当前时间
console.log(当前时间戳是timeNow);
pm.environment.set(timeGt, 0); //当前日期的0点
//生成md5
var pwdTemp pm.environment.get(pwd);
var md5Pwd CryptoJS.MD5(pwdTemp).toString();
pm.environment.set(pwdAfterMd5, md5Pwd);
2定义方法例如生成邮箱用于注册使用
//生成随机邮箱前缀
function randomString(e) { e e || 32; var t ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789, a t.length, n ; for (i 0; i e; i) n t.charAt(Math.floor(Math.random() * a)); return n
}
pm.environment.set(unregisteredEmail, gz-test- randomString(10)qq.com);
3添加逻辑判断
var tempSn pm.environment.get(devSn);
var tempNa pm.environment.get(devName);
if(tempSn 1000){ console.log(该用户未xx任何设备);
}
else if(tempSn 2000){ console.log(该用户没有绑定mm设备或者没有自主设备不能修改设备名称);
}
else{ console.log(该用户绑定了mmsn_是tempSnname是tempNa); var tempNaEdit tempNa.reverse(); //对原有的设备名字进行反转作为修改后的名字 pm.environment.set(devName, tempNaEdit);
}
4生成预置数据_1
//生成当前时间戳
var timeNow new Date().getTime();
pm.environment.set(timeLt, timeNow); //当前时间
console.log(当前时间戳是timeNow);
//获取当日0点时间戳
var startT new Date();
startT.setHours(0);
startT.setMinutes(0);
startT.setSeconds(0);
startT.getTime();
console.log(startT is: startT.getTime());
pm.environment.set(timeGt, startT.getTime());
5生成预置数据_2
var date new Date();
//获取前月第一天的时间戳例如7月1日是1625068800000
var start new Date(date.getFullYear(),(date.getMonth()-1),date.getDate(),00,00,00);
var startOfMonth start.setDate(1);
console.log(前月的第一天是startOfMonth);
pm.environment.set(sOm, startOfMonth);
//获取前月的天数例如7月份是31天
var countOfMonth new Date(date.getFullYear(),date.getMonth(),0).getDate();
console.log(前月一共有countOfMonth天);
//获取前月最后一天的时间戳例如7月31日是1627747199000
var end new Date(date.getFullYear(),(date.getMonth()-1),date.getDate(),23,59,59);
var endOfMonth end.setDate(countOfMonth);
console.log(前月最后一天是endOfMonth);
pm.environment.set(eOm, endOfMonth);
6发送请求
同Test模块
总结接口主要是对数据进行处理通过服务程序对数据操作增删改查等那么数据的准确性包括字段的准确性成为验证的重点。为了代替人眼对接口返回数据的校验那么在接口自动化中就会使用代码对数据进行校验这样就产生了Pre-request Script和Test模块的大量使用并需要编写适合场景的校验代码。
8、其他注意
1、首先创建自己的postman账号
2、创建团队免费的是3个人。
3、辑脚本过程要及时的Save避免写了大半天的脚本没保存。