首页 > 其他分享 >关键字 开发-16 用例间参数关联

关键字 开发-16 用例间参数关联

时间:2024-01-10 11:58:20浏览次数:33  
标签:name 16 self get 关键字 step export 例间 config

前言

在第8篇文章中,我们使用了extract从接口返回的response中提取了返回的字段值,那么这节将分析,如何将提取的值传递给下一个接口进行参数传递,以达到接口间的参数关联。

1. export提取

extract 提取结果后,之前是module 模块变量级别,现在需要提升到运行用例的session会话全局级别,可以用request内置fixtures来实现。

    def run(self):
        # 1.先获取到config中的变量variables
        if not self.raw.get('config'):
            self.raw['config'] = {}
        base_url = self.raw.get('config').get('base_url', None)  # 获取config中base_url
        config_variables = self.raw.get('config').get('variables',{})
        log.info(f'获取到的config中的变量:{config_variables}')
        # export提取,config_exports变量定义,必须为list
        config_exports: list = self.raw.get('config').get('export', [])
        if not isinstance(config_exports, list):  # config中的export必须要为list类型
            config_exports = []
            log.info("export must be type of list")

......

        def execute_yaml_case(args):
          """执行yaml 中用例部分,根据这个函数动态生成其他测试用例函数"""
          log.info(f"执行的参数: {args}")
          # 更新fixtures的返回值,到容器中
          self.context.update(args)

          # 被谁调用
          call_function_name = inspect.getframeinfo(inspect.currentframe().f_back)[2]
          log.info(f'执行的内容: {case[call_function_name]}')

          # ----------- 通过 config 获取 export 变量 ------
          request_config = args.get('request').config
          if not hasattr(request_config, 'export'):
              request_config.export = {}
          self.context.update(request_config.export)
          case_exports = []  # 用例中需要导出的变量收集
          # 模块变量优先级高
          self.context.update(self.module_variable)
          # ----------- export end ---------

......

          for step in case[call_function_name]:
            step_context = self.context.copy()
            step_name = step.get('name')
            if step_name:
                log.info(f'用例执行:{step_name}')
                step_name = render_template_obj.rend_template_any(step_name, **step_context)
            render_template_obj.rend_template_any(step, **step_context)  # 用例每步之前先渲染变量,方便上个接口提取给下个接口

......

            elif item == 'export':
                if isinstance(value, list):
                    for _export in value:
                        if _export not in case_exports:
                            case_exports.append(_export)

                        if step_context.get(_export):
                            export_dict = {}
                            export_dict[_export] = step_context.get(_export)
                            self.context.update(export_dict)

                else:
                    log.error("export must be list type")

          #  ---------用例结束,更新 export 变量到全局 ------
          for export_key in config_exports:
              request_config.export[export_key] = self.context.get(export_key)
          for export_key in case_exports:
              request_config.export[export_key] = self.context.get(export_key)
          if request_config.export:
              log.info(f"export 导出全局变量:{request_config.export}")
          #  ---------更新export end ------

yml说明:test_ext5用例中,第一步是获取token参数,通过extract提取,然后通过export导出到用例全局中,下一步引用token的提取值。

# testcase/test_ext.yml
test_ext5:
  -
    name: 登录-获取到token
    skipif: 20 > 50
    api: api/login.yml
    extract:
      code1: $.code
      code2: body.code
      token: $.body.token
    validate:
      - eq: [$.code, 0]
      - eq: [status_code, 200]
    export:
      - token

  -
    name: 步骤1
    api: api/login.yml
    print: ${token}
  -
    name: 步骤2
    api: api/login.yml
    print: ${token}

test_ext6:
  name: 6666
  api: api/login.yml
  print: ${token}

运行。

标签:name,16,self,get,关键字,step,export,例间,config
From: https://www.cnblogs.com/dack-zt-deng/p/17956170

