钩子函数

正如简介中描述的那样,本插件职责是明确且单一的:让pytest支持yaml文件的用例。

因此,当pytest加载yaml文件中的用例了后,如何执行其中的步骤(steps),完全取决于你自己。也是正因为如此,过本插件的应用留下了极大的扩展空间。

具体来说:

  • 当执行yaml用例时,会迭代用例中的步骤(steps)

  • 每次迭代,都会将调用钩子(hook) pytest_yaml_run_step

若要自定义步骤,实现该钩子函数即可

基本示例

假设有用例内容如下:

# test_base.yaml

name: abc
steps:
  - a: 1
  - b: 2

并且实现钩子

# conftest.py

from pytest_yaml import YamlItem

def pytest_yaml_run_step(item: YamlItem):
    print()
    print('正在执行第几个步骤:',item.current_step_no)
    print('正在执行什么步骤:',item.current_step)

    return True

备注

注意1:item参数的内容可以参考文章红的Item对象

注意2:钩子函数应该返回True,以便后续的同名钩子不再执行。

结果如下:

(.venv) C:\demo\pytest-yaml-demo1>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-demo1
configfile: pytest.ini
plugins: yaml-1.1.0
collected 1 item


test_basic.yaml::abc
正在执行第几个步骤: 0
正在执行什么步骤: {'a': 1}
正在执行第几个步骤: 1
正在执行什么步骤: {'b': 2}
PASSED

=================================== 1 passed in 0.01s ====================================

从执行结果可以找出这样的规律:

  1. 钩子函数执行了2次,和用例步骤的 数量一致

  2. 每次打印的内容,和用例步骤的 内容一致

小结

本插件会按照yaml文件中所定义的用例步骤, 按照固定的顺序、数量、内容,pytest_yaml_run_step 进行调用。

基于此,你可以在钩子函数中,根据步骤的内容,进行接口调用、浏览器控制、自定义断言等,实现各种场景的测试执行。