接口自动化【七】__包装响应结果的数据为key-value

文章目录

  • 前言

  • 一、本章学习的思路

  • 二、用接口新建商品_使用步骤

    • ​​​​​​​步骤一:先用抓包的方式拿到新建商品的接口

    • 步骤二:我们先用单接口的形式,把这个商品添加成功

  • 三、处理响应接口_(包装响应结果的数据为:key-value)

    • ​​​​​​​​​​​​​​函数:transfer_resp_text_to_dict

  • 四、新建商品的流程

    • Excel表格中的请求数据_(从登录,上传图片到新建商品)

  • 总结


前言

遇到上下接口关联,下一个接口里面的部分数据会使用到上一个接口里面的数据,上一个涉及的接口返回的不是json格式的字符串的时候。需要去处理这个数据。写一个函数专门去处理这个没有key的数据。


一、本章学习的思路

我们知道,接口关联,最低都是一个接口。那么现在要上传一个商品,就需要关联两个接口,第一个是登录获取权限的接口,第二个就是新建商品时,上传商品图片,这个图片是要依赖于上一个上传图片的接口。所以在这里就会依赖两个接口。

这里面涉及到的知识点:


1、jsonpath的用法,这个的目的就是用来提取上传图片接口的返回值


2、接口的返回值不是json格式的字符串,那么我们要把这个字符串组装成为一个json形式的字符串。


那么要核心思想就是,给这个单独的字符串添加一个key。

先使用普通的接口写法,先进行商品的新建。确认无误后,再进行封装。

二、用接口新建商品_使用步骤

先用抓包的方式拿到新建商品的接口。

我们可以看到这个接口就是商品添加成功的接口。

接口自动化【七】__包装响应结果的数据为key-value_第1张图片

下面的那一个接口就是返回所有商品的接口,也就是界面上我们看到很多商品的接口。

接口自动化【七】__包装响应结果的数据为key-value_第2张图片

步骤一:我们先拿取这个接口的相关信息

接口自动化【七】__包装响应结果的数据为key-value_第3张图片接口自动化【七】__包装响应结果的数据为key-value_第4张图片

 接口自动化【七】__包装响应结果的数据为key-value_第5张图片

请求的URL:http://mall.lemonban.com:8108/prod/prod

请求的方法:post

请求数据:

