进销存系统

  • 进 进货,采购。
  • 销 销售出去。
  • 存 库存。

image.png

供应商管理

添加供应商

接口地址:https://www.72crm.com/api-11/jxcSupplier/addOrUpdate
请求方法:Post
请求头:Admin-Token: 6ee30024b00146029737694d4e409172
请求体:

  1. {"entity":{"supplierName":"小米","supplierLevel":"A","contacts":"雷军","contactNumber":"13688888888","remark":"","address":""},"field":[]}

响应数据:

  1. {"code":0,"msg":"success","data":null}

修改供应商

请求地址:https://www.72crm.com/api-11/jxcSupplier/addOrUpdate
请求方法:Post
请求header:
Admin-Token: 6ee30024b00146029737694d4e409172
请求数据body:

  1. {"entity":{"supplierName":"锤子手机","supplierLevel":"A","contacts":"老罗","contactNumber":"13688888888","remark":"","address":"","detailAddress":"","location":"","lng":"","lat":"","supplierId":"1530372682240425984","batchId":"6bb69cc7563b46118cfd5d75c59f8459"},"field":[]}

返回结果

  1. {"code":0,"msg":"success","data":null}

产品管理

供应商与产品相关联。
image.png

采购单

采购订单.png
新建采购单
image.png
接口测试点

  1. 采购单编号 唯一
  2. 关联的接口
    1. 供应商id 从供应商模块获取。
    2. 产品id 产品id 一定要跟供应商先关联,关联之后才能使用。
  3. 审批流程

    操作

  4. 采购单编号 唯一。

    1. postman中,
      1. Pre-request Script 中编写代码生成随机字符串。
      2. 使用内置变量生成。 {{$randomWords}} 生成随机字符。
    2. JMeter中,
      1. 函数助手,使用 random string 生成。 image.png

库存管理

库存管理.png
这个模块中跟前面的模块有很多的业务关联,所有在测试时候,这个模块相关联的接口至少有50个。
image.png

销售管理

销售管理.png
关联的业务模块

  • 订单
  • CRM系统中的客户。 Mock
  • 产品

抓包

通过使用浏览器的开发者工具进行抓包
image.png
抓包之后,复制请求。
image.png

Postman中导入

点击【Import】
image.png
选择【Raw Text】 粘贴选择的内容。 点击【Continue】
image.png
选择【Import】
image.png
可以看到已经有数据进来。
image.png
点击【Send】可以看到执行结果。
image.png

JMeter中导入

从抓包工具中抓到对应的请求,复制下来
image.png

打开JMeter,创建线程组,选择线程组 工具—【IMport from CURL】
image.png
复制粘贴的请求,点击【Create Test Plan】
image.png
可以看到请求已经创建好。
image.png

接口串联

在做接口测试的时候。比如 供应商管理,添加供应商,修改供应商。
修改的时候需要传入对应的id。

供应商管理 接口串联

image.png
这两个id是创建之后生成的。
根据业务逻辑
接口的顺序

  1. 新建供应商
  2. 查询所有供应商 —- 获取到 supplierId 供应商 id 上游接口
  3. 查看供应商详情 —- 获取到 batchId 上游接口
  4. 修改供应商 — 使用到 supplierid 、 batchid 这个两个值 下游接口

    Postman 做上下游关联


image.png
查询所有供应商 接口中提取变量。

  1. var jsondata = pm.response.json();
  2. pm.globals.set("supplierId",jsondata["data"]["list"][0]["supplierId"]);

查看供应商详情接口中 引用变量,以及提取变量。
image.png

  1. var jsondata = pm.response.json();
  2. pm.globals.set("batchid",jsondata["data"]["batchId"]);

修改供应商中使用这两个值
引用变量。
image.png

附件

上面的操作,可以在下面文件中获取。
进销存.postman_collection.json


JMeter 做上下游参数关联

使用json提取器的方式来提取变量。
image.png
添加json 提取器。 设置变量。
image.png
引用变量。
image.png
提取变量
image.png
添加json 提取器
image.png

修改供应商接口中引用变量。
image.png

附件

整个业务流程
进销存.jmx

接口断言

postman中的断言

可以将公共部分的断言放在 项目中的 【Tests】

  1. pm.test("返回结果中的code为0", function () {
  2. var jsonData = pm.response.json();
  3. pm.expect(jsonData.code).to.eql(0);
  4. });
  5. pm.test("返回结果中的msg为success", function () {
  6. var jsonData = pm.response.json();
  7. pm.expect(jsonData.msg).to.eql("success");
  8. });

image.png
针对具体的业务,根据业务场景添加响应的断言。
根据业务,新建供应商的时候,供应商的名字为 小米,那么在查询供应商接口的时候,第一个供应商的名字我可以非常确定 是 小米。 所以添加断言。
image.png

附件

进销存.postman_collection.json

JMeter中添加断言

将公共部分的断言放在 线程组下,针对所有的请求有效。
image.png
针对具体的业务添加具体的相关断言。
image.png

附件

进销存.jmx

接口CSV参数化

在做单接口的时候,需要测试接口异常场景。比如创建付款单接口。需要关联采购单id 和 关联对象id。
测试的时候需要考虑异常场景。
分别是 采购单id为空或者为错误的id,关联对象id为空或者为错误的id。

Postman csv 参数化

整理数据到csv文件

image.png
文件
testdata.csv

