51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 3908|回复: 1
打印 上一主题 下一主题

[讨论] postman接口测试系列:接口参数化和参数的传递

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2018-4-13 13:39:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
接着上一个章节时间戳和加密继续,上一节中我们使用Pre-Request Script可以正确获取时间戳和加密后的数
据,接口响应结果也达到了预期目标。这里先简单说明一下接口的用例设计的测试点,截图所示

那么接下来就是创建会话的接口用例(实际上接口用例的设计和一般模块的功能测试的用例原理是一样的),
这里简单截图说明一下,如图



这样创建会话认证的接口已经测试完成!

接下来就进入第二个接口-使用者信息录入。这个接口参数中需要用到第一个接口中的返回值result作为此接
口的入参session,这里该如何操作呢?
实际上我们在第一个接口:创建会话中已经做了操作了,这里再详细解释一下,代码如下

  1. if(responseCode.code === 200){
  2. // 判断是否存在 'success' 值  
  3. tests["Body matches code"] = responseBody.has("0");
  4. //获取响应结果result,作为下一个接口的入参
  5. var jsonData = JSON.parse(responseBody);
  6. postman.setGlobalVariable("sessionId",jsonData.result);
  7. tests[`[INFO] Request params: ${JSON.stringify(request.data)}`] = true;
  8. // tests["have result "]=jsonData.hasOwnProperty("error")!==true;
  9. tests["have result "]=jsonData.hasOwnProperty("result")===true;
  10. tests[`[INFO] Response timeout: ${responseTime}`] = responseTime < 6000;
  11. }else{
  12. //接口请求失败
  13. tests["Waring:Request Failed. Please Fix!"] = false;
  14. }
  15. 针对创建会话的接口响应结果代码如下

  16. {
  17. "result": "******45****",
  18. "code": "0"
  19. }
复制代码

在上面的代码中,我们可以看到这样的描写

//获取响应结果result,作为下一个接口的入参
var jsonData = JSON.parse(responseBody);
postman.setGlobalVariable("sessionId",jsonData.result);
这样我们就得到了第二个接口的入参sessionID的参数值信息,那么接下来就是使用md5加密进行接口用例编
写喽。
我们先看一下接口文档描述,如图所示





根据接口文档描述,postman中接口信息,如图所示


这里根据接口描述,添加用户的身份证号码和手机号是唯一的,如果我们运行一次用例修改一次身份证号码和
手机号岂不是很麻烦,这样也不利于后期的接口自动化操作。如果每次运行该接口用例的时候,录入的身份证
号码和手机号都是变化的参数就可以实现后期的接口自动化操作了,那么该如何实现呢?

随机
让请求参数有点变化

postman中可以使用randomInt达到每次运行的参数都是变化的,

