深度解析 Pytest 中的 conftest.py

关注开源优测不迷路

大数据测试过程、策略及挑战

测试框架原理,构建成功的基石

在自动化测试工作之前,你应该知道的10条建议

在自动化测试中,重要的不是工具

在使用 Pytest 进行测试的过程中,conftest.py 文件扮演着极为重要的角色。它犹如一个隐藏的魔法盒,里面装满了各种强大的工具,能让我们的测试工作变得更加高效、便捷且灵活。今天,我们就来揭开这个魔法盒的神秘面纱,深入了解 conftest.py 的详细内容。

一、conftest.py 的核心功能概述

1.1 测试夹具(Fixtures)的集中管理

conftest.py 文件是存放测试夹具(Fixtures)的理想场所。测试夹具就像是测试用例执行时的得力助手,能够为测试提供各种必要的资源,如数据、对象、环境等。通过在 conftest.py 中定义测试夹具,我们可以在多个测试模块中轻松地共享和复用这些资源,避免了在每个测试文件中重复编写相同的准备代码,大大提高了代码的可维护性和测试效率。


1.2 钩子函数(Hooks)的定义与实现

除了测试夹具,conftest.py 还允许我们定义各种钩子函数(Hooks)。这些钩子函数就像是一个个监听器,在测试执行的不同阶段被触发,从而让我们能够在特定的时机插入自定义的代码逻辑。例如,我们可以利用钩子函数在测试开始前进行一些全局的初始化操作,或者在测试结束后进行资源清理和结果收集等工作。钩子函数为我们提供了一种强大的扩展机制,使得 Pytest 框架能够更好地适应不同项目的特定需求。


1.3 测试环境的统一配置

在一个复杂的测试项目中,往往需要对测试环境进行统一的配置和管理。conftest.py 文件可以作为一个集中的配置中心,用于设置测试环境的各种参数和选项,如数据库连接信息、日志记录级别、测试数据的路径等。通过在 conftest.py 中进行统一的环境配置,我们能够确保所有的测试用例在一致的环境下运行,减少因环境差异导致的测试结果不一致性,提高测试的可靠性和稳定性。

二、测试夹具(Fixtures)在 conftest.py 中的运用

2.1 定义测试夹具的基本语法

在 conftest.py 文件中,我们可以使用@pytest.fixture装饰器来定义测试夹具。下面是一个简单的示例,展示了如何定义一个返回整数列表的测试夹具:

import pytest@pytest.fixture
def sample_data():return [1, 2, 3, 4, 5]

2.2 测试夹具的作用域(Scope)设置

测试夹具的作用域决定了它的生命周期以及在哪些测试用例中可用。Pytest 提供了多种作用域选项,包括function(函数级)、module(模块级)、session(会话级)等。

  • 函数级作用域(function):这是默认的作用域设置。每次调用使用该夹具的测试函数时,都会重新创建和销毁该夹具。例如:

@pytest.fixture(scope='function')def function_scope_fixture():print("创建函数级作用域夹具")yieldprint("销毁函数级作用域夹具")def test_function_scope(function_scope_fixture):print("执行函数级作用域测试用例")
  • 模块级作用域(module):在整个测试模块中,该夹具只会被创建一次,并且在模块内的所有测试用例中共享。例如:

@pytest.fixture(scope='module')def module_scope_fixture():print("创建模块级作用域夹具")yieldprint("销毁模块级作用域夹具")def test_module_scope_1(module_scope_fixture):print("执行模块级作用域测试用例1")def test_module_scope_2(module_scope_fixture):print("执行模块级作用域测试用例2")
  • 会话级作用域(session):整个测试会话中,该夹具只会被创建一次,并且在所有测试模块中共享。通常用于一些昂贵的资源初始化,如数据库连接池的创建等。例如:

@pytest.fixture(scope='session')def session_scope_fixture():print("创建会话级作用域夹具")yieldprint("销毁会话级作用域夹具")def test_session_scope_1(session_scope_fixture):print("执行会话级作用域测试用例1")def test_session_scope_2(session_scope_fixture):print("执行会话级作用域测试用例2")

2.3 测试夹具的参数化

