前言經(jīng)??吹胶芏嗤瑢W問到,如何在 yaml 文件中引用一個 python 的函數(shù),? 問題分析大家對yaml文件還處于比較陌生的階段,,yaml 和 json 文件本質(zhì)上是一樣的,都是靜態(tài)的文件,,當然不能直接引用 python 的函數(shù),。 那這時候就有人問到了,那為什么 httprunner 框架可以在yaml文件中引用函數(shù)呢,? 那么我們能不能實現(xiàn)這種效果呢,? 使用模板可以編寫出可讀性更好,,更容易理解和維護的代碼,,并且使用范圍非常廣泛,,因此怎么使用模板主要取決于我們的想象力和創(chuàng)造力。 python的模板庫jinja2 功能是非常強大的,。 jinja2 模板庫先需要pip安裝 pip install jinja2 render 函數(shù)實現(xiàn)在yaml文件中,,通過 {{ 函數(shù)名稱() }} 來引用函數(shù) 寫個 render 函數(shù)讀取 yaml 文件內(nèi)容 import os import jinja2 import yaml import random
def render(tpl_path, **kwargs): path, filename = os.path.split(tpl_path) return jinja2.Environment(loader=jinja2.FileSystemLoader(path or './') ).get_template(filename).render(**kwargs)
讀取到的yaml文件本質(zhì)上都是字符串來讀取的,通過jinja2 模板來讀取,,會先把函數(shù)的值替換進去,。最后再轉(zhuǎn)成python的dict結(jié)構(gòu) import os import jinja2 import yaml import random
def render(tpl_path, **kwargs): path, filename = os.path.split(tpl_path) return jinja2.Environment(loader=jinja2.FileSystemLoader(path or './') ).get_template(filename).render(**kwargs)
# yaml 文件調(diào)用以下函數(shù) def rand_str(): return str(random.randint(1000000, 2000000))
if __name__ == '__main__': r = render("aa.yml", **{"rand_str": rand_str}) print(r) print(yaml.safe_load(r))
運行結(jié)果 name: yoyo age: 22 tel: 1616350 {'name': 'yoyo', 'age': 22, 'rand_str': 1616350}
上面讀取函數(shù)是寫死的,我們希望能自動加載類似于debugtalk.py的文件來自動加載函數(shù) 自動加載debug.py里面的函數(shù)寫一個debug.py 文件,,實現(xiàn) yaml 文件里面定義的函數(shù)去替換值,。 import random
# yaml 文件調(diào)用以下函數(shù) def rand_str(): return str(random.randint(1000000, 2000000))
run.py里面定義一個函數(shù)自動讀取debug.py里面的函數(shù),生成dict 鍵值對格式 def all_functions(): """加載debug.py模塊""" debug_module = importlib.import_module("debug") all_function = inspect.getmembers(debug_module, inspect.isfunction) # print(dict(all_function)) return dict(all_function)
函數(shù)返回 {'rand_str': <function rand_str at 0x0000017B72EA8488>} 完整的run.py文件內(nèi)容 import os import jinja2 import yaml import importlib import inspect
def render(tpl_path, **kwargs): """渲染yml文件""" path, filename = os.path.split(tpl_path) return jinja2.Environment(loader=jinja2.FileSystemLoader(path or './') ).get_template(filename).render(**kwargs)
def all_functions(): """加載debug.py模塊""" debug_module = importlib.import_module("debug") all_function = inspect.getmembers(debug_module, inspect.isfunction) print(dict(all_function)) return dict(all_function)
if __name__ == '__main__': r = render("aa.yml", **all_functions()) print(r) print(yaml.safe_load(r))
運行結(jié)果 {'rand_str': <function rand_str at 0x000001931C248488>} name: yoyo age: 22 tel: 1010421 {'name': 'yoyo', 'age': 22, 'tel': 1010421}
|