进销存系统
- 进 进货,采购。
- 销 销售出去。
- 存 库存。
供应商管理
添加供应商
接口地址:https://www.72crm.com/api-11/jxcSupplier/addOrUpdate
请求方法:Post
请求头:Admin-Token: 6ee30024b00146029737694d4e409172
请求体:
{"entity":{"supplierName":"小米","supplierLevel":"A","contacts":"雷军","contactNumber":"13688888888","remark":"","address":""},"field":[]}
响应数据:
{"code":0,"msg":"success","data":null}
修改供应商
请求地址:https://www.72crm.com/api-11/jxcSupplier/addOrUpdate
请求方法:Post
请求header:
Admin-Token: 6ee30024b00146029737694d4e409172
请求数据body:
{"entity":{"supplierName":"锤子手机","supplierLevel":"A","contacts":"老罗","contactNumber":"13688888888","remark":"","address":"","detailAddress":"","location":"","lng":"","lat":"","supplierId":"1530372682240425984","batchId":"6bb69cc7563b46118cfd5d75c59f8459"},"field":[]}
返回结果
{"code":0,"msg":"success","data":null}
产品管理
供应商与产品相关联。
采购单
新建采购单
接口测试点
- 采购单编号 唯一
- 关联的接口
- 供应商id 从供应商模块获取。
- 产品id 产品id 一定要跟供应商先关联,关联之后才能使用。
-
操作
采购单编号 唯一。
- postman中,
- Pre-request Script 中编写代码生成随机字符串。
- 使用内置变量生成。 {{$randomWords}} 生成随机字符。
- JMeter中,
- 函数助手,使用 random string 生成。
- postman中,
库存管理
这个模块中跟前面的模块有很多的业务关联,所有在测试时候,这个模块相关联的接口至少有50个。
销售管理
关联的业务模块
- 订单
- CRM系统中的客户。 Mock
- 产品
抓包
Postman中导入
点击【Import】
选择【Raw Text】 粘贴选择的内容。 点击【Continue】
选择【Import】
可以看到已经有数据进来。
点击【Send】可以看到执行结果。
JMeter中导入
从抓包工具中抓到对应的请求,复制下来
打开JMeter,创建线程组,选择线程组 工具—【IMport from CURL】
复制粘贴的请求,点击【Create Test Plan】
可以看到请求已经创建好。
接口串联
在做接口测试的时候。比如 供应商管理,添加供应商,修改供应商。
修改的时候需要传入对应的id。
供应商管理 接口串联
这两个id是创建之后生成的。
根据业务逻辑
接口的顺序
- 新建供应商
- 查询所有供应商 —- 获取到 supplierId 供应商 id
上游接口
- 查看供应商详情 —- 获取到 batchId
上游接口
- 修改供应商 — 使用到 supplierid 、 batchid 这个两个值
下游接口
。Postman 做上下游关联
查询所有供应商 接口中提取变量。
var jsondata = pm.response.json();
pm.globals.set("supplierId",jsondata["data"]["list"][0]["supplierId"]);
查看供应商详情接口中 引用变量,以及提取变量。
var jsondata = pm.response.json();
pm.globals.set("batchid",jsondata["data"]["batchId"]);
附件
上面的操作,可以在下面文件中获取。
进销存.postman_collection.json
JMeter 做上下游参数关联
使用json提取器的方式来提取变量。
添加json 提取器。 设置变量。
引用变量。
提取变量
添加json 提取器
附件
整个业务流程
进销存.jmx
接口断言
postman中的断言
可以将公共部分的断言放在 项目中的 【Tests】
pm.test("返回结果中的code为0", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.code).to.eql(0);
});
pm.test("返回结果中的msg为success", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.msg).to.eql("success");
});
针对具体的业务,根据业务场景添加响应的断言。
根据业务,新建供应商的时候,供应商的名字为 小米,那么在查询供应商接口的时候,第一个供应商的名字我可以非常确定 是 小米。 所以添加断言。
附件
JMeter中添加断言
将公共部分的断言放在 线程组下,针对所有的请求有效。
针对具体的业务添加具体的相关断言。
附件
接口CSV参数化
在做单接口的时候,需要测试接口异常场景。比如创建付款单接口。需要关联采购单id 和 关联对象id。
测试的时候需要考虑异常场景。
分别是 采购单id为空或者为错误的id,关联对象id为空或者为错误的id。
Postman csv 参数化
整理数据到csv文件
接口中使用变量
接口中使用到的具体值设置为变量,变量名跟csv文件中的定义保持一致。
添加断言
因为运行的都是异常场景,我们的接口返回结果都是
{
"code": 500,
"msg": "网络错误,请稍候再试",
"data": null
}
添加对应的断言
pm.test("code值为500", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.code).to.eql(500);
});
pm.test("msg值为网络错误,请稍候再试", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.msg).to.eql("网络错误,请稍候再试");
});
运行
运行需要在Postman中Runner 中执行
上传文件执行。
可以看到断言。
代码附件
JMeter 中使用CSV
准备测试数据
创建CSV文件配置
接口中使用变量
添加断言
运行
因为csv文件中有3条数据, 设置循环次数为3.
执行,可以看到接口。
附件
跨线程组传参
在供应商关联 产品的时候,
- 需要有 供应商
- 需要有 产品
在做这个业务的时候, 关联供应商以及产品接口
供应商,产品 是前提条件。可以将前提条件放在 setup线程组
- setup 线程组 所有的线程组执行之前会先执行。
- teardown 线程组 所有的线程组执行完成之后执行。
setup线程组中创建请求
分别提取变量
将提取的变量设置为属性 beanshell 后置处理器
属性可以在不同的线程组中同时访问。
setup 中将变量设置为 属性。// 获取变量的值 bsh.args[0] 固定写法,代表上面 ${token}的值 String supplerid = bsh.args[0]; // 设置属性 props.put("newsupplerid",supplerid);
线程组中将属性设置为变量
在线程组中添加 beanshell 预处理程序。使用beanshell 代码将属性改为变量。 ```json //获取属性值 String newsupplerid = props.get(“newsupplerid”); // 将属性值转换为变量 vars.put(“supplerid”,newsupplerid);
//获取属性值 String newproductid = props.get(“newproductid”); // 将属性值转换为变量 vars.put(“productid”,newproductid); ```
线程组中引用变量
附件
面试问题
- 举例说明接口是怎么做串联的?
最近我做的这个进销存项目,里面的接口每个业务之间都有关联,比如创建采购单接口,需要关联供应商,以及供应商下面的产品。在做这个接口的时候。
- 创建供应商,查询供应商 —- 获取到供应商的id
- 创建产品, 查询产品 —- 获取到产品的id
- 供应商 和产品关联 — 使用到 供应商id,产品id
- 新建采购单 —- 使用到供应商id,产品id
在做的时候,我使用的工具是 Postman 或者 Jmeter (二选一)
Postman
在Tests 面板中,通过postman 中内置的代码 设置全局变量 或者环境变量。
需要用到产品id 供应商id的时候 通过{{}} 来引用变量传参。
JMeter
在对应的接口商使用json 提取器,将结果提取出来。设置为变量
需要用到产品id 供应商id的时候 通过${} 来引用变量传参。
- 接口断言是怎么做的?
我们这个系统接口返回的结果格式是比较同样的。比如成功的结果,都有 code 值为0 ,msg 值为 success,所以这些公共的断言,我们在做的时候放在
postman 放在集合的统一 Tests中
jmeter 放在线程组下面。
一些特殊的业务,比如我们在做接口串联的时候,新建一个供应商的名字为 苹果,在查询供应商接口中,返回的结果第一个供应商的名字一定为 苹果,可以针对这个接口 单独在添加第一个供应商名字为苹果的断言。
- 接口参数化是怎么做的?
在做接口测试的时候, 我们正常业务流程需要考虑之外,对接口的异常场景也需要进行测试,针对单接口测试。可以使用Postman或者JMeter 工具。
根据业务将主要的字段添加准备不同的测试数据,准备好之后放在csv文件中。
在接口中具体引用值的时候使用变量,变量名跟csv文件中配置的表头字段保持一致。
针对异样场景的数据添加对应的断言。
运行的时候,Postman在runner中 上传csv文件执行。
jmeter 中创建CSV文件配置,配置csv文件之后根据csv文件中数据的多少,在线程组中设置循环次数来执行。
执行完成之后可以看到对应的结果。
- 接口的跨线程组传参如何做?
先将上游接口放在SetUp 线程组中, 使用json提取器将要传递的参数设置为变量。
在setUp线程组中使用 beanshell 后置处理器 将提取的变量设置为 属性。(或者使用 函数中的的setProperty 将值设置属性)
下游的线程组中使用 beanshll前置处理器 用代码的方式将属性设置为变量。(或者使用函数助手中的porperty将属性设置为变量)
请求中通过使用 ${} 的方式来引用变量即可。
思维导图
其他资料
参考
https://pear-fall-0cf.notion.site/2022-03-520e52d993db47daadda2932b24e538d