前言
v1.2.6 版本支持模板过滤器语法的使用,并且可以自定义过滤器了。针对有同学提到上个接口返回一个id值,下个接口引用变量的时候需要根据这个值做一些运算,比如在引用的结果加1.
jinja2 是可以支持模板过滤器语法的,本篇介绍下模板过滤器的相关使用.
v1.2.6 版本主要更新以下几点
1.解决与 pytest-base-url 插件不兼容问题
2.解决len_eq 断言 list 长度问题
3.模板过滤器 filter 支持
jinja2 模板过滤器语法
什么是 jinja2 模板过滤器?
通过在 Jinja2 模板中嵌入变量,可以输出变量的值。但是,在很多情况下,不仅仅只是需要输出变量的值,还需要修改变量的显示,对变量进行格式化、运算等。
为了方便对变量进行处理,Jinja2 提供了过滤器,Jinja2 过滤器是一个函数,该函数对输入变量进行变换处理后,返回一个值作为 Jinja2 模板的输出。
在 yaml 用例文件中引用变量,使用 Jinja2 中过滤器有如下用法:
示例1:过滤器不带任何参数
${ var | filter }
例如:过滤器 upper 将输入变量 var 转换为大写, ${"hello" | upper }
的输出为 “HELLO”。
示例2:过滤器带参数的情况
${ var | filter(arg) }
例如:过滤器 replace (source, target) 将输入变量 var 中的字符串 source 替换为字符串 target,${"hello world" | replace ("hello", "yoyo") }
的输出为 “hello yoyo”。
示例3:过滤器可以组合使用
${ var | filterA | filterB }
过滤器可以组合使用,${var | filterA | filterB}
的处理过程如下:
- 输入变量 var 传递给第一个过滤器 fiterA;
- 将过滤器 filterA 的输出作为输入,传递给第二个过滤器 filterB;
- 将过滤器 filterB 的输出作为模板的输出。
例如:${"abc" | upper | reverse }
的输出为 “CBA”。
常用的过滤器
过滤器名称 |
语法使用 |
实现功能 |
capitalize |
|
首字母转大写: Yoyo |
title |
|
单词首字母大写 Hello World |
lower |
|
转小写: hello |
upper |
|
转大写: HELLO |
revsere |
|
反转: cba |
format |
|
format 格式化字符:my name yoyo, 20 years. |
first |
|
取出第一个:hello |
last |
|
取出最后一个:yoyo |
length |
|
获取列表 list 长度: 3 |
sum |
|
list 求和: 6 |
sort |
|
list 排序:123 |
sort |
|
list 倒序:321 |
join |
|
字符拼接:hello_world_yoyo |
default |
|
如果 gender 变量未定义使用默认值:male |
add |
|
(这个是我添加的一个add 方法)变量值加1: 21 |
上面的过滤器方法除了add是我自定义的一个内置方法,其它都是jinja2模板引擎自带的过滤器方法。
使用示例
在yaml 用例中使用过滤器语法
test_a.yml
config:
name: xx
variables:
age: 20
x: 22
y: "hell0"
testx1:
name: "xx"
print: '${age | add(3)}'
testx2:
name: "xx"
print: '${y | length}'
使用pytest 运行用例
pytest test_a.yml
运行结果:
test_a.yml::testx1
------------------------- live log call ------------------------
2023-05-23 10:16:48 [INFO]: 执行文件-> test_a.yml
2023-05-23 10:16:48 [INFO]: base_url->
2023-05-23 10:16:48 [INFO]: config variables-> {'age': 20, 'x': 22, 'y': 'hell0'}
2023-05-23 10:16:48 [INFO]: 运行用例-> testx1
2023-05-23 10:16:48 [INFO]: 取值表达式 age | add(3)
2023-05-23 10:16:48 [INFO]: 取值结果:23,
2023-05-23 10:16:48 [INFO]: validate 校验内容-> []
2023-05-23 10:16:48 [INFO]: export 导出全局变量:{}
PASSED [ 50%]
test_a.yml::testx2
---------------------- live log call ------------------------------
2023-05-23 10:16:48 [INFO]: 执行文件-> test_a.yml
2023-05-23 10:16:48 [INFO]: base_url->
2023-05-23 10:16:48 [INFO]: config variables-> {'age': 20, 'x': 22, 'y': 'hell0'}
2023-05-23 10:16:48 [INFO]: 运行用例-> testx2
2023-05-23 10:16:48 [INFO]: 取值表达式 y | length
2023-05-23 10:16:48 [INFO]: 取值结果: 5,
2023-05-23 10:16:48 [INFO]: validate 校验内容-> []
2023-05-23 10:16:48 [INFO]: export 导出全局变量:{}
PASSED [100%]
自定义过滤器
自定义过滤器语法跟自定义函数有点类似,也是在项目根路径下conftest.py 文件上注册过滤器
conftest.py
from pytest_yaml_yoyo.render_template_obj import env_filter
def fun_a(value):
"""不带参数"""
return f"{value} 不带参数: {value}"
def fun_b(value, x):
"""带一个参数x"""
return f"{value} 带参数x: {x}"
# 注册过滤器
env_filter.filters['fun_a'] = fun_a
env_filter.filters['fun_b'] = fun_b
yaml 中用例使用
test_b.yml
config:
name: 自定义过滤器的使用
variables:
name: yoyo
testa1:
name: "不带参数"
print: '${name | fun_a}'
testa2:
name: "带参数"
print: '${name | fun_b("bb")}'
运行结果
test_b.yml::testa1
------------------- live log call -----------------------------
2023-05-23 10:38:48 [INFO]: 执行文件-> test_b.yml
2023-05-23 10:38:48 [INFO]: base_url->
2023-05-23 10:38:48 [INFO]: config variables-> {'name': 'yoyo'}
2023-05-23 10:38:48 [INFO]: 运行用例-> testa1
2023-05-23 10:38:48 [INFO]: 取值表达式 name | fun_a
2023-05-23 10:38:48 [INFO]: 取值结果: yoyo 不带参数: yoyo,
2023-05-23 10:38:48 [INFO]: validate 校验内容-> []
2023-05-23 10:38:48 [INFO]: export 导出全局变量:{}
PASSED [ 75%]
test_b.yml::testa2
------------------------- live log call -------------------
2023-05-23 10:38:48 [INFO]: 执行文件-> test_b.yml
2023-05-23 10:38:48 [INFO]: base_url->
2023-05-23 10:38:48 [INFO]: config variables-> {'name': 'yoyo'}
2023-05-23 10:38:48 [INFO]: 运行用例-> testa2
2023-05-23 10:38:48 [INFO]: 取值表达式 name | fun_b("bb")
2023-05-23 10:38:48 [INFO]: 取值结果: yoyo 带参数x: bb,
2023-05-23 10:38:48 [INFO]: validate 校验内容-> []
2023-05-23 10:38:48 [INFO]: export 导出全局变量:{}
PASSED [100%]
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
相关推荐: Appium自动化(15):Appium常用操作之混合应用webview页面操作–待补充!
上下文操作: 在appium中,对于混合应用,需要进行WebView页面和原生应用的切换 常用的方法如下: 1、context(self) / current_context(self):返回当前会话的当前上下文,context可以理解为可进入的窗口。对…