目录
- 被测产品
- 需求说明
- 相关知识点
- 接口自动化测试实战
被测产品
- PetStore 宠物商城:
- 一个在线的小型的商城。
- 主要提供了增删查改等操作接口。
- 结合 Swagger 实现了接口的管理。
需求说明
- 完成宠物商城宠物管理功能接口自动化测试。
- 编写自动化测试脚本。
- 完成复杂断言。
相关知识点
形式 | 章节 | 描述 | |
---|---|---|---|
知识点 | 代理配置 | 利用代理分析测试脚本,排查请求错误 | |
知识点 | 多层嵌套响应断言 | 利用 jsonpath 进行多层嵌套的响应断言 |
实战思路
@startmindmap
scale 10
* 实战思路
** 需求分析
** 接口测试用例设计
** 编写接口自动化测试脚本
*** 脚本优化-配置代理查看接口数据
*** 脚本优化-添加日志
*** 脚本优化-使用 jsonpath 断言
** 生成测试报告
@endmindmap
需求分析
- 被测产品:宠物商店系统 - 宠物管理。
- 宠物商店接口文档:https://petstore.swagger.io/
- 宠物管理业务场景:
- 添加宠物。
- 查询宠物信息。
- 修改宠物信息。
- 删除宠物。
scale 10
autonumber
participant 测试人员 as tester
participant 宠物管理模块 as pet
participant 宠物商店 as petStore
tester -> pet: 编写脚本
pet -> petStore: 添加宠物
pet -> petStore: 查询添加后宠物
customer -> tester: 测试断言
pet -> petStore: 修改宠物信息
pet -> petStore: 查询添加后宠物
customer -> tester: 测试断言
pet -> petStore: 删除宠物
pet -> petStore: 查询添加后宠物
customer -> tester: 测试断言
宠物管理接口业务流程测试用例
编写自动化测试脚本思路
@startmindmap
scale 10
* 思路
** 获取接口信息
*** swagger 接口文档
*** 前端抓包
** 单步调通接口
** 根据业务流程串联起来
** 添加断言,确认流程正常
@endmindmap
编写自动化测试脚本
class TestPetstorePetmanager:
def setup_class(self):
self.base_url = "https://petstore.swagger.io/v2/pet"
self.search_url = self.base_url + "/findByStatus"
self.pet_id = 9223372000001084222
pet_status = "available"
self.pet_info = {
"id": self.pet_id,
"category": {
"id": 1,
"name": "cat"
},
"name": "miao",
"photoUrls": [
"string"
],
"tags": [
{
"id": 5,
"name": "cute"
}
],
"status": pet_status
}
self.search_param = {
"status": pet_status
}
self.update_name = "miao-hogwarts"
self.update_info = {
"id": self.pet_id,
"category": {
"id": 1,
"name": "cat"
},
"name": self.update_name,
"photoUrls": [
"string"
],
"tags": [
{
"id": 5,
"name": "cute"
}
],
"status": pet_status
}
self.delete_url = self.base_url + f"/{self.pet_id}"
def test_pet_manager(self):
# 新增宠物
add_r = requests.post(self.base_url, json=self.pet_info)
# 状态断言
assert add_r.status_code == 200
# 修改宠物
update_r = requests.put(self.base_url, json=self.update_info)
# 状态断言
assert update_r.status_code == 200
# 删除宠物
delete_r =requests.delete(self.delete_url)
# 状态断言
assert delete_r.status_code == 200
脚本优化 - 配置代理查看接口数据
- 在脚本中配置代理。
- 抓包查看接口测试中的接口请求和响应数据。
proxy = {
"http": "http://127.0.0.1:8888",
"https": "http://127.0.0.1:8888"
}
requests.post(url, json=pet_info, proxies=proxy, verify=False)
脚本优化 - 添加日志
- 新建日志配置。
- 在用例中使用配置好的日志实例。
# 配置日志
import logging
import os
from logging.handlers import RotatingFileHandler
# 绑定绑定句柄到logger对象
logger = logging.getLogger(__name__)
# 获取当前工具文件所在的路径
root_path = os.path.dirname(os.path.abspath(__file__))
# 拼接当前要输出日志的路径
log_dir_path = os.sep.join([root_path, '..', f'/logs'])
if not os.path.isdir(log_dir_path):
os.mkdir(log_dir_path)
# 创建日志记录器,指明日志保存路径,每个日志的大小,保存日志的上限
file_log_handler = RotatingFileHandler(os.sep.join([log_dir_path, 'log.log']), maxBytes=1024 * 1024, backupCount=10)
# 设置日志的格式
date_string = '%Y-%m-%d %H:%M:%S'
formatter = logging.Formatter(
'[%(asctime)s] [%(levelname)s] [%(filename)s]/[line: %(lineno)d]/[%(funcName)s] %(message)s ', date_string)
# 日志输出到控制台的句柄
stream_handler = logging.StreamHandler()
# 将日志记录器指定日志的格式
file_log_handler.setFormatter(formatter)
stream_handler.setFormatter(formatter)
# 为全局的日志工具对象添加日志记录器
# 绑定绑定句柄到logger对象
logger.addHandler(stream_handler)
logger.addHandler(file_log_handler)
# 设置日志输出级别
logger.setLevel(level=logging.INFO)
脚本优化 - 使用 jsonpath 断言
- 使用 jsonpath 实现多层嵌套响应的断言。
jsonpath.jsonpath(r.json(), "$..id")
生成测试报告
- 安装 allure 相关依赖。
# 生成报告信息
pytest --alluredir=./report
# 生成报告在线服务,查看报告
allure serve ./report/
总结
- 通过 Swagger 文档获取接口信息。
- 使用 Requests 发出请求。
- 添加代理,抓包查看接口请求和响应数据。
- 使用 Jsonpath 提取复杂结构响应数据,然后进行断言。
- 添加 Log 日志。
- 生成 Allure 测试报告。