微信公众号:就用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 - 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