pytest + yaml 框架 -29.模板过滤器语法与自定义过滤器使用

发布时间 2023-05-23 10:31:02作者: 上海-悠悠

前言

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%]