前言
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' | capitalize } |
首字母转大写: Yoyo |
| title | `${ 'hello world' | title }` |
| lower | `${ 'HELLO' | lower }` |
| upper | `${ 'hello' | upper }` |
| revsere | `${ 'abc' | reverse }` |
| format | `${ 'my name %s, %d years.' | format('yoyo', 20) }` |
| first | `${ ['hello', 'world', 'yoyo'] | first}` |
| last | `${ ['hello', 'world', 'yoyo'] | first}` |
| length | `${ ['hello', 'world', 'yoyo'] | length}` |
| sum | `${ [1, 2, 3] | sum }` |
| sort | `${ [1, 3, 2] | sort }` |
| sort | `{ [1, 3, 2] | sort(reverse = True) }` |
| join | `['hello', 'world', 'yoyo'] | join('_')` |
| default | `${ gender | default('male') } ` |
| add | `${20 | add(1)}` |
上面的过滤器方法除了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, <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%]