pytest+yaml 文件,怎么在 yaml 文件中引用变量?
pytest+yaml 文件,怎么在 yaml 文件中引用变量?
首先说我的结论: 不用写太多自定义代码就可以解决文件中使用变量
我的方法是使用 jinja2
模版引擎就可以解决这个问题,不仅仅是:
理论上所有的问题的类似问题都可以解决. 而且这个办法扩展性比一般自己写的方法好.
而且还可以直接使用函数对模版变量进行计算.
至于好用不好用,因为模版引擎功能本身就很强大,所以会复杂一点,但是扩展性肯定好.
一个最简单例子就是: 变量是 name
"Hello, {{ name }}!"
那么如果使用jinja
模版处理就是:
import jinja2
tpl_env = jinja2.Environment() ## 使用模版引擎
def raw_render():
tpl_str = """
"Hello, {{ name}}!"
"""
template = tpl_env.from_string(tpl_str)
print(template.render(name="test"))
跑出来的结果是:
"Hello, test!"
所以变量问题解决了,如果是 yaml 其实也是一样,就是把 yaml 文件读取出来变成文本,然后
和你外部变量进行合成就可以了.
在上面例子中,如果想让 name 变量值在文本中都是大写, 其实不用去实现自定义方法,
直接在模版中使用 python 函数 upper 就可以使用:
"Hello, {{ name.upper()}}!"
在上面例子中如果 需要通过 name 变量进行计算之后在去当成接口输入值,那要怎么做,
比如说 name 变量要加上时间才能当成入参数,那要怎么做?
也不需要写很多代码, 只要写一个函数,然后把这个函数设置到模版引擎中就可以
import jinja2
tpl_env = jinja2.Environment() ## 使用模版引擎
def greeting(name: str): ## 模版中用于计算的函数
return "Hello," + name
def raw_render():
tpl_str = """
Hello {{greet(name)}} ## 模版调用函数
Hello {{ greet(name.upper()) }} ## 模版调用函数
"""
template = tpl_env.from_string(tpl_str)
template.globals.update({
"greet": greeting #设置给模版引擎,进行模版计算
})
print(template.render(name="test"))
我看到挺多同学像自己学一些自定义函数之类的,其实大可不必,如果阅读一下jinja2
文档,我可以说 80% 的自定义函数,那里面都有了.