07. Ego微商项目接口测试篇
2024年10月28日大约 6 分钟
07. Ego微商项目接口测试篇
1. 接口测试流程
1. 需求分析与评审: 功能的需求文档:PRD
2. 接口文档解析: api:读懂接口规范描述信息
3. 设计测试用例与评审: 依据api文档进行接口用例设计
4. 执行测试用例与缺陷跟踪: 工具:postman/jmeter; 代码:python + request + unittest; java + junit + testNG
5. 编写测试报告及总结: 工具:postman+newman; 代码:第三方库
2. 接口文档解析
1. 什么是接口文档?
1. 由开发人员编写
2. 用来描述软件系统所提供的的接口信息的文档
2. 接口文档内容
3. 小程序授权登录原理【扩展】
作用:
通过小程序获取微信的账号密码(token)信息能够进行和业务后台正常通讯
小程序内部接口(访问微信服务器接口)获取随机码code
小程序的后台通过APPID+APPSecrect+code获取微信的账号密码信息
微信后台通过openid和session_key授予业务后的登录账号信息(转换为token交给小程序)
小程序得到token令牌后,直接通过token结合其他接口参数进行后续接口(业务)的请求
内部接口:wx.login()
业务接口:wx.request()
OpenID :标识用户的唯一性
session_key:标识用户的会话密钥
自定义登录态:用于后续业务逻辑
4. 小程序授权代码调试【扩展】
code只有5分钟有效期
code只要被运行一次, 就失效
code是由小程序和微信客户端内容接口通讯获取(wx.login())
小程序内部接口需要手动获取code
修改获取code接口的代码
控制台打印code
直接结束后续代码执行
不使用时可通过//注释代码
// code是由小程序和微信客户端内容接口通讯获取(wx.login())
// 在‘utils/token.js ’中设置拦截,获取code
getTokenFromServer(callBack) {
var that = this;
wx.login({
success : function (res) {
// console.log("获取的code是: "+res.code);
// return;
wx.request({
url : that.tokenUrl,
method : 'POST',
data:{
code :res.code
},
……
})
}
})
}
3. 接口测试设计
作用:根据解析后的API文档进行用例的设计准备
1. 接口测试设计思路
- 单接口
- 正向功能(有效类): (通过性测试)
- 仅必填参数:必选项
- 全部参数:必选项+全部可选项
- 参数组合:必选项+部分可选项
- 反向测试(无效类): (异常测试)
- 参数异常:参数值、参数类型错误
- 数据异常:多参、少参、无参、错误参数
- 业务数据异常:参数错误
- 正向功能(有效类): (通过性测试)
- 多接口
- 业务场景功能测试:根据用户使用场景将接口连接起来进行测试
- 接口之间数据依赖
2. 接口测试设计步骤
- 熟悉文档
- 熟悉产品需求文档结合API接 口文档确认模块及接口数量
- 解析文档
- 找出API文档中对应接口的基本信息、请求参数、返回数据
- 编写用例
- 根据接口测试用例模板,按照模块及解析后的接口编写用例
3. 接口测试用例评审
- 理解一致
- 确保编写的用例能看懂、能理解、无歧义
- 查漏补缺
- 结合已经编写的用例验证是否有遗 漏、是否有缺陷、是否有错误
- 指导执行
- 执行人员能按照已经编写的测试用 例能直接执行测试并记录结果
4. 接口测试实现 (Postman)
1. 测试实现步骤
1. 初始化设置
2. 测试实现
3. 测试报告
# 完整命令
newman run 用例集文件.json -e 环境文件.json -d 数据文件.json/.csv -r htmlextra --reporter-htmlextra-export 测试报告名.html
-e 和 -d 是 非必须的。
如果没有使用环境,不需要指定 -e
如果没有使用数据文件(做参数化),不需要指定 -d
2. 接口测试实现案例
1. 根据测试用例完成如下接口测试实现
1.轮播图接口
2.专题栏位接口
3.获取token接口
4.创建订单接口
在JavaScript中,对于键值对操作,通过 json对象.key 获取值
如果在断言中,用到了环境变量中的参数值,通过 pm.environment.get("变量名") 获取到对应值
通过 pm.environment.get("变量名") 获取到值的数据类型是字符串,可以强制类型转换
parseInt() 为整数
// 断言响应状态码
pm.test("响应状态码为:200", function () {
pm.response.to.have.status(200);
});
// 断言响应数据(找不变的数据进行断言)
pm.test("响应的ID正确", function () {
var jsonData = pm.response.json();
var id = pm.environment.get("banner_id");
// parseInt(id) 强制类型转换
pm.expect(jsonData.id).to.eql(parseInt(id));
});
pm.test("响应的name正确", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.name).to.eql("首页置顶");
});
// 返回响应对象的数据类型是数组时,可以通过处理长度进行断言
var jsonData = pm.response.json();
// 表示长度等于1 ; .be可以省略
pm.expect(jsonData.length).to.be.eql(1);
// 表示长度大于0
pm.expect(jsonData.length).to.be.above(0);
// 表示长度小于0
pm.expect(jsonData.length).to.be.below(0);
// 返回的响应对的数据时json的字符串时,对于值可变无法判断是,可以通过断言响应体的包含键的关键字
pm.expect(pm.response.text()).to.include("关键词");
2. 根据测试用例完成如下接口测试实现 (部分)
1. 新品接口
2. 商品接口
3. Token验证接口
5. 接口测试实现 (Python+Unittest)
1. 测试实现步骤
1. 项目搭建
2. 初始化设置
初始化设置— 日志函数代码
# 导包 import logging # 初始化日志函数 def init_log(): # 创建日志器 logger = logging.get Logger() logger.set Level(logging.INFO) # 创建控制台处理器 sh = logging.StreamHandler() # 创建文件处理器 log_file = BASE_DIR + "/log/Ego-{}.log".format(time.strftime("%Y-%m-%d %H%M%S")) fh = logging.handlers.TimedRotatingFileHandler(log_file, when='M', interval=1, backupCount=3, encoding='UTF-8')
初始化设置— 日志函数代码2
# 创建格式化器 fmt ="%(asctime)s %(levelname)s [%(name)s] [%(filename)s(%(funcName)s:%(lineno)d)] -%(message)s" formatter = logging.Formatter(fmt) # 将格式化器添加到处理器 sh.setFormatter(formatter) fh.setFormatter(formatter) # 将处理器添加到日志器 logger.addHandler(sh) logger.addHandler(fh)
3. 测试实现
4. 测试报告
2. 注意事项
1. 创建项目名推荐用小驼峰命名法
例如:apiTestXxx
2. 全局使用的配置信息推荐放在app.py文件中 例如:项目路径、域名等信息
3. 日志函数定义后,务必在api/__init__中调用 并通过logging.info()进行测试
4. 处理接口关联时,务必在断言后保存必要结果 例如:token值
2. 案例
- 根据测试用例完成如下接口测试实现
1.轮播图接口
2.专题栏位接口
3.获取token接口
4.创建订单接口
- 根据测试用例完成如下接口测试实现 (部分)
1.新品接口
2.商品接口
3.Token验证接口
3. 工具和代码实现的区别
- 工具
- 简单易上手,适合初学者
- 编写代码量有限
- 代码
- 灵活、多变,适合有一定的代码技能的测试人员
- 编写代码量相比工具较多,但是处理更加高效
没有最好只有更适合