如果用例内容(如:测试账号、对象 id 等)经常需要更新、变化,那么对用例文件的修改就是一个稍显麻烦的问题。特别是内容比较繁多的用例文件,寻找内容很麻烦,修改起来更麻烦。
在实践中,一个好的思路是将【会变化的内容】放到变量中,那么在需要更新时只集中修改变量即可,避免了从众多文件中进行搜寻,从众多内容中进行搜寻,然后小心翼翼的修改。
pytest-yaml-sanmu 支持 3 种变量的设置方式:
局部变量
共享变量
全局变量
1. 设置局部变量
局部变量在 yaml 用例的vars字段下进行创建
重新执行用例结果如下
图 2. 可以在 setps 中使用变量
2. 设置共享变量
共享变量也写在 yaml 用例的vars字段下,但不是直接写,而是通过include方式加载数据文件。
因为数据文件可以被多个用例include,所以其变量值也被多个用例共享,但其本质还是局部变量。
pytest -vs tests/test_vars_shared.yaml
图 3. 从 json 文件中加载共享变量
3. 设置全局变量
全局变量和共享变量不一样的是:全局变量会自动被所有用例读取
所有不需要用例文件中进行设置
而是在配置文件中进行设置全局变量文件
全局变量文件内容如下
图 4. 用例使用全局变量
4. 变量优先级和作用域
1. 优先级
目前,在 yaml 中通过使${var_name}的方式使用变量,这一用法和 JMeter 相似。
在前文中,fixture 返回值的使用方式也是${var_name},
那么,当变量名、fixture 名相同时当多种变量具有变量名,优先使用哪一个?
在 pytest-yaml-sanmu 中,对于同名变量,会按照以下顺序返回值:
fixture
局部变量
全局变量
如果某个变量不存在,则返回空字符串(这一点和 JMeter 是不同的)
也就是说,fixture 的优先级最高,全局变量的优先级最低
2. 作用域
作用域决定了变量可以被哪些用例使用,具体区别如下:
局部变量:当前 yaml 用例
共享变量:加载了该变量文件的 yaml 用例
全局变量:所有 yaml 用例
这使得我们可以放心的地在不同 yaml 用中使用相同的局部变量名,而不担心产生额外影响和冲突。
相反,如果需要创建(或修改)一个可以被其他 yaml 用例使用的数据,则应该使用全局变量
5. 配置项
默认情况下,${var_name}仅支持在 steps 中使用
添加以下配置,${var_name}支持在 mark 中使用变量
添加以下配置,自动从指定的文件中加载数据,作为全局变量
yaml_global_variable_paths = abc.yaml data.yaml
注意:
支持指定多个全局变量文件
支持使用相对路径或绝对路径
如果文件不存在,则引发错误
图 5. 变量文件不存在时显示绝对路径
添加以下配置,当全局变量文件不存在时,忽略错误
yaml_global_variable_paths_ignore_if_non_existent = True
能看到这里说明是真爱,关注一下吧
领取专属 10元无门槛券
私享最新 技术干货