关于Pytest fixture,我们了解多少?

关于Pytest fixtures,根据官方文档介绍:fixture用于提供一个固定的基线,使 Cases 可以在此基础上可靠地、重复地执行。

对比 PyUnit 经典的setup/teardown形式,它在以下方面有了明显的改进:
fixture拥有一个明确的名称,通过声明使其能够在函数、类、模块,甚至整个测试会话中被激活使用;

fixture以一种模块化的方式实现,原因在于每一个fixture的名字都能触发一个fixture函数,而这个函数本身又能调用其它的fixture;

fixture的管理从简单的单元测试扩展到复杂的功能测试,允许通过配置和组件选项参数化fixture和测试用例,或者跨功能、类、模块,甚至整个测试会话复用fixture。

一句话概括:在整个测试执行的上下文中,fixture扮演注入者(injector)的角色,而测试用例扮演消费者(client)的角色,测试用例可以轻松的接收和处理需要预初始化操作的应用对象,而不用过分关心其实现的具体细节。

fixture的实例化顺序

fixture支持的作用域(Scope):function(default)、class、module、package、session。

其中,package作用域是在 pytest 3.7 的版本中,正式引入的,目前仍处于实验性阶段。

多个fixture的实例化顺序,遵循以下原则:

高级别作用域的(例如:session)优先于 低级别的作用域的(例如:class或者function)实例化;

相同级别作用域的,其实例化顺序遵循它们在测试用例中被声明的顺序(也就是形参的顺序),或者fixture之间的相互调用关系;

指明autouse=True的fixture,先于其同级别的其它fixture实例化。

fixture实现teardown功能

有以下几种方法(注意:在yield之前或者addfinalizer注册之前代码发生错误退出的,都不会再执行后续的清理操作):

将fixture变为生成器方法(推荐)

即将fixture函数中的return关键字替换成yield,则yield之后的代码,就是我们要的清理操作。

@pytest.fixture(scope='session', autouse=True)
def clear_token():
    yield
    from libs.redis_m import RedisManager
    rdm = RedisManager()
    rdm.expire_token(seconds=60)

使用addfinalizer方法

fixture函数能够接收一个request的参数,表示测试请求的上下文(下面会详细介绍),我们可以使用request.addfinalizer方法为fixture添加清理函数。

@pytest.fixture()
def smtp_connection_fin(request):
    smtp_connection = smtplib.SMTP("smtp.163.com", 25, timeout=5)


    def fin():
        smtp_connection.close()


    request.addfinalizer(fin)
    return smtp_connection

使用with写法(不推荐)

对于支持with写法的对象,我们也可以隐式的执行它的清理操作:

@pytest.fixture()
def smtp_connection_yield():
    with smtplib.SMTP("smtp.163.com", 25, timeout=5) as smtp_connection:
        yield smtp_connection

fixture可以访问测试请求的上下文

fixture函数可以接收一个request的参数,表示测试用例、类、模块,甚至测试会话的上下文环境,例如可以扩展下上面的smtp_connection_yield,让其根据不同的测试模块使用不同的服务器:

@pytest.fixture(scope='module')
def smtp_connection_request(request):
    server, port = getattr(request.module, 'smtp_server', ("smtp.163.com", 25))
    with smtplib.SMTP(server, port, timeout=5) as smtp_connection:
        yield smtp_connection
        print("断开 %s:%d" % (server, port))

在测试模块中指定smtp_server:

smtp_server = ("mail.python.org", 587)
def test_163(smtp_connection_request):
    response, _ = smtp_connection_request.ehlo()
    assert response == 250

fixture返回工厂函数

如果需要在一个测试用例(function)中,多次使用同一个fixture实例,相对于直接返回数据,更好的方法是返回一个产生数据的工厂函数。并且,对于工厂函数产生的数据,也可以在fixture中对其管理:

@pytest.fixture
def make_customer_record():


    # 记录生产的数据
    created_records = []


    # 工厂
    def _make_customer_record(name):
        record = models.Customer(name=name, orders=[])
        created_records.append(record)
        return record


    yield _make_customer_record


    # 销毁数据
    for record in created_records:
        record.destroy()




def test_customer_records(make_customer_record):
    customer_1 = make_customer_record("Lisa")
    customer_2 = make_customer_record("Mike")
    customer_3 = make_customer_record("Meredith")

