前言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} 的处理过程如下: 例如:${"abc" | upper | reverse } 的输出为 “CBA”。 常用的过滤器过滤器名称 | 语法使用 | 实现功能 |
---|
capitalize | ${ 'yoyo’ | capitalize } | 首字母转大写: Yoyo | title | ${ 'hello world’ | title } | 单词首字母大写 Hello World | lower | ${ 'HELLO’ | lower } | 转小写:hello | upper | ${ 'hello’ | upper } | 转大写:HELLO | revsere | ${ 'abc’ | reverse } | 反转:cba | format | ${ 'my name %s, %d years.’ | format('yoyo’, 20) } | format 格式化字符:my name yoyo, 20 years. | first | ${ ['hello’, 'world’, 'yoyo’] | first} | 取出第一个:hello | last | ${ ['hello’, 'world’, 'yoyo’] | last} | 取出最后一个:yoyo | length | ${ ['hello’, 'world’, 'yoyo’] | length} | 获取列表 list 长度: 3 | sum | ${ [1, 2, 3] |sum } | list 求和: 6 | sort | ${ [1, 3, 2] | sort } | list 排序:123 | sort | { [1, 3, 2] | sort(reverse = True) } | list 倒序:321 | join | ['hello’, 'world’, 'yoyo’] | join('_’) | 字符拼接:hello_world_yoyo | default | ${ gender | default('male’) } | 如果 gender 变量未定义使用默认值:male | add | ${20 | add(1)} | (这个是我添加的一个add 方法)变量值加1:21 |
上面的过滤器方法除了add是我自定义的一个内置方法,其它都是jinja2模板引擎自带的过滤器方法。 使用示例在yaml 用例中使用过滤器语法 test_a.yml # 作者-上海悠悠 wx:283340479 # blog地址 https://www.cnblogs.com/yoyoketang/ 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, <class 'int'> 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, <class 'str'> 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 # 作者-上海悠悠 wx:283340479 # blog地址 https://www.cnblogs.com/yoyoketang/
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 # 作者-上海悠悠 wx:283340479 # blog地址 https://www.cnblogs.com/yoyoketang/
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, <class 'str'> 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, <class 'str'> 2023-05-23 10:38:48 [INFO]: validate 校验内容-> [] 2023-05-23 10:38:48 [INFO]: export 导出全局变量:{} PASSED [100%]
|