pytest:灵活替换用例中的变量

news2024/11/21 0:36:38

背景:

这几天在调试之前搭建的pytest框架时,发现原框架对case中的变量进行动态替换的代码不够完美,原代码逻辑会造成代码中会出现大量的if语句,让代码量增加不少,并且后期维护也不方便:case只要新增了一个变量,就需要在通过if语句进行判断,从而实现变量替换。再发现这个问题之后,我决心优化这块代码。

在这里插入图片描述

首先,我们先一起分析一下我原本的代码逻辑,以及我当时实现的想法。

原本实现逻辑:

在这里插入图片描述

从上面流程图来看,最初的实现逻辑是将需要替换的变量分为了需要脚本生成和已经存在的变量来区分的。在环境变量多,需要脚本动态生成的数据少的前提下,该逻辑是适用的。但是如果需要脚本生成数据并赋值给变量这样的场景过多时,该方式就不适用。

具体原因如下:
1.每增加一个变量,就需要增加一个if语句,代码又臭又长。
2.代码维护不便,每增加一次变量就需要改动代码。

因此我们需要对该方法进行优化!

在这里插入图片描述

优化该方法的切入点就在与黄色方框标记的代码中,从上图可知,我们对mark是否存在于环境变量中进行了判断,因此我们只需要一个else,就可以解决上述问题!

优化后的实现逻辑:

在这里插入图片描述
对比两个流程图来看,现在的流程已经不需要单独对需要脚本生成的变量分别进行判断,从而调用方法实现赋值。基于我们目前的流程图,我们需要解决的问题是:当需要赋值的变量不是环境变量时,我们需要通过代码将其设置为环境变量,并且去获取到它的值。

那么我们需要实现一个逻辑:传入的参数或者变量,让代码根据传入的参数或者变量去决定它需要执行哪一个方法。

要实现该逻辑,我们需要使用getattr方法,优化后的代码如下:

在这里插入图片描述

将之前反复if判断的语句优化成了蓝色方框标记的代码优缺点如下:

**优点:**
       1.后续用例中在出现新的非环境变量的变量名,不需要在通过if语句去实现数据替换
       2.代码不需要反复修改
**缺点:**
       1.用例中对应的变量名称需要与生成数据的方法名保持一致。具体原因见拓展。

拓展

如何通过getattr实现传入不同的参数,调用不同的方法。

def func1():
    print("This is function 1.")

def func2():
    print("This is function 2.")

def func3():
    print("This is function 3.")

# 获取函数名
func_name = "func1"

# 根据函数名动态调用函数
getattr(__main__, func_name)()

在上述代码中,定义了三个不同的方法,然后通过getattr实现了根据函数名动态调用函数,运行结果为:“This is function 1.”,getattr() 函数的第一个参数是模块名或对象名,这里我们使用 main 表示当前模块。第二个参数是要获取的函数名(这里就是我前面提到的变量名要与方法名保持一致,因为我们实现的逻辑是:变量不是环境变量时,就基于该变量名去生成一个环境变量),这里我们使用 func_name 变量来表示。

注意!在使用getattr()根据函数名动态调用函数时,需要注意getattr(main, func_name)()与getattr(main, func_name)的区别,getattr(main, func_name)()是使用 getattr() 函数获取 main对象中指定方法名为 func_name的方法,并返回该方法对象。然后,使用函数调用语法 () 调用该方法getattr(rd, mark) 只是获取了 rd 对象中指定方法名为 mark 的方法对象,并没有进行调用

                                                                        ------------------------学海无涯

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/590954.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue3 实现全选/全不选功能

List item vue3实现全选/全不选功能 实现逻辑就是全选按钮的选中与否依赖,所有的子复选框是否选中, 通过计算属性的 get()跟set()方法绑定 全选按钮的值. <template><div class"container"><input type"checkbox" v-model"checkAll&qu…

面了个蚂蚁金服拿38K出来的,真是砂纸擦屁股,给我露了一手啊

今年的春招结束&#xff0c;很多小伙伴收获不错&#xff0c;拿到了心仪的 offer。 各大论坛和社区里也看见不少小伙伴慷慨地分享了常见的面试题和八股文&#xff0c;为此咱这里也统一做一次大整理和大归类&#xff0c;这也算是划重点了。 俗话说得好&#xff0c;他山之石&…

小狐狸ChatGPT付费创作系统1.9.7独立版 + H5端 + 小程序前端增加AI绘画+GPT4接口

小狐狸ChatGPT 1.9.7独立版经播播资源测试了版本比较&#xff0c;本版核心增加了GPT4.0接口功能&#xff0c;小程序端内置了AI绘画功能。体验下来问答速度感觉体验更好。小程序端有更新请对应开发工具更新上传&#xff0c;本版无开源端。播播资源提供的安装教程详见下方&#x…

网路安全技能竞赛——【Linux操作系统渗透提权】解析(超级详细)

Linux操作系统渗透提权 任务环境说明&#xff1a; 服务器场景&#xff1a;Server2202&#xff08;关闭链接&#xff09;用户名&#xff1a;hacker 密码&#xff1a;123456 使用渗透机对服务器信息收集&#xff0c;并将服务器中SSH服务端口号作为flag提交&#xff1b;…

【Redis】聊一下Redis的哨兵机制

在上一篇文章中&#xff0c;我们学习了数据库的Redis的主从集群复制模式&#xff0c;如果从库出现问题&#xff0c;那么其他主从库还可以处理读写请求&#xff0c;但是如果主库宕机&#xff0c;写请求从库处理不了&#xff0c;整个系统就不可用了&#xff0c;虽然只处理只读请求…

Windows提权:利用MSSQL数据库,Oracle数据库

