首页 > 其他分享 >pytest + yaml 框架 -43.支持自定义函数提取返回结果

pytest + yaml 框架 -43.支持自定义函数提取返回结果

时间:2023-06-26 22:57:01浏览次数:45  
标签:name 自定义 eq 43 hello yaml fun True response

前言

在 yaml 用例中提取返回结果,可以支持以下三种表达式

  • jmespath 取值语法: body.keyname.keyname
  • jsonpath 语法: $..keyname
  • re 正则语法

以上三种表达式可以满足 99% 的测试场景需求了,但是有些特殊的需求通过表达式无法取到,为了满足另外1%的需求,可以自定义函数取值。
此功能在v1.3.6版本实现

场景描述

有个小伙伴给我提了个需求:如果返回的结果中有某个值就断言,没有就不断言

示例:如下返回结果,当data中name的值为"yoyo"的时候,断言它的邮箱值"[email protected]",如果结果中没有name的值为"yoyo"就不断言

res = {
    "code": 0,
    "msg": "成功success!",
    "data": [
       {
           "age": 20,
           "create_time": "2019-09-15", 
           "id": 1, 
           "mail": "[email protected]", 
           "name": "yoyo", 
           "sex": "M"
       },
       {
           "age": 21, 
           "create_time": "2019-09-16", 
           "id": 2,
           "mail": "[email protected]", 
           "name": "yoyo111", 
           "sex": "M"
       }
    ]
}

代码示例

先自定义函数取值,传一个 reponse (接口返回对象)

conftest.py 内容如下:

from pytest_yaml_yoyo import  my_builtins


def fun_x(response):

    res = response.json()
    for item in res['data']:
        if item.get("name") == "yoyo":
            return item.get("mail") == "[email protected]"
    return True


my_builtins.fun_x = fun_x

yaml 用例中内容, 校验地方可以引用函数${fun_x(response)}, response 参数是接口返回对象。
test_rep.yml

test_rep:
  name: z
  request:
    url: /api/test/demo
    method: get

  validate:
    - eq: ["hello", "hello"]
    - eq: ["${fun_x(response)}", true]

执行用例

pytest test_rep.yml

运行结果:

2023-06-26 22:45:08 [INFO]: 取值表达式: fun_x(response), 取值结果:True <class 'bool'>
2023-06-26 22:45:08 [INFO]: validate 校验内容-> [{'eq': ['hello', 'hello']}, {'eq': [True, True]}]
2023-06-26 22:45:08 [INFO]: validate 校验结果-> eq: [hello, hello]
2023-06-26 22:45:08 [INFO]: validate 校验结果-> eq: [True, True]
2023-06-26 22:45:08 [INFO]: export 导出全局变量:{}

标签:name,自定义,eq,43,hello,yaml,fun,True,response
From: https://www.cnblogs.com/yoyoketang/p/17506692.html

相关文章

  • SAP BTP 平台 ABAP 编程环境如何维护自定义 Unit Of Measure 数据库表 T006
    在ABAPOn-Premises系统下,我们可以轻易在SAPGUI里对UnitofMeasure数据库表即T006进行维护:[图片]ABAP数据库表T006是SAP系统中的一个重要数据表,它用于存储与度量单位相关的信息。在SAP系统中,度量单位用于表示各种物料、服务和计量单位。这些信息对于物料管理、......
  • spring boot 编译打包时将自定义引入的.jar包依赖,全部打包进去
    发现自己引入的.jar包,在打包时,.jar包并不会打进去,导致报错。打包时打入自定义.jar包方法:<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</a......
  • 前端Vue自定义精美tabs,可设置下划线图标 热门标题
    前端Vue自定义精美tabs,可设置下划线图标热门标题,下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=13186效果图如下:cc-beautyTabs使用方法<!--tabchange:tab选择事件tabList:tab数据--><cc-beautyTabs@tabChange="tabChange":tabList="t......
  • 前端Vue自定义滚动卡片,可以用于商品海报生成
    前端Vue自定义滚动卡片,可以用于商品海报生成,下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=13189实现代码如下:cc-scroolCard使用方法<!--dataInfo:滚动卡片数据 swiperIndex:滚动序列@change:滚动事件--><cc-scroolCard:dataInfo="data":......
  • springboot中自定义JavaBean返回的json对象属性名称大写变小写问题
    目录一、继承类二、手动添加Get方法三、@JsonProperty四、spring-bootjson(jackson)属性命名策略开发过程中发现查询返回的数据出现自定义的JavaBean的属性值大小写格式出现问题,导致前端无法接受到数据,目前有四种解决方法,根据大佬的经验之谈,前两种是最简单便捷的,后两种是比较通......
  • 异步注解@Async使用自定义线程池
    1.@Async注解@Async是java中一个注解,其作用就是加上该注解的类或方法能够异步执行任务,该注解添加到方法上时,表示该方法是异步方法,添加到类上时,表示该类中的所有方法都是异步方法。该注解的代码为:可以看出其是作用在类和方法上,能够在运行时被获取到。当在使用@Async时,如果不指......
  • AWScli container yaml file
    AWSclicontaineryamlfileapiVersion:v1kind:Podmetadata:name:awsclilabels:app:awsclispec:#serviceAccountName:YOUR_SERVICE_ACCOUNTcontainers:-image:amazon/aws-clicommand:-"sleep"-"604800&q......
  • busybox yaml file
    简单的busybox的yaml文件kind:DeploymentapiVersion:apps/v1metadata:name:clearlognamespace:defaultlabels:app:busyboxspec:replicas:3selector:matchLabels:app:clearlogtemplate:metadata:labels:app......
  • 1.element表头居中内容左对齐, 2.自定义el-table中新增编辑表格不刷新的问题。
    一、<el-table :header-cell-style="{'text-align':'left'}">...<el-table-column:cell-style="{'text-align':'left'}">...</el-table-column></el-table> 二、this.$se......
  • 自定义博客园---返回顶部
    效果就是在页面最右下角的地方有一个小火箭队图标,如下图: 在博客园的设置中,在页首HTML代码中添加如下:<style>#back-top{position:fixed;bottom:10px;right:5px;z-index:99;}#back-topspan{width:50px;height:64px;dis......