/**使用者变量信息 -重用的随机构造  */

  1. const randomInt = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min;  // 随机整数
  2. const getRandomValue = list => list[randomInt(0, list.length - 1)];  // 随机选项
  3. 接下来就是实现用户姓名、昵称、身份证号码和手机号以及输入性别的随机输入操作,代码如下

  4. /**使用者变量信息   */

  5. const randomInt = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min;  // 随机整数
  6. const getRandomValue = list => list[randomInt(0, list.length - 1)];  // 随机选项
  7. //随机生成一个字符串作为用户名
  8. postman.setGlobalVariable("compellation", ("0000" +
  9. (Math.random()*Math.pow(36,7) << 0).toString(36)).slice(-7));

  10. //用户昵称,随机2-6字姓名
  11. const charsInName = ['赵', '钱', '孙', '李', '王', '张'];
  12. const numOfChars = randomInt(2, 6);
  13. let randomName = '';
  14. for (let i = 0; i < numOfChars; i++) {
  15. let index = randomInt(0, 5);
  16. randomName += charsInName[index];
  17. }
  18. //environment.nickname = randomName;
  19. postman.setGlobalVariable("nickname",randomName);

  20. /**
  21. //随机生成一个字符串作为昵称
  22. postman.setEnvironmentVariable("nickname", ("0000" +
  23. (Math.random()*Math.pow(36,4) << 0).toString(36)).slice(-4));
  24.     */
  25. //用户性别
  26. const divisions = ['O', 'M', 'F'];
  27. //为什么使用environment无法设置变量? 原因environment是引用环境变量的操作
  28. //environment.sex = getRandomValue(divisions);
  29. postman.setGlobalVariable("sex",getRandomValue(divisions));
  30. //postman.setEnvironmentVariable("sex","O");
  31. //用户身份证号码
  32. //postman.setEnvironmentVariable("card","500106200412055816");
  33. postman.setGlobalVariable("card",`50010620001208${randomInt(1000, 9999)}`);
  34. // 随机生日(时间戳)
  35. // 假设今天是2017-1-1,距1970-1-1 47年,则生日范围为 1923-1-1 ~ 2017-1-1
  36. //environment.birthday = randomInt(0 - Date.now(), Date.now());
  37. //postman.setEnvironmentVariable("birthday",Date.now());
  38. /**
  39. //获取系统当前时间,并组装成固定格式时间戳
  40. var d = new Date();
  41. //将日期组装成2位
  42. var timeDate = d.getDate().toString();
  43. if(timeDate.length == 1){
  44. timeDate = "0" + timeDate;
  45. }
  46. //组装整个时间戳
  47. var timesDate = d.getFullYear() + "-"+(d.getMonth()+1).toString() +"-"+ timeDate;
  48. postman.setEnvironmentVariable("birthday", timesDate);
  49.     */
  50. postman.setGlobalVariable("birthday", '2000-12-08');
  51. //身高
  52. //environment.height = '${randomInt(120, 221)}';
  53. //environment.height = randomInt(120, 221);
  54. postman.setGlobalVariable("height",randomInt(120, 221));
  55. //体重
  56. //environment.weight = '${randomInt(40, 150)}';
  57. //environment.height = randomInt(40, 150);
  58. postman.setGlobalVariable("weight",randomInt(40, 150));
  59. //remark
  60. //随机生成一个字符串作为remark
  61. postman.setGlobalVariable("remark", ("test" +
  62. (Math.random()*Math.pow(36,4) << 0).toString(36)).slice(-4));
  63. // 随机手机
  64. //environment.phone = `18${randomInt(100000000, 999999999)}`;
  65. postman.setGlobalVariable("phone",`18${randomInt(100000000, 999999999)}`);
  66. 这样就实现了接口的参数化,那么录入用户的接口Pre-Request Script代码如下

  67. //获取全局变量值
  68. sessionId = postman.getGlobalVariable("sessionId");
  69. customerCode = postman.getGlobalVariable("customerCode");
  70. timestamp = postman.getGlobalVariable('timestamp');
  71. ytoken = postman.getGlobalVariable("ytoken");
  72. unicode = postman.getGlobalVariable("unicode");
  73. var pytokenstr = sessionId + customerCode+unicode+timestamp+ytoken;

  74. //postman.setEnvironmentVariable("str",str);
  75. //environment.str = str;
  76. postman.setGlobalVariable("pytokenstr",pytokenstr);
  77. //var md5 = CryptoJS.MD5(str).toString().toLowerCase();
  78. //使用md5加密得到ptoken
  79. //var strmd5 = CryptoJS.MD5(str).toString();
  80. var ptoken = CryptoJS.MD5(pytokenstr);
  81. //environment.strmd5 = strmd5;
  82. postman.setGlobalVariable('ptoken',ptoken);

  83. /**使用者变量信息   */

  84. const randomInt = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min;  // 随机整数
  85. const getRandomValue = list => list[randomInt(0, list.length - 1)];  // 随机选项
  86. //随机生成一个字符串作为用户名
  87. postman.setGlobalVariable("compellation", ("0000" +
  88. (Math.random()*Math.pow(36,7) << 0).toString(36)).slice(-7));

  89. //用户昵称,随机2-6字姓名
  90. const charsInName = ['赵', '钱', '孙', '李', '王', '张'];
  91. const numOfChars = randomInt(2, 6);
  92. let randomName = '';
  93. for (let i = 0; i < numOfChars; i++) {
  94. let index = randomInt(0, 5);
  95. randomName += charsInName[index];
  96. }
  97. //environment.nickname = randomName;
  98. postman.setGlobalVariable("nickname",randomName);

  99. /**
  100. //随机生成一个字符串作为昵称
  101. postman.setEnvironmentVariable("nickname", ("0000" +
  102. (Math.random()*Math.pow(36,4) << 0).toString(36)).slice(-4));
  103.     */
  104. //用户性别
  105. const divisions = ['O', 'M', 'F'];
  106. //为什么使用environment无法设置变量? 原因environment是引用环境变量的操作
  107. //environment.sex = getRandomValue(divisions);
  108. postman.setGlobalVariable("sex",getRandomValue(divisions));
  109. //postman.setEnvironmentVariable("sex","O");
  110. //用户身份证号码
  111. //postman.setEnvironmentVariable("card","500106200412055816");
  112. postman.setGlobalVariable("card",`50010620001208${randomInt(1000, 9999)}`);
  113. // 随机生日(时间戳)
  114. // 假设今天是2017-1-1,距1970-1-1 47年,则生日范围为 1923-1-1 ~ 2017-1-1
  115. //environment.birthday = randomInt(0 - Date.now(), Date.now());
  116. //postman.setEnvironmentVariable("birthday",Date.now());
  117. /**
  118. //获取系统当前时间,并组装成固定格式时间戳
  119. var d = new Date();
  120. //将日期组装成2位
  121. var timeDate = d.getDate().toString();
  122. if(timeDate.length == 1){
  123. timeDate = "0" + timeDate;
  124. }
  125. //组装整个时间戳
  126. var timesDate = d.getFullYear() + "-"+(d.getMonth()+1).toString() +"-"+ timeDate;
  127. postman.setEnvironmentVariable("birthday", timesDate);
  128.     */
  129. postman.setGlobalVariable("birthday", '2000-12-08');
  130. //身高
  131. //environment.height = '${randomInt(120, 221)}';
  132. //environment.height = randomInt(120, 221);
  133. postman.setGlobalVariable("height",randomInt(120, 221));
  134. //体重
  135. //environment.weight = '${randomInt(40, 150)}';
  136. //environment.height = randomInt(40, 150);
  137. postman.setGlobalVariable("weight",randomInt(40, 150));
  138. //remark
  139. //随机生成一个字符串作为remark
  140. postman.setGlobalVariable("remark", ("test" +
  141. (Math.random()*Math.pow(36,4) << 0).toString(36)).slice(-4));
  142. // 随机手机
  143. //environment.phone = `18${randomInt(100000000, 999999999)}`;
  144. postman.setGlobalVariable("phone",`18${randomInt(100000000, 999999999)}`);
  145. console.log(pytokenstr);