相关文章

  • 对Java中new关键字的理解
    在编写Java程序中,最常用的就是new,那么new这个关键字到底做了什么(目前的理解,后续再补充)在Java中,new关键字用于创建对象的实例。当使用new关键字时,它会在堆内存中为对象分配空间,并调用对象的构造方法来初始化对象的状态。相当于分配了一个内存地址,每new一个就有一个新地址,当使用ne......
  • MCP3461RT-E/NC 16位ADC用于便携式仪器仪表,XMC4800-F100F1024AA适合工业连接、控制(MCU
    1、MCP3461RT-E/NCICADC16BITSIGMA-DELTA20UQFNMCP3461器件是16位三角积分模数转换器(ADC),具有高达153.6kSPS的可编程数据速率。它们提供集成功能,如内部基准电压源、内部振荡器、温度传感器和烧毁传感器检测,以减少系统元件数量和总解决方案成本。MCP3461ADC采用超小型3mmx3......
  • 每日一练 | 华为认证真题练习Day161
    1、OSPFSTUB区域的ABR不向STUB区域内泛洪第五类LSA,第四类LSA和第三类LSA,因此STUB区域没有AS外部路由能力,STUB区域的ABR向区域内通告一条默认路由,指导发往AS外部的目的地。A.正确B.错误2、OSPF直接运行于TCP协议之上,使用TCP端口号179。A.正确B.错误3、如果RouterPriority被设......
  • 16. 从零用Rust编写正反向代理, 反向代理upstream源码实现
    wmproxywmproxy是由Rust编写,已实现http/https代理,socks5代理,反向代理,静态文件服务器,内网穿透,配置热更新等,后续将实现websocket代理等,同时会将实现过程分享出来,感兴趣的可以一起造个轮子法项目wmproxygite:https://gitee.com/tickbh/wmproxygithub:https://github.com/tickbh/......
  • ACES 增强版不丹水稻作物地图(2016-2022 年)
    ACES增强版不丹水稻作物地图(2016-2022年)¶用于改善粮食安全决策的2016-2022年年度作物类型稻米地图仍然是不丹的一项挑战。这些地图是与不丹农业部和SERVIR合作开发的。通过专注于发展不丹的科学、技术、工程和数学(STEM),我们共同开发了名为农业分类和估算服务(ACES)的地......
  • Java static关键字讲解
    Java内存模型的简化视图:堆内存(Heap):存储所有的对象实例以及数组。无论是哪个线程创建的对象,都存储在堆内存中。栈内存(Stack):每个线程运行时都会创建自己的栈,用于存储局部变量(包括方法的参数)和控制方法调用的执行流。局部变量可能包括对堆内存中对象的引用。方法区(MethodArea,在JDK8......
  • [ABC163E] Active Infants
    思路第一次看题很快就能想到贪心。一个大的值无非放到左边和右边,哪边增加的多放到哪边。但是有可能存在两边增加的一样的情况,同时不同的选择会影响以后的数值,所以贪心是错误的。既然是对后面的数值有影响,那就是明显的DP。先排个序,从大到小,然后每次先选未选过的最大的,枚举其在左......
  • 2016 2019 李世石 人机大战 谷歌人工智能AlphaGo 韩国人工智能"韩豆"
    2016年3月,谷歌围棋人工智能机器人“阿尔法狗”与韩国棋手李世石进行较量,“阿尔法狗”获得比赛胜利,最终双方总比分定格在4:1。首场人机大战结束后,“阿尔法狗”之父、德米斯·哈萨比斯表示,人工智能的下一步目标是让计算机自己学棋。也就是说,下个版本的“阿尔法狗”将从零开始,不接受......
  • Java关键字(1)
    Java中的关键字是指被编程语言保留用于特定用途的单词。这些关键字不能用作变量名或标识符。以下是Java中的一些关键字:public:表示公共的,可以被任何类访问。private:表示私有的,只能被定义该关键字的类访问。class:用于定义一个类。static:表示静态的,可以用于定义静态变量或静态方......
  • 浪潮服务器某根内存容量减半-32G变成16G
    服务器某根内存条内存容量减半;内存配置:32G*16根问题:CPU0_C2D0槽位内存显示为16G型号:三星32GDDR43200MHz 停机更换后恢复正常......