{"t":1685543534167,"prodName":"大水杯","brief":"","video":"","prodNameEn":"大水杯","prodNameCn":"大水杯","contentEn":"","contentCn":"

https://img20.360buyimg.com/imgzone/jfs/t1/188624/12/24718/216131/6283adb4Ea0940517/db811f2d5728180f.jpg.avif

","briefEn":"","briefCn":"","pic":"2023/05/b2f01c9cb9cb4cf2abf1d69e2db85fc7.","imgs":"2023/05/b2f01c9cb9cb4cf2abf1d69e2db85fc7.","preSellStatus":0,"preSellTime":null,"categoryId":151,"skuList":[{"price":10,"oriPrice":20,"stocks":0,"skuScore":1,"properties":"","skuName":"","prodName":"","weight":0,"volume":0,"status":1,"partyCode":"qhjtest001","prodNameCn":"大水杯","prodNameEn":"大水杯"}],"tagList":[1],"content":"","deliveryTemplateId":1,"totalStocks":0,"price":10,"oriPrice":20,"deliveryModeVo":{"hasShopDelivery":true,"hasUserPickUp":false,"hasCityDelivery":false}}

从上面的请求的数据看出,这个样子并没有多么的好看,看着乱糟糟的。那么我们可以使用在线json格式化工具。

 在线json格式化之后:

{
	"t": 1685543534167,
	"prodName": "大水杯",
	"brief": "",
	"video": "",
	"prodNameEn": "大水杯",
	"prodNameCn": "大水杯",
	"contentEn": "",
	"contentCn": "

https://img20.360buyimg.com/imgzone/jfs/t1/188624/12/24718/216131/6283adb4Ea0940517/db811f2d5728180f.jpg.avif

", "briefEn": "", "briefCn": "", "pic": "2023/05/b2f01c9cb9cb4cf2abf1d69e2db85fc7.", "imgs": "2023/05/b2f01c9cb9cb4cf2abf1d69e2db85fc7.", "preSellStatus": 0, "preSellTime": null, "categoryId": 151, "skuList": [{ "price": 10, "oriPrice": 20, "stocks": 0, "skuScore": 1, "properties": "", "skuName": "", "prodName": "", "weight": 0, "volume": 0, "status": 1, "partyCode": "qhjtest001", "prodNameCn": "大水杯", "prodNameEn": "大水杯" }], "tagList": [1], "content": "", "deliveryTemplateId": 1, "totalStocks": 0, "price": 10, "oriPrice": 20, "deliveryModeVo": { "hasShopDelivery": true, "hasUserPickUp": false, "hasCityDelivery": false } }

字段解释:

"t": int(time.time()*1000), ,时间戳
"prodName": "测试商品2021", #商品名称:必填项,不能为空,长度小于200字节
"brief": "", #商品卖点,长度小于500字节
"video": "", #商品视频,
"prodNameEn": "测试商品2021", #商品英文名称,必填项,不能为空,长度小于200字节
"prodNameCn": "测试商品2021",#商品中文名称,必填项,不能为空,长度小于200字节
"contentEn": "", #商品英文详情
#商品中文详情,必填项
"contentCn": "

\"\"\"京东图片2\"

", "briefEn": "", #产品卖点英文,长度小于500字节 "briefCn": "产品卖点",#产品卖点中文,必填项,长度小于500字节 "pic": "2021/11/4141b40563b844ddb321b8d01042229c.png", #首页展示图,必填项 # 商品图片,首页多张图片,必填项 "imgs": "2021/11/4141b40563b844ddb321b8d01042229c.png,2021/11/c1c5b33beaf94581a1071ae3213aad78.png", "preSellStatus": 0, #预售状态 1:开启 0:未开启 "preSellTime": None, #预售发货时间 "categoryId": 148, #商品分类,填对应分类的Id号 "skuList": [{ "price": 20, #商品价格,必填项 "oriPrice": 20, #商品原价,必填项 "stocks": 10, # 商品库存量 # "skuScore": 1, #去掉,后端未接收 # "properties": "",#去掉,后端未接收 # "skuName": "",#去掉,后端未接收 "prodName": "", # 商品名称,长度小于200字节 "weight": 10, #商品重量,必填项 "volume": 0, #商品体积,必填项,kg "status": 1, #商品状态,默认是1:正常状态, -1:删除, 0:下架 "partyCode": random.randint(100,10000000),# 商品编码,,不可重复 "prodNameCn": "测试商品2021",#商品中文名称,必填项,不能为空,长度小于200字节 "prodNameEn": "测试商品2021" #商品英文名称,必填项,不能为空,长度小于200字节 }], "tagList": [1], #分组标签列表, "content": "", # 商品详情 "deliveryTemplateId": 1, #运费模板id, "totalStocks": 10, #商品库存量 "price": 20,#商品价格,必填项 "oriPrice": 20, #商品原价,必填项 "deliveryModeVo": { #是否能够用户自提 "hasShopDelivery": True, # 上家配送 "hasUserPickUp": False, # 用户自提 "hasCityDelivery": False # 同城配送

思考1:如果商品添加成功了,那么我们需要什么字段才知道是不是已经添加成功了呢?

如果从数据的方面出发:商品添加成功 -- 返回商品id,从数据库里tz_prod里的商品id。 tz_sku是库存表。

思考2:如果是就这个添加商品的接口把它做接口测试,那么我们会对字段思考哪些呢?

# 哪些字段可以不用改。。

# 哪些字段是需要去测试类型、格式是否正确的(字段校验、必传不传)

# 不同的字段组合 # 优先级 - 常用和不常用

在测试接口时,校验字段时,我们可以不传一些字段,来校验接口的返回值。从而达到断言的目的。例如:

接口自动化【七】__包装响应结果的数据为key-value_第6张图片

步骤二:我们先用单接口的形式,把这个商品添加成功

注意:这里有个非常重要的一点,虽然我们前面说,可以用在线格式化的工具,进行json字符串的格式化,但是千万不要直接复制过来到Python中的字典里面,不然发送请求后就会提示莫名其妙的什么参数没有传,其实是传了的,就算去修改了参数也还是不能传成功。所以必须复制那个原始的不好看的数据,再到Python里面,手动调节

接口自动化【七】__包装响应结果的数据为key-value_第7张图片

 

 附上代码:

import requests

add_product_req_data = {
    "t": 1685547292565,
    "prodName": "小狗狗1",
    "brief": "",
    "video": "",
    "prodNameEn": "小狗狗1",
    "prodNameCn": "小狗狗1",
    "contentEn": "",
    "contentCn": "

https://img20.360buyimg.com/imgzone/jfs/t1/188624/12/24718/216131/6283adb4Ea0940517/db811f2d5728180f.jpg.avif

", "briefEn": "", "briefCn": "小狗", "pic": "2023/03/df4c106871d14226b01190ca25d420c3.png", "imgs": "2023/03/df4c106871d14226b01190ca25d420c3.png", "preSellStatus": 0, "preSellTime": None, "categoryId": 322, "skuList": [{"price": 50, "oriPrice": 100, "stocks": 20, "skuScore": 1, "properties": "", "skuName": "", "prodName": "", "weight": 1, "volume": 0, "status": 1, "partyCode": "QHJtest005", "prodNameCn": "小狗狗1", "prodNameEn": "小狗狗1"}], "tagList": [21], "content": "", "deliveryTemplateId": 1, "totalStocks": 20, "price": 50, "oriPrice": 100, "deliveryModeVo": {"hasShopDelivery": True, "hasUserPickUp": False, "hasCityDelivery": False}} # 登录 url = 'http://mall.lemonban.com:8108/adminLogin' req_data = {"principal": 'student', "credentials": "123456a", "imageCode": "lemon"} res = requests.request("post", url, json=req_data) token = res.json()["access_token"] # 提交产品 url = "http://mall.lemonban.com:8108/prod/prod" header = {"Authorization": f"bearer{token}"} resp = requests.request("post", url, json=add_product_req_data, headers=header) print(resp.text)

步骤三:把请求数据里面的某些字段(带有随机性质的字段)用函数去生成。

暂时留个空白

三、处理响应接口__(包装响应结果的数据为:key-value)

思考:

1、返回的响应有json数据

2、返回的数据不是json就是个纯文本

对于第二点,返回的数据就是一个纯文本的数据,那么下一个接口就要用这个数据怎么办?怎么去拿到这个数据。

解决方法:我们拿取一个值,用的方法是从字典当中拿取。那么此时,纯文本数据就不是json格式的。这个时候我们就要加上一个key,key可以自由定义名称。以后就靠这个key来取值。

这里,我们定义一个函数,这个函数的作用就是专门用来处理响应。

函数:transfer_resp_text_to_dict

接口自动化【七】__包装响应结果的数据为key-value_第8张图片

 

四、新建商品的流程

1、登录获取token

2、上传一张图片,作为商品图

3、用上传的图片来进行作为新建商品的图片

因此在Excel表格中,完成上面三步的接口,就需要对应的接口数据。

注意:

(1)这个请求数据里面有替换的符号,这个知识点,需要到下个章节讲解,目前这里就是先有个印象。目前Excel表格中的第三个接口,新建商品暂时不能和第二个接口关联上。

(2)除登录之外,以后的每一个接口,都要带上请求头,token。

Excel表格中的请求数据_(从登录,上传图片到新建商品)

req_data
{
    "t": 1685547292565,
    "prodName":"#cur_time#",
    "brief": "",
    "video": "",
    "prodNameEn": "小狗狗1",
    "prodNameCn": "小狗狗1",
    "contentEn": "",
    "contentCn": "

https://img20.360buyimg.com/imgzone/jfs/t1/188624/12/24718/216131/6283adb4Ea0940517/db811f2d5728180f.jpg.avif

",
    "briefEn": "",
    "briefCn": "小狗",
    "pic": "#pic#",
    "imgs": "#pic#",
    "preSellStatus": 0,
    "preSellTime": None,
    "categoryId": 322,
    "skuList": [{"price": 50,
                 "oriPrice": 100,
                 "stocks": 20,
                 "skuScore": 1,
                 "properties": "",
                 "skuName": "",
                 "prodName": "",
                 "weight": 1,
                 "volume": 0,
                 "status": 1,
                 "partyCode": "#cur_time#",
                 "prodNameCn": "小狗狗1",
                 "prodNameEn": "小狗狗1"}],
    "tagList": [21],
    "content": "",
    "deliveryTemplateId": 1,
    "totalStocks": 20,
    "price": 50, "oriPrice": 100,
    "deliveryModeVo": {"hasShopDelivery": True,
                       "hasUserPickUp": False,
                       "hasCityDelivery": False}}

这个表格里面标红的字段,是后面用正则表达式替换。

整体表格的数据展示:

id title url method req_data files extract
0 前置-登录 http://mall.lemonban.com:8108/adminLogin post {"principal": 'student',"credentials": "123456a","imageCode": "lemon"} {"token":"$..access_token"}
1 后台上传图片 http://mall.lemonban.com:8108/admin/file/upload/img post {"file": ("$picture_name", "$picture_path","image/png")}
2 新建商品 http://mall.lemonban.com:8108/prod/prod post {
    "t": 1685547292565,
    "prodName":"#cur_time#",
    "brief": "",
    "video": "",
    "prodNameEn": "小狗狗1",
    "prodNameCn": "小狗狗1",
    "contentEn": "",
    "contentCn": "

https://img20.360buyimg.com/imgzone/jfs/t1/188624/12/24718/216131/6283adb4Ea0940517/db811f2d5728180f.jpg.avif

",
    "briefEn": "",
    "briefCn": "小狗",
    "pic": "#pic#",
    "imgs": "#pic#",
    "preSellStatus": 0,
    "preSellTime": None,
    "categoryId": 322,
    "skuList": [{"price": 50,
                 "oriPrice": 100,
                 "stocks": 20,
                 "skuScore": 1,
                 "properties": "",
                 "skuName": "",
                 "prodName": "",
                 "weight": 1,
                 "volume": 0,
                 "status": 1,
                 "partyCode": "#cur_time#",
                 "prodNameCn": "小狗狗1",
                 "prodNameEn": "小狗狗1"}],
    "tagList": [21],
    "content": "",
    "deliveryTemplateId": 1,
    "totalStocks": 20,
    "price": 50, "oriPrice": 100,
    "deliveryModeVo": {"hasShopDelivery": True,
                       "hasUserPickUp": False,
                       "hasCityDelivery": False}}

接口自动化【七】__包装响应结果的数据为key-value_第9张图片

 

 


总结

这个章节主要理解的点是:

1、对于响应的数据如果不是json格式的字符串,想办法添加一个key。

2、其次在某些字段使用正则表达式来替换。

你可能感兴趣的:(python,pandas,开发语言)