pytest + yaml 框架 - 1.我们发布上线了!

前言

基于 httprunner 框架的用例结构,我自己开发了一个pytest + yaml 的框架,那么是不是重复造轮子呢?
不可否认 httprunner 框架设计非常优秀,但是也有缺点,httprunner3.x的版本虽然也是基于pytest框架设计,结合yaml执行用例,但是会生成一个py文件去执行。
在辅助函数的引用也很局限,只能获取函数的返回值,不能在yaml中对返回值重新二次取值。
那么我的这个框架,就是为了解决这些痛点。。。。

环境准备

Python 3.8版本
Pytest 7.2.0 最新版

pip 安装插件

pip install pytest-yaml-yoyo

本插件的优势是只需一个pip安装即可使用,无需额外的代码,插件相关功能:

  • 1、基于 pytest 框架安装插件即可使用,环境非常简单
  • 2、只需要写 yaml 文件用例即可运行,使用 pytest 运行的命令
  • 3、yaml 文件中支持定义变量 与 引用变量
  • 4、extract 功能实现多个接口步骤的参数关联
  • 5、全局仅 base_url 功能,yaml 中写相对路径即可
  • 6、全局仅登录一次,在用例中自动在请求头部添加 Authorization token认证
  • 7、用例参数化 parameters 功能实现
  • 8、yaml 中调用 fixture 功能实现
  • 9、yaml 中支持自定义函数调用
  • 10、yaml 中调用 hooks 功能(sign签名与加解密)
  • 11、用例分层机制:API和用例层
  • 12、支持 logging 日志
  • 13、支持 allure 报告
  • 14、支持 mysql 数据库增删改查
  • 15、支持钉钉机器人通知测试结果和 allure 报告地址
  • 16、支持生成随机测试数据,如字符串,姓名,手机号,邮箱等
  • 17、根据 swagger.json 自动生成 yaml 文件接口用例
  • 18、支持全局代理配置
  • 19、全局配置 env 多套环境切换
  • 20、CLI 执行用例,完全适配持续集成 CI/CD 流程
  • 21、export 导出全局变量 (VIP 付费功能)
  • 22、飞书群/企业微信群机器人通知 (VIP 付费功能)
  • 23、引用变量支持过滤器的使用 (VIP 付费功能)
  • 24、mark 对用例标记功能 (VIP 付费功能)
  • 25、runtime 断言用例运行时长 (VIP 付费功能)
  • 26、录制自动生成 yaml 用例 (VIP 付费功能)
  • 27、mock 拦截请求自定义返回 (VIP 付费功能)
  • 28、parameters参数化支持模块级别和用例级别,支持笛卡尔积 (VIP 付费功能)
  • 29、新增仅收集用例失败错误信息和log日志(VIP 付费功能)
  • 30、allure报告自定义内容 (VIP 付费功能)
  • 31、redis 数据库支持 (VIP 付费功能)
  • 32、websocket 协议支持 (VIP 付费功能)

第一个 helloworld

yaml 用例编写规则,跟pytest识别默认规则一样,必须是test 开头的,以.yml 结尾的文件才会被识别

新建一个test_hello.yml文件

config:
  name: yy

teststeps:
-
  name: demo
  print: hello world

用例整体结构延续了httprunner框架的用例结构,主要是为了大家快速上手,减少新的规则学习

  • config 是必须的里面必须有name 用例名称,base_url 和 variables 是可选的
  • teststeps 用例的步骤,用例步骤是一个array 数组类型,可以有多个步骤

从上面的运行可以看出,request 不是必须的,我们可以直接调用python内置函数print 去打印一些内容了。

一个简单的 http 请求

http://www.example.com/ get 请求示例
test_get_demo.yml

config:
  name: get

teststeps:
-
  name: get
  request:
    method: GET
    url: http://httpbin.org/get
  validate:
    - eq: [status_code, 200]

命令行输入pytest后直接运行

>pytest
======================= test session starts =======================
platform win32 -- Python 3.8.5, pytest-7.2.0, pluggy-1.0.0
rootdir: D:\demo\yaml_yoyo
plugins: yaml-yoyo-1.0.1
collected 2 items                                                  

test_get_demo.yml .                                          [ 50%]
test_hello.yml .                                             [100%]

======================== 2 passed in 0.49s ========================

再来一个post请求

test_post_demo.yml

config:
  name: post示例

teststeps:
-
  name: post
  request:
    method: POST
    url: http://httpbin.org/post
    json:
      username: test
      password: "123456"
  validate:
    - eq: [status_code, 200]
    - eq: [headers.Server, gunicorn/19.9.0]
    - eq: [$..username, test]
    - eq: [body.json.username, test]

validate校验

比如返回的response内容

HTTP/1.1 200 OK
Date: Wed, 23 Nov 2022 06:26:25 GMT
Content-Type: application/json
Content-Length: 483
Connection: keep-alive
Server: gunicorn/19.9.0
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true

{
  "args": {}, 
  "data": "{\r\n    \"username\": \"test\",\r\n    \"password\": \"123456\"\r\n}", 
  "files": {}, 
  "form": {}, 
  "headers": {
    "Content-Length": "55", 
    "Content-Type": "application/json", 
    "Host": "httpbin.org", 
    "User-Agent": "Fiddler", 
    "X-Amzn-Trace-Id": "Root=1-637dbd11-7d9943ba1fb93a9331f6cf8d"
  }, 
  "json": {
    "password": "123456", 
    "username": "test"
  }, 
  "origin": "198.187.30.113", 
  "url": "http://httpbin.org/post"
}

校验方式延续了httprunner的校验语法,可以支持response取值对象:status_code, url, ok, headers, cookies, text, json, encoding
其中返回的是json格式,那么可以支持

  • jmespath 取值语法: body.json.username
  • jsonpath 语法: $..username
  • re 正则语法

如果返回的不是json格式,那么可以用正则取值

变量的声明与引用

变量的声明,只支持在config 声明整个yml文件的全局变量(不支持单个step的变量,减少学习成本)
在httprunner里面变量引用语法是$user, 引用函数是${function()}
我这里统一改成了一个语法变量引用${var} 和 引用函数${function()}
(表面上没多大变量,实际上功能强大了很多,使用了强大的jinja2 模板引擎)
可以在引用函数后继续对结果操作, 这就解决了很多人提到了函数返回一个list,如何在yaml中取某一个值的问题

config:
  name: post示例
  variables:
    username: test
    password: "123456"

teststeps:
-
  name: post
  request:
    method: POST
    url: http://httpbin.org/post
    json:
      username: ${username}
      password: ${password}
  validate:
    - eq: [status_code, 200]
    - eq: [headers.Server, gunicorn/19.9.0]
    - eq: [$..username, test]
    - eq: [body.json.username, test]

运行结果

更多功能持续开发中....大家有好的建议想法也欢迎提出, 微信交流联系wx:283340479
完整的教程已上传到gitee https://gitee.com/yoyoketang/pytest-yaml-yoyo上,如果觉得对你有帮助,可以给个 star

网易云完整视频课程https://study.163.com/course/courseMain.htm?courseId=1213419817&share=2&shareId=480000002230338
报名咨询wx:283340479 (已报名的同学学习过程中有问题,都可以协助解决)

posted @   上海-悠悠  阅读(2170)  评论(3编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2021-11-23 python笔记71 - traceback.print_exc()保存异常内容
2020-11-23 python笔记49-yaml文件中变量的使用(锚点& 与 引用*)
2019-11-23 python测试开发django-73.django视图 CBV 和 FBV
点击右上角即可分享
微信分享提示