YAML文件规则

首先,检查pytest.ini文件中包含以下,确保插件已启用

[pytest]
yaml_run_case = true

备注

未启用时,插件完全不工作,如未安装一般

用例文件名

本插件约定:测试用例的文件名必须是 ``test_`` 开头

备注

后期有计划支持自定义文件名规则,通过 ini 配置文件来设定

正确的文件名

以下是正确的文件名示例:

  • test_api.yaml

  • test_web.yaml

  • test_app.yaml

  • test_测试用例.yaml

  • test_0_x_1.yaml

错误的文件名

以下是错误的文件名示例,错误的文件会被本插件忽略:

  • abc.yaml

  • api_test.yaml

  • docker-compose.yaml

用例文件内容

本插件约定文件包含三个字段:

  • name:必填 ,字符串格式,用来说明用例名称

  • mark:选填,列表,用来说明标记

  • steps:必填 ,列表格式,用来说明用例步骤

必填字段

只需完成必填字段,即可实现最基本的yaml用例文件:

# test_base.yaml

name: abc   # 用例名称,字符串格式
steps:   # 用例步骤,数组(列表)格式
  - a: 1   # 每一个步骤,必须要是对象(字典)
  - b: 2
  - c: 3   # 每一个步骤,必须要是对象(字典)

以上yaml文件定义了一个名为abc的用例,并且包含3个测试步骤。

其中字段 steps 应该使用对象(字典)作为成员。这也符合测试用例的实际需求: 每个用例用过多个步骤,每个步骤拥有复杂内容

执行效果如下:

(.venv) C:\demo\pytest-yaml-demo>pytest
================================== test session starts ===================================
platform win32 -- Python 3.12.0, pytest-8.2.2, pluggy-1.5.0
rootdir: C:\demo\pytest-yaml-demo
configfile: pytest.ini
plugins: yaml-1.1.0
collected 1 item

test_base.yaml .                                                                   [100%]

=================================== 1 passed in 0.02s ====================================

可以看出,yaml文件已被pyetst识别为用例文件。

如果添加 -vs 参数,还可以看到yaml文件中的name别识别为用例名称, steps字段中的内容被识别为一个个独立的步骤,并且拥有各自序号:

(.venv) C:\demo\pytest-yaml-demo>pytest -vs
================================== test session starts ===================================
platform win32 -- Python 3.12.0, pytest-8.3.3, pluggy-1.5.0 --
cachedir: .pytest_cache
rootdir:  C:\demo\pytest-yaml-demo
configfile: pytest.ini
plugins: yaml-1.1.0
collected 1 item

test_basic.yaml::abc ----------
当前用例id:test_basic.yaml::abc
当前用例名称:abc
当前用例步骤:{'a': 1}
当前用例步骤序号:0
最大用例步骤序号:2
当前是否第一个步骤:True
当前是否最后一个步骤:False
----------
当前用例id:test_basic.yaml::abc
当前用例名称:abc
当前用例步骤:{'b': 2}
当前用例步骤序号:1
最大用例步骤序号:2
当前是否第一个步骤:False
当前是否最后一个步骤:False
----------
当前用例id:test_basic.yaml::abc
当前用例名称:abc
当前用例步骤:{'c': 3}
当前用例步骤序号:2
最大用例步骤序号:2
当前是否第一个步骤:False
当前是否最后一个步骤:True
====================
PASSED

=================================== 1 passed in 0.02s ====================================

该输出内容是由hook实现,关于hook相见后文。

选填字段

选填字段可按需添加,暂时只有 mark ,与 @pytest.mark 相对应。 在用一个用例中 @pytest.mark 可以使用多次,所以 mark 应为数组(列表)格式。

下面是一个简单的例子

# test_base.yaml

name: abc
mark:
  - skip    # 等同于 `@pytest.mark.skip` 跳过不执行
steps:
  - a: 1
  - b: 2

执行结果如下(用例跳过执行)

(.venv) C:\demo\pytest-yaml-demo>pytest -vs

================================== test session starts ===================================
platform win32 -- Python 3.12.0, pytest-8.3.3, pluggy-1.5.0
cachedir: .pytest_cache
rootdir: C:\demo\pytest-yaml-demo
configfile: pytest.ini
plugins: yaml-1.1.0
collected 1 item

test_basic.yaml::abc SKIPPED (unconditional skip)

=================================== 1 skipped in 0.01s ===================================

也可以为mark传递参数,详见后文