fixture的参数化

如果你需要在一系列的测试用例的执行中,每轮执行都使用同一个fixture,但是有不同的依赖场景,那么可以考虑对fixture进行参数化,这种方式适用于对多场景的功能模块进行详尽的测试。

@pytest.fixture(scope='module', params=['smtp.163.com', "mail.python.org"])
def smtp_connection_params(request):
    server = request.param
    with smtplib.SMTP(server, 587, timeout=5) as smtp_connection:
        yield smtp_connection


def test_parames(smtp_connection_params):
    response, _ = smtp_connection_params.ehlo()
    assert response == 250

在不同的层级上覆写fixture

注意:低级别的作用域可以调用高级别的作用域,但是高级别的作用域调用低级别的作用域会返回一个ScopeMismatch的异常。

在大型的测试中,可能需要在本地覆盖项目级别的fixture,以增加可读性和便于维护:

@pytest.fixture(scope="module", autouse=True)
def init(frag_login):
    pass


@pytest.fixture(scope='session')
def active_user_account(cmd_line_args, conf):
    tail_num = cmd_line_args.get("tailnum", None)
    if tail_num is None:
        tail_num = "1"
    for user in conf['unified']:
        if str(user['uid'])[-1] == tail_num:
            return user
    msg = f"尾号[{tail_num}], 在配置文件中未找到"
    logger.error(msg)
    raise ValueError(msg)

最后感谢每一个认真阅读我文章的人,下方这份完整的软件测试教程已经整理上传完成,需要的朋友们可以文末自行领取:【保证100%免费】

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux 之 fdisk 【磁盘分区管理】

删除分区 1.查看磁盘信息 lsblk 2.删除分区sdb硬盘下的所有分区 # 1 进入d的磁盘分区 fdisk /dev/sdb # 2 输入p查看磁盘的分区信息 # 3 输入d进入删除磁盘分区命令 # 4 选择要删除的分区号 重复3,4 全部删除 # 5 w 保存退出并生效操作信息 (输入q…

postman使用——在公司的项目落地回顾总结

背景 使用postman做接口自动化以及有差不多一年了,迭代更新了也差不多一年了,本篇文章主要介绍与总结: 为什么使用postman做自动化如何使用postman做接口自动化实际落地的方案实施postman优势与限制 为什么使用postman做接口自动化 有以下…

ORACLE在企业中的运用及岗位介绍

微思 | Oracle 19C OCP 认证培训 厦门面授班 | 全国直播班 同步上课 课程介绍:Oracle OCP 19C课程介绍 培训讲师—吴振兴 往期考试战报:【ORACLE战报】 OCP 认证 OCP :Oracle 数据库认证专家( Oracle Certified Professional…

【Linux系列】在 Linux 中使用 `watch` 命令监控 Docker 容器状态

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【Linux】僵尸进程和孤儿进程

一、僵尸进程 何为僵尸进程? 在 Unix/Linux 系统中,正常情况下,子进程是通过父进程创建的,且两者的运行是相互独立的,父进程永远无法预测子进程到底什么时候结束。当一个进程调用 exit 命令结束自己的生命时&#xff…

FineReport 全局参数

全局参数与模板参数的区别如下: 1)全局参数:当前工程下的所有模板都可以使用。 2)模板参数:只有当前模板才可以使用 注:全局参数 area 并不是在当前模板下创建的,但是可以在模板中直接调用 全…

C++ 十进制数转换成7进制字符串

题目要求&#xff1a; 给定一个整数 num&#xff0c;将其转化为 7 进制&#xff0c;并以字符串形式输出。 C源码&#xff1a; #include "stdafx.h" #include <String> using namespace std;string convertToBase7(int num) {int tempNum num;char t;string…

WGCLOUD可以监控GPU吗

可以的 采集主机GPU信息功能&#xff0c;是WGCLOUD v3.5.5新增的一个功能模块&#xff0c;所以需要升级到v3.5.5或者以上版本 我们在主机管理的列表页面&#xff0c;点击【查看更多】->【扩展监控】按钮&#xff0c;就可以看到该主机的GPU信息 agent每间隔10分钟就会采集一…

DES对称加密算法

DES&#xff08;Data Encryption Standard&#xff0c;数据加密标准&#xff09;是一种对称加密算法。 算法概述 加密类型&#xff1a;对称加密&#xff08;同一密钥用于加密和解密&#xff09;。密钥长度&#xff1a;64位&#xff08;8字节&#xff09;&#xff0c;其中有效…

