以下是框架封装的技术基础,打好这些基础的话,能够很轻松地封装出来框架
对于基础还有欠缺的话,建议针对性精进:
函数、类
文件读写
处理报错
数据结构
标准库
测试框架库(unittest、pytest)
请求方法
请求参数
响应类型
数据的位置、数量
接口关联
数据驱动
文件名称
变量名称
代码逻辑
嵌套if或者嵌套for
if和for彼此嵌套
注释和日志记录
yaml文件自动读取
yaml文件自动保存
yaml内容动态替换
兼容单用例测试和数据驱动测试
兼容关联变量和参数化变量
兼容数据提取的位置和顺序
兼容数据的二次处理(类型转换、加密解密、数据库查询)
兼容自定义配置
pytest+yaml接口自动化测试框架的设计目标有4个:
测试执行人员仅需编辑yaml文件即可使用框架,完成接口自动化测试
框架应实现以下功能,可供直接使用:
1. 项目配置
2. 接口请求
3. 接口关联
4. 接口断言
5. 数据驱动测试
6. 数据库断言
7. 日志记录
8. 测试报告
9. 其他项目特定需求
以下是框架封装的技术基础,打好这些基础的话,能够很轻松地封装出来框架
对于基础还有欠缺的话,建议针对性精进:
用例文件应可以与框架代码分离使用,以便:
为迁移测试平台打好基础
为接口性能测试打好基础
|--commons # 框架核心,单独维护,和项目用例分离
| |`--cases.py # 加载测试用例
| |`--databases.py # 链接数据库
| |`--exchange.py # 数据交换和注入
| |`--files.py # 文件加载读写
| |`--funcs.py# 热加载函数
| |`--models.py# 定义用例规范
| |`--session.py# 二次开发requests
| |`--settings.py # 加载配置文件
| `--templates.py # 模板引擎
|--requirements.txt# 框架依赖文件
|--run.py # 框架入口文件
|-- data # 数据文件
| |`-- private.pem # rsa 私钥
| `-- public.pem # rsa 公钥
|-- pytest.ini # 配置文件
`-- testcases # yaml用例存放目录
以下文件为自动生成
|-- extract.yaml # 数据提取文件
|-- pytes.log # 日志文件
|-- report # 测试报告
|-- temp # 项目临时文件
面向框架使用人员
略
title: 登录 # 用例名称
request: # 请求参数
method: POST
url: https://api.tttt.one/rest-v2/login/access_token
json:
email: [email protected]
password: 123123
extract: # 响应解析
code: [ status_code, (.*), 0 ]
validate:
equals: # 断言相等
状态码断言:
- 422 # 预期状态码
- ${code}# 实际状态码,解析出来的变量
[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
框架执行前:只有2个文件,基本符合框架封装目标
框架执行命令:
python D:\api_framework\main.py
框架执行后:
再看具体内容
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]
- ["密码均为空","[email protected]","", 422]
- ["账号密码均为空","","", 422]
- ["账号不符合邮箱规则","11111111","1111111", 422]
- ["注册成功","[email protected]","password", 200 ]
- ["注册成功","[email protected]","password", 200 ]
变量的来源及优先级如下:
C: 配置文件中的变量(全局常量,保存在pytest.ini)
P:参数化中的变量 (DDT,保存在当前文件)
R:接口响应中的变量 (接口关联,保存在extract.yaml)
如果变量相同,根据优先级取值,
如果变量名不同,可相互共存
执行结果
基本实现框架封装目标!
面向框架维护人员
settings.py 在框架中最先被运行,
它会加载pytest.ini中的内容,以便其他代码使用配置
如果对框架编写猴子补丁,可以考虑放在此文件中
cases.py 文件随后运行,搜索yaml用例文件,并自动交易yaml内容是否用例规范
搜索范围
默认为当前目录及子目录、若要指定自定目录,在配置文件中指定
例如,yaml用例文件在tests目录中,则在pytest.ini添加以下内容
[api_test]
case_path = 'tests'
用例规范
yaml用例【必须】包含以下字段
title: # 用例名称
request: # 请求参数
extract: # 数据提取公式
validate: # 用例断言
根据业务场景,【可选】添加以下字段
feature: # alluer注解
story: # alluer注解
parametrize: # 数据驱动测试
缺少必填字段,校验失败
增加其他字段,自动清除
case.py 文件搜索到yaml文件中后,生成pytest用例
在此环节完成数据驱动测试、allure注解
并在pytest用例中定义了接口关联和自定义断言
发送请求:session.py
接口关联:exchanger.py
热加载: funcs.py
自定义断言: models.py
这个没啥好说的,调用allure就是
os.system("allure generate temp -o report --clean")
不免费提供,有意购买可私聊