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

背景:

这几天在调试之前搭建的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://xiahunao.cn/news/250961.html

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

相关文章

phpredis中文手册——《redis中文手册》 php版

redis中文手册:http://readthedocs.org/docs/redis/en/latest/ 本文是参考《redis中文手册》,将示例代码用php来实现,注意php-redis与redis_cli的区别(主要是返回值类型和参数用法)。 目录(使用CTRLF快速查找命令)&am…

PHP - Manual手册 - 下载

PHP - Manual手册 - 下载 [PHP: Download documentation:] http://www.php.net/download-docs.php [PHP - 官方网站] http://www.php.net/ [PHP - 关键词] php [PHP - 相关论坛] http://php.board.newsmth.net/ http://bbs.pku.edu.cn/, homepage看版 http://forum.cs…

PHP手册的使用

一、登录PHP在线手册。 打开PHP的官网“http://php.net”,然后点击导航栏中的“Documentation”切换到PHP手册文档页面,在“View Online”在线手册查看页面选择“Chinese(Simplified)”中文版后,即可以看到手册的首页界面。 二、手册的使用。…

PHP入门介绍及语言基础

🌱博客主页:大寄一场. 😘博客制作不易欢迎各位👍点赞⭐收藏➕关注 目录 前言 一、变量和数据类型 二、运算符和表达式 三、条件语句 四、循环语句 前言 PHP是一种非常流行的开源服务器端脚本语言,广泛用于Web开发…

Linux 权限

目录 一、 从问题开始 问题一: 什么叫shell? 问题二: 为什么不能直接使用kernel呢? 问题三: shell 与bash 有什么不同吗? 二、 Linux权限 0x01 Linux用户 0x02 切换用户命令 0x03 sudo命令 0x04 权限的相关概念 0x05 chmod 0x06 chown 0x07 chgrp 0x08 文件权…

图灵聊天机器人小程序

历时半年整理出了十多万字的学习笔记,目前依旧在更新 欢迎点赞和支持~🥳🥳🥳 博客 项目描述: 根据图灵API向聊天机器人发送聊天信息,并渲染返回的数据。具有清空聊天记录的按钮。本来是想上线…

机器学习模型的生命周期

动动发财的小手,点个赞吧! 您的模型如何变化?Source[1] 诞生 当我们构建、训练、拟合或估计我们的模型时,这些数字工具就诞生了。这个阶段几乎从拥有分析目标、数据、计算机、算法以及数据科学家现在已经非常了解的其他一切开始。…

PHP 微信小程序 WebSocket MySQL Redis实现聊天功能

1.Mysql 实现离线消息池。如果一个用户不在线,则其他用户发送给他的消息暂时存储在mysql。待该用户上线时,再从离线消息池取出发送。 2.Redis 实现每个连接websocket的服务都唯一绑定一个用户。通过用户账号 fd 存到redis中。 微信小程序:…

python实现简单的聊天小程序

概要 这是一个使用python实现一个简单的聊天室的功能,里面包含群聊,私聊两种聊天方式.实现的方式是使用套接字编程的一个使用TCP协议 c/s结构的聊天室 实现思路 x01 服务端的建立 首先,在服务端,使用socket进行消息的接受,每接受一个socket的请求,就开启一个新的线程来管理…

小程序即时聊天服务器wss,Socket/WS/WSS和小程序

Socket 通信 Socket 不属于网络协议范畴,而是在应用层和传输层之间的一个抽象层,它把 TCP/IP 层复杂的操作抽象为几个简单的接口供应用层调用。通过调用 Socket 使得程序员可以更方便地使用 TCP/IP 协议栈。 Socket 连接是长连接,理论上客户端和服务器端一旦建立连接将不会主…

用Python写一个模拟qq聊天小程序的代码实例

前言 今天小编就为大家分享一篇关于用Python写一个模拟qq聊天小程序的代码实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧 Python 超简单的聊天程序 客户端: 服务器: 模拟qq聊…

支付宝小程序平台的IM聊天插件

文章目录 前言一、用户端1.基本展示2.难处理的点二、另一用户端1.前端websocket的整合2.手机息屏websocket断线问题2.websocket服务端配置3.后端整合websocket作为服务端,传输消息给前端 总结 前言 最近工作需求来了个项目,前景为在支付宝平台上发布一个…

微信小程序——聊天小程序(从搭建到结束)

具体效果展示: 微信小程序——聊天功能(一、环境搭建) 微信小程序——聊天功能(一、环境搭建)_星^0^星的博客-CSDN博客 微信小程序——聊天功能(二、账号的注册与登录) 微信聊天小程序——&a…

Java-多人聊天小程序

上图啦!!! 首先运行: Server.java 然后启动: Client.java 最后退出客户端: 代码实现 Client package chat;import javax.swing.*;public class Client {public static void main(String[] args) {// 使用…

7步搞懂手写数字识别Mnist

大家好啊,我是董董灿。 图像识别有很多入门项目,其中Mnist 手写数字识别绝对是最受欢迎的。 该项目以数据集小、神经网络简单、任务简单为优势,并且集合了CNN网络中该有的东西,可谓麻雀虽小,五脏俱全。 非常适合新手…

二开项目权限应用全流程-按钮级控制

二开项目权限应用全流程-按钮级控制 员工A和员工B都可以访问同一个页面(以员工管理为例),但是员工A可以导出excel,员工B就不可以导出excel(看不到按钮) 思路 用户登陆成功后,用户可以访问的按钮级别权限保存在point…

VISIO使用技巧汇总

0.连接线拐弯或者连接不合适 0-0.Goal ​​​​​​​ 0-1. Automatic connection 0-3.Resolvent 0-3-0.ALTF9选项,取消粘附位置调整 0-3-1.选中线段-选中中心点-shift增加直角调整合适位置

Microsoft Visio 直线连接线

Microsoft Visio 直线连接线 1. 连接线 2. 直线连接线 3. 直线连接线图 References https://yongqiang.blog.csdn.net/

visio画太极图

步骤一 添加两个圆,且大圆的半径是小圆的2倍。 步骤二 往小圆添加一条直线作为直径 步骤三 选中小圆和直径,依次点击开发工具–操作–连接,然后选中连接后的小圆,再依次点击开发工具–操作–修建,可以分离出如下所示的两个…

visio 2007 画直线和矩形

visio 2007 画直线和矩形 1.问题描述 在一些图形中如果直接用连接线,会直接连到一些不理想的位置,而2007中不像2013及其以后那些版本中,有侧边栏能够直接画直线。 2.解决方式 直接选择工具栏中的红圈中的图标 能够生成红圈中的工具栏 然…