我们还可以对测试夹具进行参数化,以便在不同的测试用例中使用不同的夹具参数。通过@pytest.fixture装饰器的params参数来实现。例如:

import pytest@pytest.fixture(params=[1, 2, 3])
def parameterized_fixture(request):return request.paramdef test_parameterized(parameterized_fixture):print(f"使用参数化夹具的值:{parameterized_fixture}")

在上述示例中,parameterized_fixture夹具将会被调用三次,每次传入不同的参数值(1、2、3),对应的测试用例也会执行三次,分别使用不同的参数值进行测试。

2.4 测试夹具的自动使用(autouse)

有时候,我们希望某些测试夹具在所有测试用例中自动被使用,而无需在每个测试函数中显式地传入夹具参数。这时候,可以通过设置autouse=True来实现。例如:

import pytest@pytest.fixture(autouse=True)
def setup_and_teardown():print("在所有测试用例之前执行:设置操作")yieldprint("在所有测试用例之后执行:清理操作")def test_example():print("执行测试用例")

在这个例子中,setup_and_teardown夹具会在每个测试用例执行前自动进行设置操作,在测试用例执行后自动进行清理操作,无需在test_example函数中显式传入夹具参数。


三、钩子函数(Hooks)在 conftest.py 中的实现

3.1 常用钩子函数介绍

Pytest 提供了丰富的钩子函数,以下是一些常用的钩子函数及其用途:

  • pytest_configure(config):在测试开始前进行全局的配置操作,可以修改配置对象的属性,如添加自定义的命令行选项、设置测试结果报告的格式等。

  • pytest_sessionstart(session):在测试会话开始时被调用,用于执行一些一次性的初始化操作,如创建测试结果目录、初始化数据库连接等。

  • pytest_sessionfinish(session, exitstatus):在测试会话结束时被调用,可以进行资源清理和测试结果收集等工作,如关闭数据库连接、生成测试报告等。

  • pytest_collection_modifyitems(items):在测试用例收集完成后被调用,可以对收集到的测试用例列表进行修改和筛选,例如根据标记(mark)过滤某些测试用例、重新排序测试用例等。


3.2 钩子函数的使用示例

下面是一个简单的示例,展示了如何在 conftest.py 中使用pytest_sessionstartpytest_sessionfinish钩子函数来记录测试会话的开始和结束时间:

import pytestimport timedef pytest_sessionstart(session):session.start_time = time.time()print("测试会话开始")def pytest_sessionfinish(session, exitstatus):end_time = time.time()print(f"测试会话结束,耗时:{end_time - session.start_time}秒")

在这个例子中,当测试会话开始时,pytest_sessionstart钩子函数会记录当前时间到session.start_time属性中。当测试会话结束时,pytest_sessionfinish钩子函数会计算并打印出测试会话的耗时。


四、conftest.py 的作用域与模块层级关系

4.1 作用域的层次结构

conftest.py 文件的作用域是有层次结构的。在一个项目中,可以存在多个 conftest.py 文件,它们分别位于不同的目录层级。最顶层的 conftest.py 文件(通常位于项目根目录)的作用域最广,其定义的测试夹具和钩子函数可以在整个项目的所有测试模块中使用。而位于子目录中的 conftest.py 文件,其作用域仅限于该子目录及其子目录下的测试模块。


4.2 模块层级对测试夹具和钩子函数的影响

这种模块层级关系对测试夹具和钩子函数的使用有一定的影响。例如,如果在子目录中的测试模块需要使用顶层 conftest.py 中定义的测试夹具,它可以直接使用,无需额外的导入操作。但是,如果子目录中的 conftest.py 也定义了同名的测试夹具,那么子目录中的测试模块将优先使用本地定义的夹具,而不会使用顶层的同名夹具。这为我们在不同层级的测试中提供了灵活的定制和隔离机制,使得我们可以根据具体的测试需求,在不同的层级上合理地定义和使用测试资源。

五、conftest.py 在实际项目中的最佳实践

5.1 合理组织测试夹具和钩子函数

在实际项目中,随着测试用例的增加和测试需求的复杂化,conftest.py 文件可能会变得越来越庞大。为了保持代码的可读性和可维护性,我们需要合理地组织测试夹具和钩子函数。可以按照功能模块或者测试类型将相关的夹具和钩子函数分组,通过添加适当的注释和文档字符串来解释其用途和使用方法。


