1. 框架封装基础
以下是框架封装的技术基础,打好这些基础的话,能够很轻松地封装出来框架
对于基础还有欠缺的话,建议针对性精进:
1. 扎实的Python语言基础
函数、类
文件读写
处理报错
数据结构
标准库
测试框架库(unittest、pytest)
2. 丰富的接口测试经验
请求方法
请求参数
响应类型
数据的位置、数量
接口关联
数据驱动
3. 良好的代码审美
文件名称
变量名称
代码逻辑
嵌套if或者嵌套for
if和for彼此嵌套
注释和日志记录
4. 优雅的架构设计
yaml文件自动读取
yaml文件自动保存
yaml内容动态替换
兼容单用例测试和数据驱动测试
兼容关联变量和参数化变量
兼容数据提取的位置和顺序
兼容数据的二次处理(类型转换、加密解密、数据库查询)
兼容自定义配置
2. 框架封装目标
pytest+yaml接口自动化测试框架的设计目标有4个:
1.用法简单
测试执行人员仅需编辑yaml文件即可使用框架,完成接口自动化测试
2. 功能丰富
框架应实现以下功能,可供直接使用:
1. 项目配置
2. 接口请求
3. 接口关联
4. 接口断言
5. 数据驱动测试
6. 数据库断言
7. 日志记录
8. 测试报告
9. 其他项目特定需求
3. 维护方便
以下是框架封装的技术基础,打好这些基础的话,能够很轻松地封装出来框架
对于基础还有欠缺的话,建议针对性精进:
4. 扩展性好
用例文件应可以与框架代码分离使用,以便:
为迁移测试平台打好基础
为接口性能测试打好基础
3. 框架文件结构
1. 面向框架维护人员
|--commons # 框架核心,单独维护,和项目用例分离
| |`--cases.py # 加载测试用例
| |`--databases.py # 链接数据库
| |`--exchange.py # 数据交换和注入
| |`--files.py # 文件加载读写
| |`--funcs.py# 热加载函数
| |`--models.py# 定义用例规范
| |`--session.py# 二次开发requests
| |`--settings.py # 加载配置文件
| `--templates.py # 模板引擎
|--requirements.txt# 框架依赖文件
|--run.py # 框架入口文件
2. 面向框架使用人员
|-- data # 数据文件
| |`-- private.pem # rsa 私钥
| `-- public.pem # rsa 公钥
|-- pytest.ini # 配置文件
`-- testcases # yaml用例存放目录
以下文件为自动生成
|-- extract.yaml # 数据提取文件
|-- pytes.log # 日志文件
|-- report # 测试报告
|-- temp # 项目临时文件
4. 框架使用方法
面向框架使用人员
0. 新建空的项目
略
1. 编辑用例文件
title: 登录 # 用例名称
request: # 请求参数
method: POST
url: https://api.tttt.one/rest-v2/login/access_token
json:
email: sanmu@qq.com
password: 123123
extract: # 响应解析
code: [ status_code, (.*), 0 ]
validate:
equals: # 断言相等
状态码断言:
- 422 # 预期状态码
- ${code}# 实际状态码,解析出来的变量
2. 编辑配置文件
[pytest]
# allure报告配置
addopts = --alluredir=temp --clean-alluredir
# 日志文件配置
log_file = pytes.log
log_file_level = info
log_file_format = %(levelname)-8s %(asctime)s [%(name)s:%(lineno)s] : %(message)s
log_file_date_format = %Y-%m-%d %H:%M:%S
3. 启动框架执行用例
框架执行前:只有2个文件,基本符合框架封装目标

框架执行命令:
python D:\api_framework\main.py
框架执行后:

再看具体内容

终端输出

日志文件

临时变量

测试报告
4. 更复杂的用例
feature: 用户相关
story: 注册
title: ${title}# P.1.用例标题使用参数化变量
request:
method: POST
url: ${base_url}/login/sign_up # C.也可以只写/login/sign_up
json:
email: ${email} # P.2.参数使用变量
password: ${str(password)}# P.3. 参数使用变量
extract:
code: [ status_code, (.*), 0 ]# R.1. 提取数据,用于断言或接口关联
validate:
equals: # 断言相等
状态码断言:
- ${assert_code} # P.3. 断言也使用变量
- ${code} # R.2. 使用提前到的变量进行断言
parametrize:
- ["title","email","password","assert_code"]
- ["账号为空","","11111111", 422]
- ["密码均为空","1111111@qq.com","", 422]
- ["账号密码均为空","","", 422]
- ["账号不符合邮箱规则","11111111","1111111", 422]
- ["注册成功","sanmu_01@qqqqqq.com","password", 200 ]
- ["注册成功","sabmu_02@qq.com","password", 200 ]
变量的来源及优先级如下:
C: 配置文件中的变量(全局常量,保存在pytest.ini)
P:参数化中的变量 (DDT,保存在当前文件)
R:接口响应中的变量 (接口关联,保存在extract.yaml)
如果变量相同,根据优先级取值,
如果变量名不同,可相互共存
执行结果

日志文件

测试报告
基本实现框架封装目标!
5. 框架运行流程
面向框架维护人员
1. 加载配置文件
settings.py 在框架中最先被运行,
它会加载pytest.ini中的内容,以便其他代码使用配置
如果对框架编写猴子补丁,可以考虑放在此文件中
2. 加载用例文件
cases.py 文件随后运行,搜索yaml用例文件,并自动交易yaml内容是否用例规范
搜索范围
默认为当前目录及子目录、若要指定自定目录,在配置文件中指定
例如,yaml用例文件在tests目录中,则在pytest.ini添加以下内容
[api_test]
case_path = 'tests'
用例规范
yaml用例【必须】包含以下字段
title: # 用例名称
request: # 请求参数
extract: # 数据提取公式
validate: # 用例断言
根据业务场景,【可选】添加以下字段
feature: # alluer注解
story: # alluer注解
parametrize: # 数据驱动测试
缺少必填字段,校验失败
增加其他字段,自动清除
3. 生成pytest用例
case.py 文件搜索到yaml文件中后,生成pytest用例
在此环节完成数据驱动测试、allure注解
并在pytest用例中定义了接口关联和自定义断言
4. 执行用例
发送请求:session.py
接口关联:exchanger.py
热加载: funcs.py
自定义断言: models.py
5. 生成测试报告
这个没啥好说的,调用allure就是
os.system("allure generate temp -o report --clean")
6. 框架源码下载

不免费提供,有意购买可私聊