早在之前对postman的功能都用得很熟,也经常用来做简单的接口管理、自动化测试和数据准备。本篇打算分享一下用postman做测试数据准备的案例

前言

在测试数据准备阶段,经常有那种需要大数据量的测试场景,而如何快速构建这种场景,通常有两种手段:
1、直接在数据库批量写入
2、重复调用现有接口来写入
前者对伪造数据的要求处理反而复杂,尤其是和业务相关的数据,比如现在需要添加40个达人到监控列表,写SQL代码则要求知道有效的达人ID,而这部分达人ID的来源就显得难处理。所以这里我用Postman来做几个场景的测试数据构建演示,用Postman会是这件事变得简单很多

运作介绍

Postman有一个Runner功能,允许全部、几组或一个接口通过数据文件进行批量跑数据,Runner会每次读取一个数据传递给接口,使得接口每次接收到的参数不重复。

运作流程

Postman里对一个项目的全部接口就是一个Collection(集合),接口分组则是用folder(文件夹)
1、(可选)对接口配置参数变量
2、(可选)对接口配置断言
3、选择Run folder
4、选择需要运行的接口
5、配置Run参数:运行次数Iterations、运行间隔时间Delay(20ms即可,主要是防止执行太快可能导致失败)、选择数据文件,如果这里选择数据文件有效,而第三步会自动替换为数据文件的数据量(即Postman默认按数据文件的数据量作为运行次数)
6、点击Run进行

其中第5步需要注意的是,Postman接收的文件格式为csv、json两种格式
两种格式的区别在于文件的组织结构不同,CSV规范见:https://www.csvreader.com/csv_format.php
一个简单的csv文件源码示例,即一行一组数据:

编号,姓名,性别
1,lonelylylizard,男
2,sumver,女
3,cal,未知

而使用json格式,格式并不是{"data":[{},{}...{}]},Postman要求传递的json仅为data数据部分,即
要求json里的数据结构为:[{},{},...{}]
postman里正确的json格式数据:

[
  {
    "id":1,
    "name":"lonelylylizard",
    "sex":"男"
  },
    {
    "id":2,
    "name":"sumver",
    "sex":"女"
  },
    {
    "id":3,
    "name":"cal",
    "sex":"未知"
    }
]

关于csv和json格式的使用陷阱

1、csv文件需要有表头

postman读取csv时,会跳过第一行(第一行被当做表头),为此正确的csv需要添加表头
正确csv:

编号,姓名,性别
1,lonelylylizard,男
2,sumver,女
3,cal,未知

错误csv,这样读取会少一行数据:

1,lonelylylizard,男
2,sumver,女
3,cal,未知

2、大数值精度问题

有以下csv和json数据作为数据源,这两组数据在运行时是否有出问题?

id,name
9007199254740992,lonelylylizard
9007199254740993,sumver
9007199254740992239,cal
[
  {
    "id":9007199254740992,
    "name":"lonelylylizard"
  },
    {
    "id":9007199254740993,
    "name":"sumver"
  },
    {
    "id":9007199254740992239,
    "name":"cal"
    }
]

咋一看,都是正确的格式,但是实际上读取到的ID有出现错误,这是因为postman把传递的ID当做int处理,而js中int最大可表示的值=9 007 199 254 740 992,超出则会出现精度丢失

注意事项-精度问题.png

要避免这个精度丢失问题,就需要把让postman把id识别为字符串,
那么json数据对ID的值加双引号

[
  {
    "id":"9007199254740992",
    "name":"lonelylylizard"
  },
    {
    "id":"9007199254740993",
    "name":"sumver"
  },
    {
    "id":"9007199254740992239",
    "name":"cal"
    }
]

而转为字符串,CSV是无能为力的,因为CSV格式规范简单,需要Postman去兼容

测试场景

注,这个示例有断言部分,如果只是单纯批量添加数据,断言不是必须的,可以去掉

产品要求:单个账户监控列表最多添加50个达人
从yapi上得到的接口数据:

添加达人监控接口:https://**/api/v1/feed/monitor/add
json参数{"type":2,"data_id":达人数据ID,"collect_id":达人ID}

接口参数要求达人数据ID和达人ID,我们从任意榜单的响应数据看是否有这两个数据
这里找了潜力榜的接口,看了一下,确实有我们要的字段

接口信息.png

接着取该榜单取3页(一页20条),如图所示方式复制达人信息,
例如,取潜力榜前3页,复制达人数据拼接为一个json

接口信息2.png

注意拼接的时候,最终文件内格式为[{},{},...{}]
拼接我举个例子:

[
    {
    "id":1,
    "name":"abc"
    },
    {
    "id":2,
    "name":"def"
    }
]
[
    {
    "id":3,
    "name":"hij"
    },
    {
    "id":4,
    "name":"klm"
    }
]
[
    {
    "id":1,
    "name":"abc"
    },
    {
    "id":2,
    "name":"def"
    },
      {
    "id":3,
    "name":"hij"
    },
    {
    "id":4,
    "name":"klm"
    }
]

最后把拼接后的json保存为xxx.json文件即可
如果postman提示文件读取不了,说明你的json格式有误,需要检查更正

拿到数据源后,开始在postman里新建接口
传递的body数据如下,,双花括号在postman中表示变量:

{"type":2,"data_id":"{{id}}","collect_id":"{{unique_id}}"}

在运行结果Tests写断言代码

pm.test("Status code is 200", function () {
    pm.response.to.have.status(200);
});
pm.test("message is success", function () {
    var jsonData = pm.response.json();
    pm.expect(jsonData.msg).to.eql("success");
});

编写好的接口如下图所示

写好的接口示例.png

接下来就行配置Runner,如图所示

postman run示例.png

按我们理想的情况,数据文件有60条数据,接口每次断言200和返回信息是否为success两种情况,所以一共有120个断言接口,业务要求最多添加50个,剩下的10个断言会是200成功,字段断言失败,即有110个断言成功,10个断言失败

断言结果分析.png

检查一下页面,OK,数据都有了。至此,测试数据准备完毕

查看界面 (2).png

后话

批量跑数据这种场景在很多系统都会遇到,比如该tik**系统中的收藏、取消收藏视频/音乐/达人/商品,添加、移除监控。
示例场景(仅示例,非真实业务):
1、假如监控列表开放到200个达人
2、收藏商品当超过99个时,气泡显示99+
3、分页大小、分页数据校验