5.2 避免过度使用全局状态

虽然 conftest.py 提供了一种方便的全局共享资源的方式,但过度使用全局状态可能会导致测试之间的耦合度增加,使得测试用例变得难以理解和维护。在定义测试夹具和钩子函数时,要尽量遵循单一职责原则,避免在一个夹具或钩子函数中做过多无关的操作,同时要注意资源的正确清理和释放,防止资源泄漏。


5.3 结合插件扩展功能

Pytest 拥有丰富的插件生态系统,我们可以结合一些插件来进一步扩展 conftest.py 的功能。例如,使用pytest-cov插件可以在 conftest.py 中配置代码覆盖率统计,使用pytest-xdist插件可以实现测试用例的分布式执行等。通过合理地选择和使用插件,能够更好地满足项目的测试需求,提高测试效率和质量。


5.4 改进和优化

随着项目的不断发展,测试需求和环境可能会发生变化。因此,我们需要定期回顾 conftest.py 文件中的代码,根据实际情况进行优化和调整。删除不再使用的测试夹具和钩子函数,修复可能出现的性能问题或兼容性问题,确保 conftest.py 始终能够有效地支持项目的测试工作。

通过以上对 conftest.py 的详细解析,我们可以看到它在 Pytest 测试框架中是一个非常强大且灵活的工具。熟练掌握 conftest.py 的使用方法,能够帮助我们更好地组织测试代码、管理测试资源、扩展测试功能,从而提高测试效率和质量,为项目的稳定发展提供有力的保障。

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

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

相关文章

【python】银行客户流失预测预处理部分,独热编码·标签编码·数据离散化处理·数据筛选·数据分割

数据预处理 通过网盘分享的文件:银行流失预测数据和代码 链接: https://pan.baidu.com/s/1loiB8rMvZArfjJccu4KW6w?pwdpfcs 提取码: pfcs 非数值特征处理 目的:将非数值特征转换为数值型,以便模型能够处理。方法: 地理位置&am…

回归预测 | MATLAB实现CNN-LSSVM卷积神经网络结合最小二乘支持向量机多输入单输出回归预测

回归预测 | MATLAB实现CNN-LSSVM卷积神经网络结合最小二乘支持向量机多输入单输出回归预测 目录 回归预测 | MATLAB实现CNN-LSSVM卷积神经网络结合最小二乘支持向量机多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 回归预测 | MATLAB实现CNN-LSSVM…

深入探讨 Go 中的高级表单验证与翻译:Gin 与 Validator 的实践之道20241223

深入探讨 Go 中的高级表单验证与翻译:Gin 与 Validator 的实践之道 在现代后端开发中,表单验证是保证数据完整性和服务稳定性的核心环节。如何优雅、高效地实现表单验证,同时提供人性化的错误提示,是每位开发者的必修课。在本文中…

掌握 Ansys ACP 中的参考方向:简化复杂的复合材料设计

概括 在复合材料分析领域,精度至关重要,尤其是在定义纤维方向和铺层时。Ansys ACP(Ansys Composite PrepPost)提供了强大的工具来建立参考方向,这是实现精确结构模拟的关键步骤。在本博客中,我们将揭开在 …

Vue2学习(一)——Vue简介、Vue指令与指令修饰符

一、Vue简介 Vue是一套用于构建用户界面的渐进式框架。 所谓渐进式就是循序渐进,不一定非得把Vue中的所有API都学完才能开发Vue,可以学一点开发一点。 Vue2官网地址:https://v2.cn.vuejs.org/ Vue3官网地址:https://cn.vuejs…

Redis--通用命令学习

目录 一、引言 二、基础命令 1.set 2.get 3.keys 3.1 keys ? 3.2 keys * 3.3 keys [abe] 3.4 keys [^] 3.5 keys [a-b] 4.exists 5.delete 6.expire 7.ttl 8.type 三、Redis中的过期策略(面试题) 1.惰性删除 2.定期删除 …

PostgreSQL 的历史

