函数的注册和使用

如果要在用例中使用动态的内容(例如:当前时间、SQL查询、加密解密等),就需要调用函数来进行实现,这个听起来比变量更加棘手。

好在Python中一切皆对象,函数和变量在某种层面是一类的,区别只是函数支持在名字后使用 () 符合进行 调用


下面是一个简单的例子:

a = print  # 创建a变量
a(123)  # 对a变量进行调用

如果我们将Python函数看作是变量,添加到全局变量中,再加上 () 符号调用,那么就可以实现在用例 调用Python函数

pytest-yaml-sanmu支持在在yaml用例中注册和使用Python变量,也支持在使用Python函数。

注册Python类型变量

通过pytest.ini注册

pytest-yaml-samu 在指定全局变量文件时,也支持py文件。

只不过对py文件中有一个特殊要求: 变量应该定义在指定的类 ``PytestYaml`` 中

此类名可通过配置进行自定义

先创建创建包含 类名 PytestYaml 的python文件:

# yaml_funcs.py
import time


class PytestYaml:
    a = 100   # 数字型变量
    b = "abc" # 字符型变量

    def time(self):  # 可调用型变量
        return time.time()

接着修改配置

[pyetst]

yaml_global_variable_paths =
  ; 加载python格式全局变量
  yaml_funcs.py

这样就添加了三个Python类型变量到pytest-yaml-samu中:

  • a:数字

  • b:字符串

  • time:函数(可调用对象)

通过conftest.py注册

此外,pytest-yaml-samu提供了两个便捷函数 add_globalsadd_locals ,方便在conftest.py中动态地添加 全局变量局部变量


我们以 添加全局变量 为例,代码示例如下

# confetst.py
import time
from pytest_yaml import add_globals  # 导入便捷


add_globals(abc="123", bbc=321) # 关键字参数的方式添加

add_globals(**{    # 字典解包的方式添加
    "print": print,
    "len": len,
})

代码执行之后,会添加5个对象,分别是:

  • abc:字符串"123",局部变量

  • bbc:数字 123,局部变量

  • print:函数,全局变量

  • len: 函数,全局变量

注意:

  1. 局部变量的作用域仅在 当前用例 ,添加时机不正确则无法使用

  2. 变量的优先级比fixture低,变量名与fixture名相同时无法使用

使用Python类型变量

对象的使用方式,取决于对象的类型:例如函数可以加括号调用,列表可以通过索引取值

使用字符串和数字

字符串和数字属于字面量,可以直接用输出,所以通过 ${变量名} 语法即可直接使用:

name: 在yaml中使用变量

steps:
  - request:
      method: get
      url: https://www.baidu.com/?abc=${abc}

  - request:
      method: get
      url: https://www.baidu.com/?abc=${abc}

执行结果:略

使用函数和方法

函数、方法属于可调用类型,在变量名后加 () 即可。

如果函数有参数,可以在 () 中传递参数

# test_globals_functions.yaml

name: 在yaml中使用函数

steps:
  - request:
      method: get
      url: https://www.baidu.com/?time=${time()}

  - request:
      method: get
      url: https://www.baidu.com/?len=${len([1,2,3])}

执行结果如下:

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

tests/function/test_globals_functions.yaml::在yaml中使用函数 url=https://www.baidu.com/?time=1735198928.925052
url=https://www.baidu.com/?len=3
PASSED

============================== 1 passed in 0.20s ===============================

函数的返回值会填充yaml文件中 ${} 符号所在的位置 ,务必根据需要为函数设置正确的返回值。