Postman实现接口功能测试
新增货品接口实战
1、填写接口请求4要素:
由于货品新增接口文档找不到接口请求4要素中的:请求方法、请求地址和请求头,故,使用Fiddler抓包获取,获取结果如下:
1)请求方法:POST
2)请求地址:
https://open.jackyun.com/open-platform/developer/intercept/testtool/buildparamandrequest
3)请求头:
截图如下:
文本内容如下:
Content-Type: application/x-www-form-urlencoded; charset=UTF-8 Cookie: 53revisit=1680485326445; _ati=688404030667; Hm_lvt_4293e6f16d3e0252d48cf7a1252f995f=1687759229; Qs_lvt_352880=1680485326%2C1683769042%2C1687759230; Qs_pv_352880=902333099737909600%2C3189451156430100000%2C3125342331411176400%2C2032507965245106700%2C3752838942850185700; jkusername=88888; yhusername=visitor; SESSION=7a4b3cf3-93ae-4d07-8f6e-c0cb494d3529; acw_tc=276aedc116893045482562737e7f9c70f5f6f059169db2675c8cde81387755; openplatfrom=jackyunweb?
备注:此次的
4)请求体:
请求体内容包括:method、appkey、version、contenttype、bizcontent,通过“API测试工具”的获取的请求参数,截图如下:
2、接口断言
断言内容包括:状态码断言、响应体断言(返回结果中outSkuCode(唯一性));截图如下:
3、Postman工具使用
1)在Postman工具中填写请求4要素并进行断言,截图如下:
2)断言内容:
json断言介绍:
断言内容有3个,分别如下:
4、接口脚本优化
由于货品新增接口中字段:货品编码、货品外部编码、货品规格具有唯一性,每次执行货品新增接口时需要修改这3个字段值,为了解决请求参数不断修改的问题,优化脚本如下:
1)global环境添加变量:
2)pre-requsts script的js脚本实现:
outSkuCode等4个参数参数化数据的规则(来源订单编号规则):前缀(test)+年月日+后缀(编号);
用js脚本实现如下:
3)请求参数引用global变量:
请求体的参数化脚本:
{ "skuImageUrl": "http://wdgjtest.oss-cn-hangzhou.aliyuncs.com/45/341960689798062080.jpg?Expires=4677564907&OSSAccessKeyId=LTAI2P5paDiiYDCJ&Signature=7gKXbqG2QWeG7sUByBk8J9ummno%3D", "goodsNameEn": "", "isPeriodManage": 0, "rightGoodsUrl": "http://wdgjtest.oss-cn-hangzhou.aliyuncs.com/45/341960689798062080.jpg?Expires=4677564907&OSSAccessKeyId=LTAI2P5paDiiYDCJ&Signature=7gKXbqG2QWeG7sUByBk8J9ummno%3D", "isDoorService": 0, "isProxySale": 0, "skuHeight": "", "shelfLiftUnit": "年", "goodsName": "{{outskuno}}", "goodsField8": "货品属性B", "goodsField9": "货品属性B", "goodsField10": "货品属性B", "goodsField4": "+货品属性B", "goodsField11": "货品属性B", "goodsField5": "货品属性B", "goodsField12": "货品属性B", "goodsField6": "货品属性B", "goodsField13": "货品属性B", "goodsField7": "货品属性B", "goodsField14": "货品属性B", "goodsField15": "货品属性B", "mainGoodsUrl": "http://wdgjtest.oss-cn-hangzhou.aliyuncs.com/45/341960689798062080.jpg?Expires=4677564907&OSSAccessKeyId=LTAI2P5paDiiYDCJ&Signature=7gKXbqG2QWeG7sUByBk8J9ummno%3D", "goodsField16": "货品属性B", "goodsField17": "货品属性B", "goodsField18": "货品属性B", "goodsField19": "货品属性B", "cateCode": "0101", "moduleContent": [{ "type": 1, "showOder": "1", "title": "标题", "content": "这是描述" }], "skuNo": "{{outskuno}}", "goodsField1": "货品属性B", "goodsField2": "货品属性B", "goodsField3": "货品属性B", "descript": "<p>这是很好的书!</p>+<p><img+src=\"http://jkyun.oss-cn-hangzhou.aliyuncs.com/longterm/45/system/erp/445554288029867136/1204140161368877696.jpg?Expires=4780344693&OSSAccessKeyId=LTAIh08vjrfC7HV0&Signature=Rb2zTo8%2BRXnWUx8uoBmMMJ3pgfs%3D#O1CN01vPRtFX1CP18G9GBqN-101450072.jpg\"+alt=\"\"+/></p>+<p> </p>", "belowGoodsUrl": "http://wdgjtest.oss-cn-hangzhou.aliyuncs.com/45/341960689798062080.jpg?Expires=4677564907&OSSAccessKeyId=LTAI2P5paDiiYDCJ&Signature=7gKXbqG2QWeG7sUByBk8J9ummno%3D", "ownerCode": "34343", "isCustomizProduction": 0, "isSyncToItem": "0", "goodsAlias": "", "shelfLife": 3, "platCateId": "110201", "goodsAttr": 1, "isSerialManagement": 0, "skuBarcode": "123fee", "materialImgUrl": "http://wdgjtest.oss-cn-hangzhou.aliyuncs.com/45/341960689798062080.jpg?Expires=4677564907&OSSAccessKeyId=LTAI2P5paDiiYDCJ&Signature=7gKXbqG2QWeG7sUByBk8J9ummno%3D", "sellInfo": "商品卖点", "topGoodsUrl": "http://wdgjtest.oss-cn-hangzhou.aliyuncs.com/45/341960689798062080.jpg?Expires=4677564907&OSSAccessKeyId=LTAI2P5paDiiYDCJ&Signature=7gKXbqG2QWeG7sUByBk8J9ummno%3D", "skuField29": "A", "skuField9": "A", "skuField8": "A", "skuField25": "A", "skuField7": "A", "skuField26": "A", "skuField6": "A", "skuField27": "A", "skuField5": "A", "skuField28": "A", "skuField4": "A", "skuField3": "A", "skuField2": "A", "skuField1": "A", "cateName": "笔记本", "outSkuCode": "{{outskuno}}", "skuField30": "A", "skuField18": "A", "skuField19": "A", "brandName": "", "unitName": "件", "skuField14": "A", "skuField15": "A", "skuField16": "A", "skuField17": "A", "isPickupCard": 0, "goodsMemo": "", "skuWidth": "", "volume": 0, "skuField21": "A", "leftGoodsUrl": "http://wdgjtest.oss-cn-hangzhou.aliyuncs.com/45/341960689798062080.jpg?Expires=4677564907&OSSAccessKeyId=LTAI2P5paDiiYDCJ&Signature=7gKXbqG2QWeG7sUByBk8J9ummno%3D", "skuField22": "A", "isProsaleProduct": 0, "goodsVideoUrl": "http://wdgjtest.oss-cn-hangzhou.aliyuncs.com/45/341960689798062080.jpg?Expires=4677564907&OSSAccessKeyId=LTAI2P5paDiiYDCJ&Signature=7gKXbqG2QWeG7sUByBk8J9ummno%3D", "skuField23": "A", "isProductionMaterials": 0, "skuField24": "A", "fixPrice": 1.20, "skuWeight": "", "skuField20": "A", "goodsField20": "货品属性B", "isBatchManagement": 0, "goodsField21": "货品属性B", "goodsField22": "货品属性B", "goodsField23": "货品属性B", "goodsField24": "货品属性B", "goodsField25": "货品属性B", "costValuationMethod": 0, "goodsField26": "货品属性B", "goodsField27": "货品属性B", "goodsField28": "货品属性B", "goodsField29": "货品属性B", "warehouseCode": "C0001", "skuName": "规格1", "skuField10": "A", "skuField11": "A", "mainBarcode": "CODE0001", "skuField12": "A", "abcCate": "A类", "skuField13": "A", "goodsNo": "{{outskuno}}", "goodsField30": "货品属性B", "skuLength": "", "isPaidService": 0 }
4)断言内容参数化
断言内容所在路径:jsondata.result.data.apiResponse.result
断言脚本的参数化:
5、接口测试结果
1)Cookie过期的执行结果:
2)更新最新cookie后,执行成功:
内容4:货品查询接口功能测试
货品查询接口介绍
货品查询接口实战
1、货品查询接口4要素
1)请求方法:post
2)请求地址:
https://open.jackyun.com/open-platform/developer/intercept/testtool/buildparamandrequest
3)请求头:
Content-Type: application/x-www-form-urlencoded; charset=UTF-8 Cookie: 53revisit=1680485326445; _ati=688404030667; Hm_lvt_4293e6f16d3e0252d48cf7a1252f995f=1687759229; Qs_lvt_352880=1680485326%2C1683769042%2C1687759230; Qs_pv_352880=902333099737909600%2C3189451156430100000%2C3125342331411176400%2C2032507965245106700%2C3752838942850185700; jkusername=88888; yhusername=visitor; SESSION=7a4b3cf3-93ae-4d07-8f6e-c0cb494d3529; acw_tc=276aede416893201598032765e502850bfa2405f4607b11856f9ed57a765be; openplatfrom=jackyunweb?
4)请求体
解码后请求体为:
appkey=28773818&method=erp.storage.goodslist&contenttype=JSON&version=v1.0&pageIndex=0&pageSize=1&startDate=&skuName=&isBlockup=&startDateModifiedGoods=&goodsNo=test&endDateModifiedSku=&endDate=&cateName=&abcCate=&isPackageGood=&skuIsBlockup=&skuBarcode=&goodsName=&assistBarcode=&endDateModifiedGoods=&startDateModifiedSku=&bizcontent={"pageIndex":"0","pageSize":"1","startDate":"","skuName":"","isBlockup":"","startDateModifiedGoods":"","goodsNo":"test","endDateModifiedSku":"","endDate":"","cateName":"","abcCate":"","isPackageGood":"","skuIsBlockup":"","skuBarcode":"","goodsName":"","assistBarcode":"","endDateModifiedGoods":"","startDateModifiedSku":""}?
2、货品查询接口断言
1)断言内容包括:
(1)状态码断言;
(2)接口响应结果断言:
根据货品编码查询结果有且只能有1条数据,故,断言内容为:total为1;
2)断言脚本分析:
(1)响应体断言内容的分析
响应体断言内容所在路径:jsondata.result.data.apiResponse.result。
3)断言脚本:
// // 获取global的值 // var sku01 = pm.globals.get("outskuno"); // // 状态码断言 pm.test("状态码断言", function () { pm.response.to.have.status(200); }); // json断言,断言信息的参数化 // 实际项目中,断言内容:\"total\":1 pm.test("json断言", function () { var jsonData = pm.response.json(); pm.expect(jsonData.result.data.apiResponse.result).to.include("\"total\":1"); });?
3、货品查询接口执行结果
1)cookie过期执行结果:
2)更新最新的cookie后的执行结果:
内容5:货品新增接口与货品查询接口关联
货品查询接口引用货品新增接口的参数
请求体参数化为(引用global参数):
appkey=28773818&method=erp.storage.goodslist&contenttype=JSON&version=v1.0&pageIndex=0&pageSize=1&startDate=&skuName=&isBlockup=&startDateModifiedGoods=&goodsNo={{outskuno}}&endDateModifiedSku=&endDate=&cateName=&abcCate=&isPackageGood=&skuIsBlockup=&skuBarcode=&goodsName=&assistBarcode=&endDateModifiedGoods=&startDateModifiedSku=&bizcontent={"pageIndex":"0","pageSize":"1","startDate":"","skuName":"","isBlockup":"","startDateModifiedGoods":"","goodsNo":"{{outskuno}}","endDateModifiedSku":"","endDate":"","cateName":"","abcCate":"","isPackageGood":"","skuIsBlockup":"","skuBarcode":"","goodsName":"","assistBarcode":"","endDateModifiedGoods":"","startDateModifiedSku":""}
断言内容
断言脚本:
// // 获取global的值 // var sku01 = pm.globals.get("outskuno"); // // 状态码断言 pm.test("状态码断言", function () { pm.response.to.have.status(200); }); // json断言,断言信息的参数化 // 实际项目中,断言内容:\"total\":1 pm.test("json断言", function () { var jsonData = pm.response.json(); pm.expect(jsonData.result.data.apiResponse.result).to.include("\"total\":1"); });
接口执行结果
1 批量执行器执行接口测试
使用runner实现两个货品新增接口和货品查询接口同时执行,截图如下:
1)Runner执行界面:
2)runner执行结果
2 无人值守的接口测试--持续集成
吉客云地址:https://open.jackyun.com/developer/apidocinfo.html?from=self&value=null&id=erp-baseinfo.flag.getflagid&name=true
newman的介绍
1 作用:newman:中介作用,执行Postman脚本并输出报告;
2 定义:newman是基于nodejs开发的一款工具,意思新的男人,是指在某一领域或某个方面,技高一筹;
3 操作命令:Newman run 参数操作;
Jenkins集成
准备工作:
1)Postman脚本
2)newman脚本
3)Jenkins环境
Postman脚本准备
newman脚本
执行成功的newman脚本,如下:
newman run '/home/Desktop/****电商erp.postman_collection.json' -g '/home/Desktop/MyWorkspace.postman_globals.json'?
Jenkins运行Postman脚本的步骤
Jenkins地址:http://192.168.**.**:8888
Jenkins功能介绍:
1 build:填写newman的命令:
2 build trigger:填写触发周期的公式;
Jenkins执行结果
整体执行结果:
某次具体的输出结果:
企业项目中对于触发器构建常用场景介绍
1 触发器触发条件介绍:
触发器触发条件公式:由5颗星组成
* * * * *
分别代表:分钟(0-59) 小时(0-23) 日期(1-31) 月份(1-12) 星期(0-6)
2 企业项目中常用场景介绍
场景1:接口脚本部分测试通过,部分还在进行,回归测试脚本执行频率高
间隔2/5分钟执行一次:
H/5 * * * *
场景2:接口脚本基本稳定,开发修改bug,回归测试脚本执行频率稍微低
每天下午18定时构建一次
H 18 * * *
场景3:上一个版本的接口脚本基本稳定,开发做新需求,回归测试脚本执行频率低
每周1/5构建一次
H H * * 5
备注:H表示hash值可以理解随机值;
作者:明月时时有