python:Jinja2+yaml实现动态参数替换

1,517 阅读4分钟

微信公众号:就用python
关注可了解更多的文章。如有问题或建议,可评论区留言
如果你觉得该文章对你有帮助,欢迎赞赏、点赞、分享,你的支持就是我最大的动力!

. 引言

自动化测试中是不是遇到过动态参数替换,有些事用正则进行替换的,有些是直接调用接口取返回值直接进行赋值;下面是使用的jinja2+yaml进行参数渲染。话不多少,进入正文部分

. 小牛试刀

  • 首先先安装jinja2,直接pip安装即可,例如:pip install 报名
  • 安装好上述第三方包后,小试牛刀下,例如:
 1import jinja2
 2from pathlib import Path
 3
 4
 5BASE_DIR = Path(__file__).resolve().parent.parent
 6
 7FILE_PATH = Path.joinpath(BASE_DIR, "bin""example.yml")
 8
 9with open(FILE_PATH, encoding="utf-8") as w:
10    string_var = w.read()
11
12    new_data = {"parent_id""被替换的成功的数据-1"}
13    response = jinja2.Template(string_var).render(new_data)
14    print(response )
  • BASE_DIR是项目工程目录的根目录
  • FILE_PATH是yaml文件的路径
  • 使用上下文管理器with,结合open函数去读取yaml文件中的数据
  • 引入jinja2中的Template类读取yaml模板数据,再调用render方法进行数据替换
  • 最后print()打印替换成功的数据,运行结果展示如下:
1test_knowledge_add:
2  data_test:
3    - - knowledge_class_name: 新建知识目录
4        parent_id: 被替换的成功的数据-1
5      - title: 增加知识目录
6      - check1
7
8Process finished with exit code 0

. jinja2使用简介

jinja2读取模板文件中变量的标识是嵌套的大括号,例如:{{变量}}

  • 列表类型数据,例如:
1    new_data = {"parent_id": ["被替换的成功的数据-1""被替换的成功的数据-2"]}
2    response = jinja2.Template(string_var).render(new_data)

列表类型的数据,使用下标获取,例如:{{parent_id.0}}

1test_knowledge_add:
2  data_test:
3    - - knowledge_class_name: 新建知识目录
4        parent_id: {{parent_id.0}}
5      - title: 增加知识目录
6      - check: 1

或者使用for循环取值,例如:

1test_knowledge_amend:
2  data_test:
3    - - knowledge_class_name: 新建知识目录
4        parent_id: "{% for i in parent_id %} {{ i }} {%  endfor %}"
5      - title: 增加知识目录
6      - check: 1
  • 字典类型数据,例如:
1    new_data = {"parent_id""被替换的成功的数据-1"}
2    response = jinja2.Template(string_var).render(new_data)

字典类型的数据,使用key取值,例如:{{parent_id}}

1test_knowledge_add:
2  data_test:
3    - - knowledge_class_name: 新建知识目录
4        parent_id: {{parent_id}}
5      - title: 增加知识目录
6      - check: 1
  • 嵌套字典数据,例如
1    new_data = {"parent_id": {"name""被替换的成功的数据-1"}}
2    response = jinja2.Template(string_var).render(new_data)

嵌套字典使用key.key,例如:{{parent_id.parent_id}}

1test_knowledge_add:
2  data_test:
3    - - knowledge_class_name: 新建知识目录
4        parent_id: {{parent_id.name}}
5      - title: 增加知识目录
6      - check: 1

以上都是简单的模板语言语法使用,想了解更多可访问官网,如下连接:

英文版 Jinja Document3.0,https://jinja.palletsprojects.com/en/3.0.x/
中文版 Jinja Document2.0,http://doc.yonyoucloud.com/doc/jinja2-docs-cn/index.html

. 处理返回值

jinja2渲染时,必须是String类型,不然就会抛出错误,读取是String,那返回的自然也是String类型,但是这个不是我们想要的,最终还是想要字典类型,这样的类型用例好识别

  • 首先要安装yaml库,同样是pip安装,例如:pip install pyyaml
  • 安装好上述第三方包后,小试牛刀下,例如:
 1import yaml
 2import jinja2
 3from pathlib import Path
 4
 5
 6BASE_DIR = Path(__file__).resolve().parent.parent
 7
 8FILE_PATH = Path.joinpath(BASE_DIR, "bin""example.yml")
 9
10with open(FILE_PATH, encoding="utf-8") as w:
11    string_var = w.read()
12
13    new_data = {"parent_id": {"name""被替换的成功的数据-1"}}
14    response = jinja2.Template(string_var).render(new_data)
15    results = yaml.safe_load(response)
16    print(type(results))
  • yaml.safe_load()是解析yaml文件中的数据,并赋值给变量results
  • 最后print()输入变量results的类型,运行结果展示如下:
1<class 'dict'>
2
3Process finished with exit code 0
4

. 渲染封装

熟悉使用后,开始进行封装处理,以后后续调用,封装示例如下:

 1import yaml
 2import jinja2
 3from pathlib import Path
 4
 5
 6class ReadYamlRender:
 7
 8    def __init__(self, yaml_path, content: dict = {}):
 9        self._yaml_path = yaml_path
10        self._content = content
11
12        with open(FILE_PATH, encoding="utf-8") as w:
13            self._string_var = w.read()
14
15    @property
16    def render(self):
17        response = jinja2.Template(self._string_var).render(self._content)
18        results = yaml.safe_load(response)
19        return results
20
21
22if __name__ == '__main__':
23    # 测试下封装是否正确
24    new_data = {"parent_id": {"name""被替换的成功的数据-1"}}
25    BASE_DIR = Path(__file__).resolve().parent.parent
26    FILE_PATH = Path.joinpath(BASE_DIR, "bin""example.yml")
27    print(ReadYamlRender(FILE_PATH, new_data).render)

yaml模板数据展示如下:

1test_knowledge_add:
2  data_test:
3    - - knowledge_class_name: 新建知识目录
4        parent_id: {{parent_id.name}}
5      - title: 增加知识目录
6      - check: 1

测试后的运行结果展示如下:

1{'test_knowledge_add': {'data_test': [[{'knowledge_class_name''新建知识目录''parent_id''被替换的成功的数据-1'}, {'title''增加知识目录'}, {'check'1}]]}}
2
3Process finished with exit code 0

以上就是jinja2+yaml操作的使用,希望对你有所帮助!


以上总结或许能帮助到你,或许帮助不到你,但还是希望能帮助到你,如有疑问、歧义,直接私信留言会及时修正发布;感觉还不错记得点赞呦,谢谢!

未完,待续…

一直都在努力,希望您也是!

微信搜索公众号:就用python

二维码.png