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. 框架源码下载