0
点赞
收藏
分享

微信扫一扫

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

前言

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 }

单词首字母大写 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


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


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



举报

相关推荐

0 条评论