title: PostgreSQL 的历史 date: 2024/12/23 updated: 2024/12/23 author: cmdragon excerpt: PostgreSQL 是一款功能强大且广泛使用的开源关系型数据库管理系统。其历史可以追溯到1986年,当时由加州大学伯克利分校的一个研究团队开发。文章将深入探讨 PostgreSQL 的起源、…

WPS工具栏灰色怎么办

WPS离线不登录,开启工具栏等相关功能 当你在使用WPS的过程中,若因网络问题或其他特殊原因,导致无法登录使用WPS时,可根据以下步骤开启离线兼容模式,开启此模式后,可在未登录的状态下,激活并使用…

国标GB28181-2022平台EasyGBS:安防监控中P2P的穿透方法

在安防监控领域,P2P技术因其去中心化的特性而受到关注,尤其是在远程视频监控和数据传输方面。P2P技术允许设备之间直接通信,无需通过中央服务器,这在提高效率和降低成本方面具有明显优势。然而,P2P技术在实际应用中也面…

com.google.common.collect.ImmutableList$SerializedForm

今天AndroidStudio安装了个2021版本的,gradle用了7.3.3,创建项目后控制台总是有这样一个错误: Unable to load class com.google.common.collect.ImmutableList$SerializedForm. This is an unexpected error. Please file a bug containing…

Docker部署Sentinel

一、简介 是什么:面向分布式、多语言异构化服务架构的流量治理组件 能干嘛:从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性 官网地址:https://sentinelguard.io/zh-c…

HTMLCSSJavaScriptDOM 之间的关系?

一、HTML 中文名:超文本标记语言 英文名:HyperText Markup Language HTML是一种用来结构化Web网页及其内容的标记语言。 HTML 由一系列的元素组成,这些元素可以用来包围不同部分的内容,使其以某种方式呈现或者工作。 图Ⅰ 每…

Hadoop集群(HDFS集群、YARN集群、MapReduce​计算框架)

一、 简介 Hadoop主要在分布式环境下集群机器,获取海量数据的处理能力,实现分布式集群下的大数据存储和计算。 其中三大核心组件: HDFS存储分布式文件存储、YARN分布式资源管理、MapReduce分布式计算。 二、工作原理 2.1 HDFS集群 Web访问地址&…

施耐德变频器ATV320系列技术优势:创新与安全并重

在工业自动化领域,追求高效、安全与智能已成为不可阻挡的趋势。施耐德变频器ATV320系列凭借其强大的设计标准和全球认证,成为能够帮助企业降低安装成本,提高设备性能的创新解决方案。 【全球认证,品质保障】ATV320 系列秉持施耐德…

Linux挖矿程序排查

一、背景 我们收到一个阿里云安全告警,内容是服务器可能存在挖矿程序。 二、杀死挖矿程序 2.1 找到可疑服务器进程 #1.输入top命令,输入shift P会按照cpu的使用率大小从大到小进行排序,cpu使用率高的就是可疑进程。 top #2.查看运行该进程…

zabbix监控山石系列Hillstone配置模版(适用于zabbix6及以上)

监控项: 触发器: 监控数据:

PE文件结构

PE文件是Windows系统下可执行文件的总称,英文全称 Portable Executable 可移植的可执行文件,常见的有exe、dll、sys、com、ocx 对于学习反(木马、免杀、病毒、外挂、内核),了解PE文件结构是非常有必要且非常非常重要的…

网络安全词云图与技术浅谈

网络安全词云图与技术浅谈 一、网络安全词云图生成 为了直观地展示网络安全领域的关键术语,我们可以通过词云图(Word Cloud)的形式来呈现。词云图是一种数据可视化工具,它通过字体大小和颜色的差异来突出显示文本中出现频率较高…

fpgafor循环语句使用

genvar i;//循环变量名称 generate for(i0;i<4;ii1)begin:tx//自己定义名称 //循环内容 end endgenerate12位的16进制乘以4就是48位位宽的2进制 因为 222*2(2^4)16

修改采购订单BAPI学习研究-BAPI_PO_CHANGE

这里是修改采购订单BAPI&#xff0c;修改订单数量和交货日期的简单应用 文章目录 修改数量代码运行结果 修改交货日期代码运行结果 修改数量 代码 *&---------------------------------------------------------------------* *& Report Z_BAPI_PO_CHANGE *&----…