【Postman学习】Postman 入门4-postman参数化
postman---postman参数关联
我们在做接口测试的过程中,都会遇到同一个接口不同的数据,每次去一个个填写数据就太麻烦了,今天我们一起学习下如何通过postman进行参数化
参数化
参数化就是1个接口请求不同的数据,我们可以通过把请求的数据放入到一个文件中,通过循环请求这个文件中的数据,达到我们想要的结果
请求接口
开始练习前,我们先把我们用到的请求接口找到,这里我还是用了聚合数据中查询天气的接口,具体的内容前面有过介绍,这里都不详细说了
# 接口地址 http://apis.juhe.cn/simpleWeather/query # 请求参数 city:要查询的城市名称/id,城市名称如:温州、上海、北京,需要utf8 urlencode key:331eab8f3481f37868378fcdc76cb7cd
准备数据
这里我们通过更改城市的名称来做参数化,首先把想要测试的数据存放在TXT文件中(也可以通过csv文件格式),这里准备的数据包括异常的和正常的,可以通过postman中添加断言判断用例是否通过。
注:这里更改了编码格式,防止乱码
这里的第一行要是请求的参数名称,下面的是参数内容
参数化请求
打开postman,填写URL,选择请求方式,填写参数的时候,需要填写成关联的形式,方便批量执行时候读取内容。详情见postman---postman参数关联
注:这里会用到批量执行用例,要创建一个文件夹存放接口信息。
因为参数化,需要增加断言,要不然可能不知道哪条数据请求成功,哪天数据请求失败。这里用到了查询返回内容中是否存在XX字符串。关于断言详情见postman---postman增加断言
填写参数完成后,点击批量执行用例入口。详情见postman---postman文件夹介绍以及批量执行用例
1、选择请求接口内容
2、选择测试环境
3、填写请求次数(和参数内容对应)
4、上传参数化数据内容
5、查看数据内容是否正确
6、点击执行结果
等待1~2S就会发现接口结果已经全部都跑出来了。 也可以直接看出来接口是否请求通过
发现正常的参数都已经断言成功,异常的参数与断言不符合,表示请求不通过
只是通过一个小小的例子完成了postman关于参数化的介绍,当然小伙伴们需要自己动手操作下才能加深自己的记忆哦
1 实际上我们在第一个接口:创建会话中已经做了操作了,这里再详细解释一下,代码如下 2 3 if(responseCode.code === 200){ 4 // 判断是否存在 'success' 值 5 tests["Body matches code"] = responseBody.has("0"); 6 //获取响应结果result,作为下一个接口的入参 7 var jsonData = JSON.parse(responseBody); 8 postman.setGlobalVariable("sessionId",jsonData.result); 9 tests[`[INFO] Request params: ${JSON.stringify(request.data)}`] = true; 10 // tests["have result "]=jsonData.hasOwnProperty("error")!==true; 11 tests["have result "]=jsonData.hasOwnProperty("result")===true; 12 tests[`[INFO] Response timeout: ${responseTime}`] = responseTime < 6000; 13 }else{ 14 //接口请求失败 15 tests["Waring:Request Failed. Please Fix!"] = false; 16 } 17 针对创建会话的接口响应结果代码如下 18 19 { 20 "result": "******45****", 21 "code": "0" 22 } 23 在上面的代码中,我们可以看到这样的描写 24 25 //获取响应结果result,作为下一个接口的入参 26 var jsonData = JSON.parse(responseBody); 27 postman.setGlobalVariable("sessionId",jsonData.result); 28 这样我们就得到了第二个接口的入参sessionID的参数值信息,那么接下来就是使用md5加密进行接口用例编写喽。 29 我们先看一下接口文档描述,如图所示 30 31 32 33 34 根据接口文档描述,postman中接口信息,如图所示 35 36 37 这里根据接口描述,添加用户的身份证号码和手机号是唯一的,如果我们运行一次用例修改一次身份证号码和手机号岂不是很麻烦,这样也不利于后期的接口自动化操作。如果每次运行该接口用例的时候,录入的身份证号码和手机号都是变化的参数就可以实现后期的接口自动化操作了,那么该如何实现呢? 38 39 随机 40 让请求参数有点变化 41 42 postman中可以使用randomInt达到每次运行的参数都是变化的, 43 44 /**使用者变量信息 -重用的随机构造 */ 45 46 const randomInt = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min; // 随机整数 47 const getRandomValue = list => list[randomInt(0, list.length - 1)]; // 随机选项 48 接下来就是实现用户姓名、昵称、身份证号码和手机号以及输入性别的随机输入操作,代码如下 49 50 /**使用者变量信息 */ 51 52 const randomInt = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min; // 随机整数 53 const getRandomValue = list => list[randomInt(0, list.length - 1)]; // 随机选项 54 //随机生成一个字符串作为用户名 55 postman.setGlobalVariable("compellation", ("0000" + 56 (Math.random()*Math.pow(36,7) << 0).toString(36)).slice(-7)); 57 58 //用户昵称,随机2-6字姓名 59 const charsInName = ['赵', '钱', '孙', '李', '王', '张']; 60 const numOfChars = randomInt(2, 6); 61 let randomName = ''; 62 for (let i = 0; i < numOfChars; i++) { 63 let index = randomInt(0, 5); 64 randomName += charsInName[index]; 65 } 66 //environment.nickname = randomName; 67 postman.setGlobalVariable("nickname",randomName); 68 69 /** 70 //随机生成一个字符串作为昵称 71 postman.setEnvironmentVariable("nickname", ("0000" + 72 (Math.random()*Math.pow(36,4) << 0).toString(36)).slice(-4)); 73 */ 74 //用户性别 75 const divisions = ['O', 'M', 'F']; 76 //为什么使用environment无法设置变量? 原因environment是引用环境变量的操作 77 //environment.sex = getRandomValue(divisions); 78 postman.setGlobalVariable("sex",getRandomValue(divisions)); 79 //postman.setEnvironmentVariable("sex","O"); 80 //用户身份证号码 81 //postman.setEnvironmentVariable("card","500106200412055816"); 82 postman.setGlobalVariable("card",`50010620001208${randomInt(1000, 9999)}`); 83 // 随机生日(时间戳) 84 // 假设今天是2017-1-1,距1970-1-1 47年,则生日范围为 1923-1-1 ~ 2017-1-1 85 //environment.birthday = randomInt(0 - Date.now(), Date.now()); 86 //postman.setEnvironmentVariable("birthday",Date.now()); 87 /** 88 //获取系统当前时间,并组装成固定格式时间戳 89 var d = new Date(); 90 //将日期组装成2位 91 var timeDate = d.getDate().toString(); 92 if(timeDate.length == 1){ 93 timeDate = "0" + timeDate; 94 } 95 //组装整个时间戳 96 var timesDate = d.getFullYear() + "-"+(d.getMonth()+1).toString() +"-"+ timeDate; 97 postman.setEnvironmentVariable("birthday", timesDate); 98 */ 99 postman.setGlobalVariable("birthday", '2000-12-08'); 100 //身高 101 //environment.height = '${randomInt(120, 221)}'; 102 //environment.height = randomInt(120, 221); 103 postman.setGlobalVariable("height",randomInt(120, 221)); 104 //体重 105 //environment.weight = '${randomInt(40, 150)}'; 106 //environment.height = randomInt(40, 150); 107 postman.setGlobalVariable("weight",randomInt(40, 150)); 108 //remark 109 //随机生成一个字符串作为remark 110 postman.setGlobalVariable("remark", ("test" + 111 (Math.random()*Math.pow(36,4) << 0).toString(36)).slice(-4)); 112 // 随机手机 113 //environment.phone = `18${randomInt(100000000, 999999999)}`; 114 postman.setGlobalVariable("phone",`18${randomInt(100000000, 999999999)}`); 115 这样就实现了接口的参数化,那么录入用户的接口Pre-Request Script代码如下 116 117 //获取全局变量值 118 sessionId = postman.getGlobalVariable("sessionId"); 119 customerCode = postman.getGlobalVariable("customerCode"); 120 timestamp = postman.getGlobalVariable('timestamp'); 121 ytoken = postman.getGlobalVariable("ytoken"); 122 unicode = postman.getGlobalVariable("unicode"); 123 var pytokenstr = sessionId + customerCode+unicode+timestamp+ytoken; 124 125 //postman.setEnvironmentVariable("str",str); 126 //environment.str = str; 127 postman.setGlobalVariable("pytokenstr",pytokenstr); 128 //var md5 = CryptoJS.MD5(str).toString().toLowerCase(); 129 //使用md5加密得到ptoken 130 //var strmd5 = CryptoJS.MD5(str).toString(); 131 var ptoken = CryptoJS.MD5(pytokenstr); 132 //environment.strmd5 = strmd5; 133 postman.setGlobalVariable('ptoken',ptoken); 134 135 /**使用者变量信息 */ 136 137 const randomInt = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min; // 随机整数 138 const getRandomValue = list => list[randomInt(0, list.length - 1)]; // 随机选项 139 //随机生成一个字符串作为用户名 140 postman.setGlobalVariable("compellation", ("0000" + 141 (Math.random()*Math.pow(36,7) << 0).toString(36)).slice(-7)); 142 143 //用户昵称,随机2-6字姓名 144 const charsInName = ['赵', '钱', '孙', '李', '王', '张']; 145 const numOfChars = randomInt(2, 6); 146 let randomName = ''; 147 for (let i = 0; i < numOfChars; i++) { 148 let index = randomInt(0, 5); 149 randomName += charsInName[index]; 150 } 151 //environment.nickname = randomName; 152 postman.setGlobalVariable("nickname",randomName); 153 154 /** 155 //随机生成一个字符串作为昵称 156 postman.setEnvironmentVariable("nickname", ("0000" + 157 (Math.random()*Math.pow(36,4) << 0).toString(36)).slice(-4)); 158 */ 159 //用户性别 160 const divisions = ['O', 'M', 'F']; 161 //为什么使用environment无法设置变量? 原因environment是引用环境变量的操作 162 //environment.sex = getRandomValue(divisions); 163 postman.setGlobalVariable("sex",getRandomValue(divisions)); 164 //postman.setEnvironmentVariable("sex","O"); 165 //用户身份证号码 166 //postman.setEnvironmentVariable("card","500106200412055816"); 167 postman.setGlobalVariable("card",`50010620001208${randomInt(1000, 9999)}`); 168 // 随机生日(时间戳) 169 // 假设今天是2017-1-1,距1970-1-1 47年,则生日范围为 1923-1-1 ~ 2017-1-1 170 //environment.birthday = randomInt(0 - Date.now(), Date.now()); 171 //postman.setEnvironmentVariable("birthday",Date.now()); 172 /** 173 //获取系统当前时间,并组装成固定格式时间戳 174 var d = new Date(); 175 //将日期组装成2位 176 var timeDate = d.getDate().toString(); 177 if(timeDate.length == 1){ 178 timeDate = "0" + timeDate; 179 } 180 //组装整个时间戳 181 var timesDate = d.getFullYear() + "-"+(d.getMonth()+1).toString() +"-"+ timeDate; 182 postman.setEnvironmentVariable("birthday", timesDate); 183 */ 184 postman.setGlobalVariable("birthday", '2000-12-08'); 185 //身高 186 //environment.height = '${randomInt(120, 221)}'; 187 //environment.height = randomInt(120, 221); 188 postman.setGlobalVariable("height",randomInt(120, 221)); 189 //体重 190 //environment.weight = '${randomInt(40, 150)}'; 191 //environment.height = randomInt(40, 150); 192 postman.setGlobalVariable("weight",randomInt(40, 150)); 193 //remark 194 //随机生成一个字符串作为remark 195 postman.setGlobalVariable("remark", ("test" + 196 (Math.random()*Math.pow(36,4) << 0).toString(36)).slice(-4)); 197 // 随机手机 198 //environment.phone = `18${randomInt(100000000, 999999999)}`; 199 postman.setGlobalVariable("phone",`18${randomInt(100000000, 999999999)}`); 200 console.log(pytokenstr); 201 部分代码参考 https://testerhome.com/topics/6641 202 203 然后在potman中body中设置如图所示 204 205 206 之后在Tests中增加断言信息,代码如下 207 208 // 推荐用全等 ===,确保类型和值都一致 209 //tests['Status code is 200'] = responseCode.code === 200); 210 // 判断是否存在 'success' 值 211 if(responseCode.code===200 & responseBody !== null & responseBody.has("code") ){ 212 tests["Body matches code"] = responseBody.has("0"); 213 214 var jsonData = JSON.parse(responseBody); 215 postman.setGlobalVariable("userId",jsonData.result.user_id); 216 217 tests[`[INFO] Request params: ${JSON.stringify(request.data)}`] = true; 218 //可以考虑判断user_id,后续升级考虑 219 tests["have result "]=jsonData.hasOwnProperty("result")===true; 220 tests[`[INFO] Response timeout: ${responseTime}`] = responseTime < 6000; 221 222 } 223 else{ 224 //接口请求失败 225 tests["Waring:Request Failed. Please Fix!"] = false; 226 } 227 在上面这段代码中,使用var jsonData = JSON.parse(responseBody); postman.setGlobalVariable("userId",jsonData.result.user_id);再次获取了该接口的响应结果中的user_id的值作为下一个接口的参数,而该接口的响应结果代码如图 228 229 { 230 "result": { 231 "birthday": "2000-12-08", 232 "phone": "18271263485", 233 "sex": "O", 234 "register_time": "2017-11-30 10:49:43", 235 "weight": "109", 236 "height": "184", 237 "remark": "fdn1", 238 "organization_id": "1149", 239 "compellation": "-pm6eil", 240 "card": "500106200012081705", 241 "user_id": 1638 242 }, 243 "code": "0" 244 }