深度解析 Pytest 中的 conftest.py

news2024/12/26 16:26:58

关注开源优测不迷路

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

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

在自动化测试工作之前,你应该知道的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("创建函数级作用域夹具")
    yield
    print("销毁函数级作用域夹具")


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

@pytest.fixture(scope='module')


def module_scope_fixture():
    print("创建模块级作用域夹具")
    yield
    print("销毁模块级作用域夹具")


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("创建会话级作用域夹具")
    yield
    print("销毁会话级作用域夹具")


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.param


def 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("在所有测试用例之前执行:设置操作")
    yield
    print("在所有测试用例之后执行:清理操作")


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 pytest


import time


def 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.coloradmin.cn/o/2265923.html

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

相关文章

使用Vue的props进行组件传递校验时出现 Extraneous non-props attributes的解决方案

作者:CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 使用环境:WebStorm 目录 出现错误的情况 报错: 代码: 报错截图 原因分析 解决方案 方法一 方法二 出现错误的情况 以下是我遇到该错误时遇到的报错和代码&…

基础运维学习计划-base版

目录 需要学习的内容? liunx基础 sql/mysql基础 tcp/ip协议基础 http基础 dns基础 网络基础:交换&路由概念&原理 常见网络协议 月学习计划 12.26 日 (bilibili自己找视频看看,资源很多) 12.27日 1…

亚信安全与方天股份达成战略合作,双向奔赴助力数字化转型

近日,亚信安全科技股份有限公司(以下简称“亚信安全”)正式与青岛方天科技股份有限公司(以下简称“方天股份”)签订合作框架协议。双方强强携手,在网络安全运营平台共建、信息化项目安全支撑、政企市场拓展…

117.【C语言】数据结构之排序(选择排序)

目录 1.知识回顾 2.分析 设想的思路 代码 执行结果 ​编辑 错误排查和修复 详细分析出错点 执行结果 3.正确的思路 4.其他问题 1.知识回顾 参见42.5【C语言】选择排序代码 点我跳转 2.分析 知识回顾里所提到的文章的选择排序一次循环只比一个数字,和本文接下来要…

画展在线上通过虚拟展厅展览,如何实现?有何好处?

画展在线上通过虚拟展厅展览的实现方式及好处可以归纳如下: 一、实现方式 1、技术基础: 虚拟现实(VR)技术:利用VR技术,观众可以佩戴VR设备身临其境地参观展厅,与展品进行直观互动。 三维建模…

WordPress Tutor LMS插件 SQL注入漏洞复现(CVE-2024-10400)

0x01 产品简介 WordPress Tutor LMS插件是一款功能丰富且强大的学习管理系统(LMS)插件,它专为WordPress平台设计,旨在帮助用户轻松创建、管理和销售在线课程。功能强大且易于使用的学习管理系统插件。它提供了完整的在线课程市场解决方案,帮助用户轻松创建、管理和销售在…

Spring源码_05_IOC容器启动细节

前面几章,大致讲了Spring的IOC容器的大致过程和原理,以及重要的容器和beanFactory的继承关系,为后续这些细节挖掘提供一点理解基础。掌握总体脉络是必要的,接下来的每一章都是从总体脉络中, 去研究之前没看的一些重要…

主流AI视频生成工具|Sora零基础入门指南

Sora是什么? Sora 是 OpenAI 推出的新一代 AI 视频生成工具。它能让用户通过简单的文本描述或图片提示,快速生成高质量的视频内容。无论是广告短片、创意视频,还是实验性艺术作品,Sora 都能帮助创作者以极低的门槛实现自己的想法。…

VUE3+django接口自动化部署平台部署说明文档(使用说明,需要私信)

网址连接:http://118.25.110.213:5200/#/login 账号/密码:renxiaoyong 1、VUE3部署本地。 1.1本地安装部署node.js 1.2安装vue脚手架 npm install -g vue/cli # 或者 yarn global add vue/cli1.3创建本地项目 vue create my-vue-project1.4安装依赖和插…

“乡村探索者”:村旅游网站的移动应用开发

3.1 可行性分析 从三个不同的角度来分析,确保开发成功的前提是有可行性分析,只有进行提前分析,符合程序开发流程才不至于开发过程的中断。 3.1.1 技术可行性 在技术实现层次,分析了好几种技术实现方法,并且都有对应的成…

Docker完整技术汇总

Docker 背景引入 在实际开发过程中有三个环境,分别是:开发环境、测试环境以及生产环境,假设开发环境中开发人员用的是jdk8,而在测试环境中测试人员用的时jdk7,这就导致程序员开发完系统后将其打成jar包发给测试人员后…

天特量子生物肿瘤电场仪

在医疗科技飞速发展的今天,一种名为“天特量子肿瘤电场治疗仪”的创新设备正逐步成为肿瘤治疗领域的一颗璀璨新星。这款由河南省天特量子医疗科技有限公司(以下简称“天特量子”)倾力打造的治疗仪,以其独特的无创治疗、精准定位、…

LeetCode:257. 二叉树的所有路径

跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:257. 二叉树的所有路径 给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根…

知识增强式生成KAG

随着人工智能技术的不断发展,尤其是在自然语言处理领域,知识增强式生成(KAG)作为一种新兴的技术框架,正逐步脱颖而出。与其前身——检索增强式生成(RAG)相比,KAG在处理特定领域知识、…

GitLab的卸载与重装

目录 一、GitLab的卸载 二、 GitLab的安装与配置 1. 创建安装目录 2. 安装 3. 使用 3.1 初始化 3.2 创建空白项目 ​编辑 3.3 配置SSH 3.3.1 配置公钥 ​编辑 3.3.2 配置私钥 3.4 配置本地git库 一、GitLab的卸载 1. 停止gitlab sudo gitlab-ctl stop 2. 卸载…

Day13 苍穹外卖项目 工作台功能实现、Apache POI、导出数据到Excel表格

目录 1.工作台 1.1 需求分析和设计 1.1.1 产品原型 1.1.2 接口设计 1.2 代码导入 1.2.1 Controller层 1.2.2 Service层接口 1.2.3 Service层实现类 1.2.4 Mapper层 1.3 功能测试 1.4 代码提交 2.Apache POI 2.1 介绍 2.2 入门案例 2.2.1 将数据写入Excel文件 2.2.2 读取Excel文…

unity NAudio 获取电脑是否静音

测试,这两个办法都可以 打包出来也可以hu 想获取电脑是否静音出现编辑器模式下正常 打包出来失败 需要把 Api Compatibility Level改成.NET 4.x

流量主微信小程序工具类去水印

工具类微信小程序流量主带后台管理,可开通广告,带自有后台管理,不借助第三方接口 介绍 支持抖音,小红书,哔哩哔哩视频水印去除,功能实现不借助第三方平台。可实现微信小程序流量主广告变现功能&#xff0c…

Linux高级--2.4.5 靠协议头保证传输的 MAC/IP/TCP/UDP---协议帧格式

任何网络协议,都必须要用包头里面设置写特殊字段来标识自己,传输越复杂,越稳定,越高性能的协议,包头越复杂。我们理解这些包头中每个字段的作用要站在它们解决什么问题的角度来理解。因为没人愿意让包头那么复杂。 本…

python12-变量的作用域

一、变量的作用域 1-1、全局变量-global关键字 1、修改一个全局变量 当你需要在函数内部修改全局变量的值时,你需要使用 global 关键字来指明这一点。如果不这样做,Python会认为你在函数内部创建了一个新的局部变量,它与全局变量同名但实际…