复制代码


然后在potman中body中设置如图所示


之后在Tests中增加断言信息,代码如下

  1. // 推荐用全等 ===,确保类型和值都一致
  2. //tests['Status code is 200'] = responseCode.code === 200);
  3. // 判断是否存在 'success' 值  
  4. if(responseCode.code===200 & responseBody !== null & responseBody.has("code") ){
  5. tests["Body matches code"] = responseBody.has("0");

  6. var jsonData = JSON.parse(responseBody);
  7. postman.setGlobalVariable("userId",jsonData.result.user_id);

  8. tests[`[INFO] Request params: ${JSON.stringify(request.data)}`] = true;
  9. //可以考虑判断user_id,后续升级考虑
  10. tests["have result "]=jsonData.hasOwnProperty("result")===true;
  11. tests[`[INFO] Response timeout: ${responseTime}`] = responseTime < 6000;

  12. }
  13. else{
  14. //接口请求失败
  15. tests["Waring:Request Failed. Please Fix!"] = false;
  16. }
复制代码

在上面这段代码中,使用var jsonData = JSON.parse(responseBody); postman.setGlobalVariable("userId",jso
nData.result.user_id);再次获取了该接口的响应结果中的user_id的值作为下一个接口的参数,而该接口的响应
结果代码如图

  1. {
  2. "result": {
  3.     "birthday": "2000-12-08",
  4.     "phone": "18271263485",
  5.     "sex": "O",
  6.     "register_time": "2017-11-30 10:49:43",
  7.     "weight": "109",
  8.     "height": "184",
  9.     "remark": "fdn1",
  10.     "organization_id": "1149",
  11.     "compellation": "-pm6eil",
  12.     "card": "500106200012081705",
  13.     "user_id": 1638
  14. },
  15. "code": "0"
  16. }
复制代码

通过这两处不同的接口响应结果的取值,对于这种构造类型的响应结果的取值可以轻松应对。以后如果在遇到
其他接口的响应结果取值,再慢慢积累吧......

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2
回复

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-4-25 17:03 , Processed in 0.066044 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表