pytest + yaml 框架 -53.yaml 用例规范与全部关键字总结

发布时间 2023-08-19 08:35:54作者: 上海-悠悠

前言

v1.4.4 版本新增对yaml 用例格式校验,不合法的用例格式不会被执行,避免出现用例格式不合法导致的报错。

全部关键字总结

config 中可用关键字

关键字 可支持类型 功能说明
name 可选 str 没什么用,仅描述当前yaml 用例的名称
base_url 可选 str, 支持格式:http://、https://、ws://、wss:// 当前yaml用例公共环境地址
variables 可选 dict 声明当前yaml文件公共变量
fixtures 可选,str or list 支持格式: "xx", "xx,yy" , ["xxx", "yyy"] 当前yaml文件公共fixtures
parameters 可选,dict or list or 引用外部文件 模块级别参数化
allure 可选,dict 描述用例allure报告 当前yaml文件公共allure描述
mark 可选,str or list 支持格式: "xx", "xx,yy" , ["xxx", "yyy"] 当前yaml文件每个用例加mark标记
hooks 可选,dict 格式:{"request": ["x"], "response": ["y"]} 当前yaml文件每个用例都加钩子
export 可选,str or list 支持格式: "xx", "xx,yy" , ["xxx", "yyy"] 变量提升全局,跨yaml文件引用

用例中可使用的关键字

关键字 可支持类型 功能说明
name 可选 str 用例步骤描述,在allure报告中体现
variables 可选 dict 声明当前用例局部变量
fixtures 可选,str or list 支持格式: "xx", "xx,yy" , ["xxx", "yyy"] 当前用例调用的fixtures
parameters 可选,dict or list or $p{}引用外部文件或外部数据 当前用例级别参数化
allure 可选,dict 描述用例allure报告 当前用例allure报告描述
mark 可选,str or list 支持格式: "xx", "xx,yy" , ["xxx", "yyy"] 当前用例加mark标记
print 可选,str 打印内容
sleep 可选,int or float sleep 休眠时间
skip 可选,str 跳过用例,添加描述
skipif 可选,str 表达式为真跳过用例
request 可选,dict 发送http请求参数
api 可选,str 用例分层,引用api层
extract 可选,dict 提取结果
validate 可选, List[dict] 校验结果
export 可选,str or list 支持格式: "xx", "xx,yy" , ["xxx", "yyy"] 变量提升全局,跨yaml文件引用

websoket 协议2个关键字

关键字 可支持类型 功能说明
ws 可选 dict 连接服务参数
send 可选 str or dict 发送消息内容

API 层接口描述关键字,只有3个

关键字 可支持类型 功能说明
name 可选 str 用例步骤描述,在allure报告中体现
request 可选,dict 发送http请求参数
validate 可选, List[dict] 校验结果

yaml 用例格式规范

一个yaml 文件中可以支持多个用例, 用例可以是一个步骤也可以是多个步骤。

config:
    name: demo


test_1:
    name: 用例1
    print: hello 11111

用例是多个步骤2:
-
    name: get
    request:
        method: GET
        url: http://httpbin.org/get
    validate:
      - eq: [status_code, 200]

-
    name: post
    request:
        method: POST
        url: http://httpbin.org/post
        json:
          username: test
          password: "123456"
    validate:
      - eq: [status_code, 200]

用例分层

API 层只做接口的描述,一般放到项目根目录api目录下

api/login.yaml 示例

name: post
request:
    method: POST
    url: http://httpbin.org/post
    json:
        username: ${username}
        password: "123456"
validate:
    - eq: [status_code, 200]

用例层通过api 关键字导入需要的API,导入的路径是相对路径,需根据项目的根目录去导入。
如果执行过程中代码无法识别哪个是项目根目录,最好在项目的根目录下放一个pytest.ini 文件,pytest会以pytest.ini 文件所在的目录为项目根目录。
比如我的项目结构是这样的

├─api
   └─ login.yml
├─testcase
   └─ test_login.yml
└─conftest.py
└─pytest.ini

那么不管用例文件test_*.yml在哪个目录,都是以项目根目录去导入API 的yaml文件

config:
    name: login case
    base_url: http://127.0.0.0:1
    variables:
        username: "test123"
        password: "123456"


test_case:
-
    name: step login1
    api: api/login.yml
    extract:
        url:  body.url
    validate:
        - eq: [status_code, 200]
        - eq: [ok, true]
-
    name: step login2
    api: api/login.yml

运行用例是在项目根目录去执行 pytest 运行

pytest testcase