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个文件,基本符合框架封装目标




pytest yaml pytest yaml csv用例封装_用例


框架执行命令:

python D:\api_framework\main.py

框架执行后:


pytest yaml pytest yaml csv用例封装_Powered by 金山文档_02


再看具体内容


pytest yaml pytest yaml csv用例封装_Powered by 金山文档_03


终端输出


pytest yaml pytest yaml csv用例封装_pytest yaml_04


日志文件


pytest yaml pytest yaml csv用例封装_pytest_05


临时变量


pytest yaml pytest yaml csv用例封装_python_06


测试报告


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 ]

变量的来源及优先级如下:

  1. C: 配置文件中的变量(全局常量,保存在pytest.ini)
  2. P:参数化中的变量 (DDT,保存在当前文件)
  3. R:接口响应中的变量 (接口关联,保存在extract.yaml)

如果变量相同,根据优先级取值,

如果变量名不同,可相互共存

执行结果


pytest yaml pytest yaml csv用例封装_pytest yaml_07


日志文件


pytest yaml pytest yaml csv用例封装_pytest_08


测试报告


基本实现框架封装目标!

5. 框架运行流程


面向框架维护人员

1. 加载配置文件

settings.py 在框架中最先被运行,

它会加载pytest.ini中的内容,以便其他代码使用配置

如果对框架编写猴子补丁,可以考虑放在此文件中

2. 加载用例文件

cases.py 文件随后运行,搜索yaml用例文件,并自动交易yaml内容是否用例规范

  1. 搜索范围

默认为当前目录及子目录、若要指定自定目录,在配置文件中指定

例如,yaml用例文件在tests目录中,则在pytest.ini添加以下内容

[api_test]
 case_path = 'tests'
  1. 用例规范

yaml用例【必须】包含以下字段

title:  # 用例名称
request: # 请求参数
extract: # 数据提取公式
validate: # 用例断言

根据业务场景,【可选】添加以下字段

feature: # alluer注解
story: # alluer注解
parametrize: # 数据驱动测试

缺少必填字段,校验失败

增加其他字段,自动清除

3. 生成pytest用例

case.py 文件搜索到yaml文件中后,生成pytest用例

在此环节完成数据驱动测试、allure注解

并在pytest用例中定义了接口关联和自定义断言

4. 执行用例

  1. 发送请求:session.py
  2. 接口关联:exchanger.py
  3. 热加载: funcs.py
  4. 自定义断言: models.py

5. 生成测试报告

这个没啥好说的,调用allure就是

os.system("allure generate temp -o report --clean")

6. 框架源码下载



pytest yaml pytest yaml csv用例封装_python_09