基于SSM网络在线考试系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;学生管理&#xff0c;在线考试管理&#xff0c;试题管理&#xff0c;考试管理&#xff0c;系统管理 前台账号功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;在线考试&#xff0c;公告信…

最新物流行业CRM系统应用数字化解决方案

因势利导 ——全球化物流的挑战与机遇 在全球经济一体化与互联网技术快速发展的双重驱动下,物流行业正经历着前所未有的变革时期。这一变革不仅影响 着行业的发展模式,还对运营效率和客户体验提出了新的要求。 随着市场需求的不断演变,物流行业已呈现出多元化和专业 化并行的发…

OpenCV双目视觉三角测量代码实现C++

在双目视觉系统中&#xff0c;三角测量是一种基于几何原理的三维重建技术&#xff0c;通过分析同一场景在两个不同视角下的二维图像来确定物体的三维坐标。这种方法的核心在于利用摄像机的内参和相对位姿&#xff08;由旋转矩阵和平移向量描述&#xff09;&#xff0c;将图像中…

数据科学家必须掌握的12个Python功能

Python 已经成为数据科学家的必选语言&#xff0c;从数据处理到机器学习&#xff0c;它几乎无所不能。本文将探讨一些Python特性&#xff0c;这些特性不仅能帮助你编写更高效、更易读、更易维护的代码&#xff0c;还特别适合数据科学的需求&#xff0c;使你的代码简洁且优雅。 …

mysql8 使用idb文件实现数据备份

文章目录 1.备份脚本示例2.设置 Cron 任务3. 数据恢复 本文档只是为了留档方便以后工作运维&#xff0c;或者给同事分享文档内容比较简陋命令也不是特别全&#xff0c;不适合小白观看&#xff0c;如有不懂可以私信&#xff0c;上班期间都是在得 需求&#xff0c;在离线情况下实…

【Linux】————磁盘与文件系统

作者主页&#xff1a; 作者主页 本篇博客专栏&#xff1a;Linux 创作时间 &#xff1a;2024年10月17日 一、磁盘的物理结构 磁盘的物理结构如图所示&#xff1a; 其中具体的物理存储结构如下&#xff1a; 磁盘中存储的基本单位为扇区&#xff0c;一个扇区的大小一般为512字…

研发运营一体化(DevOps)能力成熟度模型

目录 应用设计 安全风险管理 技术运 持续交付 敏捷开发管理 基于微服务的端到端持续交付流水线案例 应用设计 安全风险管理 技术运 持续交付

14 django管理系统 - 注册与登录 - 注销

首先先创建注销的入口&#xff0c;在base.html中修改 <ul class"nav navbar-nav navbar-right"><li><a href"/account/login/">登录</a></li><li><a href"/account/register/">注册</a></l…

2024互联网大厂营收排名:京东/阿里/华为前三,超多技术岗都在热招!

2024年已经过去一大半&#xff0c;各大互联网大厂的竞争如火如荼&#xff0c;营收都取得了不俗的成绩&#xff0c;京东、阿里、华为分别占领前三&#xff01; 第四第五名则为华为和拼多多。 根据排行榜里的公司名单&#xff0c;小码特意为大家整理了一批各大厂的招聘岗位。 阿…

信息学奥赛复赛复习18-CSP-J2023-01小苹果-向上取整、向下取整、模拟算法

PDF文档回复:20241021 1 P9748 [CSP-J 2023] 小苹果 [题目描述] 小 Y 的桌子上放着 n 个苹果从左到右排成一列&#xff0c;编号为从 1 到 n。 小苞是小 Y 的好朋友&#xff0c;每天她都会从中拿走一些苹果。 每天在拿的时候&#xff0c;小苞都是从左侧第 1 个苹果开始、每隔…

微信碰一碰支付系统有哪些好的?教程详解抢先看!

支付宝“碰一碰支付”的风刚刚刮起来&#xff0c;它的老对手微信便紧随其后&#xff0c;推出了自己的碰一碰支付设备&#xff0c;再次印证了这个项目市场前景广阔的同时&#xff0c;也让与碰一碰支付系统相关问题的热度又上了一层楼&#xff0c;尤其是微信碰一碰支付系统有哪些…