接口中使用变量

接口中使用到的具体值设置为变量,变量名跟csv文件中的定义保持一致。
image.png

添加断言

因为运行的都是异常场景,我们的接口返回结果都是

  1. {
  2. "code": 500,
  3. "msg": "网络错误,请稍候再试",
  4. "data": null
  5. }

添加对应的断言

  1. pm.test("code值为500", function () {
  2. var jsonData = pm.response.json();
  3. pm.expect(jsonData.code).to.eql(500);
  4. });
  5. pm.test("msg值为网络错误,请稍候再试", function () {
  6. var jsonData = pm.response.json();
  7. pm.expect(jsonData.msg).to.eql("网络错误,请稍候再试");
  8. });

image.png

运行

运行需要在Postman中Runner 中执行
image.png
上传文件执行。
可以看到断言。
image.png

代码附件

进销存.postman_collection.json

JMeter 中使用CSV

准备测试数据

image.png
文件
testdata.csv

创建CSV文件配置

image.png
选择文件路径。
设置变量名称。

接口中使用变量

image.png

添加断言

image.png

运行

因为csv文件中有3条数据, 设置循环次数为3.
image.png
执行,可以看到接口。
image.png

附件

进销存.jmx

跨线程组传参

在供应商关联 产品的时候,

  • 需要有 供应商
  • 需要有 产品

image.png
在做这个业务的时候, 关联供应商以及产品接口
供应商,产品 是前提条件。可以将前提条件放在 setup线程组
image.png

  • setup 线程组 所有的线程组执行之前会先执行。
  • teardown 线程组 所有的线程组执行完成之后执行。

    setup线程组中创建请求

    分别提取变量
    image.png

    将提取的变量设置为属性 beanshell 后置处理器

    属性可以在不同的线程组中同时访问。
    image.png
    // 获取变量的值 bsh.args[0] 固定写法,代表上面 ${token}的值
    String supplerid = bsh.args[0];
    // 设置属性
    props.put("newsupplerid",supplerid);
    
    setup 中将变量设置为 属性。

    线程组中将属性设置为变量

    在线程组中添加 beanshell 预处理程序。使用beanshell 代码将属性改为变量。 ```json //获取属性值 String newsupplerid = props.get(“newsupplerid”); // 将属性值转换为变量 vars.put(“supplerid”,newsupplerid);

//获取属性值 String newproductid = props.get(“newproductid”); // 将属性值转换为变量 vars.put(“productid”,newproductid); ``` image.png

线程组中引用变量

image.png
运行可以看到结果
image.png

附件

进销存.jmx

面试问题

  1. 举例说明接口是怎么做串联的?

最近我做的这个进销存项目,里面的接口每个业务之间都有关联,比如创建采购单接口,需要关联供应商,以及供应商下面的产品。在做这个接口的时候。

  • 创建供应商,查询供应商 —- 获取到供应商的id
  • 创建产品, 查询产品 —- 获取到产品的id
  • 供应商 和产品关联 — 使用到 供应商id,产品id
  • 新建采购单 —- 使用到供应商id,产品id

在做的时候,我使用的工具是 Postman 或者 Jmeter (二选一)
Postman
在Tests 面板中,通过postman 中内置的代码 设置全局变量 或者环境变量。
需要用到产品id 供应商id的时候 通过{{}} 来引用变量传参。
JMeter
在对应的接口商使用json 提取器,将结果提取出来。设置为变量
需要用到产品id 供应商id的时候 通过${} 来引用变量传参。

  1. 接口断言是怎么做的?

我们这个系统接口返回的结果格式是比较同样的。比如成功的结果,都有 code 值为0 ,msg 值为 success,所以这些公共的断言,我们在做的时候放在
postman 放在集合的统一 Tests中
jmeter 放在线程组下面。
一些特殊的业务,比如我们在做接口串联的时候,新建一个供应商的名字为 苹果,在查询供应商接口中,返回的结果第一个供应商的名字一定为 苹果,可以针对这个接口 单独在添加第一个供应商名字为苹果的断言。

  1. 接口参数化是怎么做的?

在做接口测试的时候, 我们正常业务流程需要考虑之外,对接口的异常场景也需要进行测试,针对单接口测试。可以使用Postman或者JMeter 工具。
根据业务将主要的字段添加准备不同的测试数据,准备好之后放在csv文件中。
在接口中具体引用值的时候使用变量,变量名跟csv文件中配置的表头字段保持一致。
针对异样场景的数据添加对应的断言。
运行的时候,Postman在runner中 上传csv文件执行。
jmeter 中创建CSV文件配置,配置csv文件之后根据csv文件中数据的多少,在线程组中设置循环次数来执行。
执行完成之后可以看到对应的结果。

  1. 接口的跨线程组传参如何做?

先将上游接口放在SetUp 线程组中, 使用json提取器将要传递的参数设置为变量。
在setUp线程组中使用 beanshell 后置处理器 将提取的变量设置为 属性。(或者使用 函数中的的setProperty 将值设置属性)
下游的线程组中使用 beanshll前置处理器 用代码的方式将属性设置为变量。(或者使用函数助手中的porperty将属性设置为变量)
请求中通过使用 ${} 的方式来引用变量即可。

思维导图

进销存系统.xmind

其他资料

参考
https://pear-fall-0cf.notion.site/2022-03-520e52d993db47daadda2932b24e538d