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 }