. 引言

自动化测试中是不是遇到过动态参数替换,有些事用正则进行替换的,有些是直接调用接口取返回值直接进行赋值;下面是使用的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      - check: 1
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

更过内容欢迎关注公众号
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