目录 MSSQL提权&#xff1a;使用xp_cmdshell进行提权 MSSQL&#xff1a;使用sp_OACreate进行提权 MSSQL&#xff1a;使用沙盒提权 Oracle提权&#xff1a;工具一把梭哈 总结 MSSQL在Windows server类的操作系统上&#xff0c;默认具有system权限。 MSSQL提权&#xff1a;使…

三、浅谈机器人的底盘设计

两电机差速底盘 方式1&#xff1a;驱动轮在后&#xff0c;万向轮在前&#xff08;支撑轮也可以换成全向轮&#xff0c;目的只是撑地&#xff09;&#xff0c;在一般的巡线比赛中较常用。 该底盘的优点&#xff1a;运动灵活&#xff0c;组装简单 该底盘的缺点&#xff1a;车体…

如何增加音频音量,给大家分享两个免费方法!

相信许多音频剪辑新手在刚开始的阶段需要探索学习各种操作方法。其中&#xff0c;许多用户发现自己的音频文件音量太小&#xff0c;想要增加音量&#xff0c;但却不知道使用哪种工具更好&#xff0c;如何操作更为方便。为此&#xff0c;我为您整理了两种方法&#xff0c;并向新…

docker的基本相关知识和操作

镜像相关操作命令&#xff1a; 访问DockerHub搜索镜像&#xff0c;https://hub.docker.com/ 查看本地镜像&#xff1a;docker images 搜索镜像 docker search redis &#xff08;搜索redis&#xff09; 拉取镜像&#xff1a;docker pull redis &#xff08;默认版本&#x…

Slow-Fast使用教程2023.5.30

项目地址 https://github.com/facebookresearch/SlowFast 安装教程 首先参考官方安装必须的包并下载项目文件&#xff1a;https://github.com/facebookresearch/SlowFast/blob/main/INSTALL.md 安装注意&#xff1a; 最好使用Linux系统&#xff0c;如果是windows系统&#xf…

3. JVM对象创建与内存分配机制深度剖析

JVM性能调优 1. 对象的创建1.1 类加载检查1.2 分配内存1.3 初始化1.4 设置对象头1.HotSpot虚拟机的对象头包括三部分信息&#xff1a;Mark Word、Klass Pointer类型指针、数组长度 1.5 执行<init>方法 2. 对象大小与指针压缩2.1 什么是java对象的指针压缩&#xff1f;2.2…

数据结构——链式二叉树

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C &#x1f525;座右铭&#xff1a;“不要等到什么都没有了&#xff0c;才下…

【云原生|探索 Kubernetes 系列 7】探究 Pod 有什么用,为什么需要它

前言 大家好&#xff0c;我是秋意零。 前一篇&#xff0c;我们介绍了如何从 0 到 1 搭建 Kubernetes 集群。现在我们可以正式了解&#xff0c;Kubernetes 核心特征了。 今天我们来探究 Pod&#xff0c;为什么需要 Pod&#xff1f; &#x1f47f; 简介 &#x1f3e0; 个人主页…

编程示例:求排列的逆,反序表,以及从反序表计算排列

编程示例&#xff1a;求排列的逆&#xff0c;反序表&#xff0c;以及从反序表计算排列 计算机程序设计艺术的第三卷 第五章排序中&#xff0c;第5.1.1节中 提到了排列的反序&#xff0c;反序表&#xff0c;逆的概念。 首先&#xff0c;简单地介绍一下这两个概念。例如一个排列…

RK3566 ALC5616录音调试

1.硬件原理图 MIC_P&#xff0c;MIC_N&#xff1a;mic输入。 I2S&#xff1a;总共有5根线&#xff08;这里不是指 i2s 标准接口&#xff09;&#xff1a;两根音频数据线&#xff08;输入/输出&#xff09;、三根时钟线 其中&#xff1a; I2S_LRCK 是指示当前数据线传输的是左声…

【网络】UDP的应用场景

文章目录 翻译功能命令行解析网络聊天室UDP之Windows与Linux 翻译功能 我们写的UDP服务端并不是只接收到数据就完了&#xff0c;还需要进行处理任务。 我们可以在服务端udpServer.hpp中设置一个回调函数 _callback&#xff0c;具体的逻辑通过udpServer.cc中由外部进行传入 代…

Windows系统安全基线

文章目录 前言一、安全基线概述1.操作系统安全基线 二、系统账户安全1.控制密码安全2.密码策略3.账户锁定策略例&#xff1a;密码策略应用例&#xff1a;账户锁定策略应用 三、本地策略1.审核策略2.用户权限分配3.安全选项配置例&#xff1a;审核策略应用例&#xff1a;用户权限…

软件测试理论----软件测试六大测试类型

1、功能测试&#xff1a;关注功能是否正确 常见的关注点 1&#xff09;是否有不正确或者遗漏的功能 2&#xff09;是否满足用户的需求和系统隐藏的需求 3&#xff09;输入能否正确接收&#xff0c;能否输出正确结果 2、可用性测试&#xff1a;关注产品是否好用 常见的关注点…

03灰度变换与空间滤波

文章目录 3灰度变换与空间滤波3.1背景知识3.1.1灰度变换和空间滤波基础 3.2一些基本的灰度变换函数3.2.1图像反转3.2.2对数变换3.2.3幂律&#xff08;伽马&#xff09;变换3.2.4分段线性变换函数 3.3直方图处理3.3.1直方图均衡3.3.2直方图匹配&#xff08;规定化&#xff09;3.…

webpack配置排除打包

webpack配置排除打包 思路 打包时&#xff0c;不要把类似于element-ui第三方的这些包打进来 从网络上&#xff0c;通过url地址直接引入这些包 操作 &#xff08;1&#xff09;先找到 vue.config.js&#xff0c; 添加 externals 项&#xff0c;具体如下&#xff1a; config…