无需修改代码,深入探究 pytest 如何自动查找并加载三方插件

前言

相信测试的同学或者python开发同学,都知道pytest框架,pytest不仅是一个功能强大的测试框架,同时还是一个插件化的测试平台。插件只需配置就可以直接使用,而不需要测试代码配合。如果安装了插件,pytest则可以自动查找并集成它。是不是很神奇?到底如何实现的呢?本章内容我们来揭秘。

从例子入手

我们需要将一条case执行很多遍,pytest中如何实现呢?只需要安装pytest-repeat即可实现

安装

pip install pytest-repeat

使用

test_demo.py

python 复制代码
import pytest
​
​
@pytest.mark.repeat(5)
def test_add():
    print("test add()")

然后我们运行这条用例,会发现用例会重复执行5次。

可以看到,我们只是安装配置之后就可以使用了,到底是如何做的呢?

原理

pytest 的插件系统基于 setuptools 提供的 entry_points 功能,允许开发者以插件的形式扩展 pytest 的功能。通过在项目的 setup.pypyproject.toml 文件中指定插件的入口点,pytest 在加载测试时会自动检测并加载这些插件。

一旦插件被加载,pytest 就能够根据插件所提供的功能进行相应的操作,而不需要测试代码做任何修改。插件可以用于添加自定义的命令行选项、定义自定义的标记、注册自定义的 fixture,甚至可以修改和扩展 pytest 的执行流程。

它的工作原理是,pytest 在加载插件期间会根据插件定义的 Hook 函数来调整和增强其行为。Hook 是一种回调机制,允许插件通过实现特定的函数来干预 pytest 的不同阶段,例如解析命令行参数、收集测试用例、执行测试用例等。通过在适当的 Hook 函数中实现逻辑,插件可以影响 pytest 的行为,从而实现对框架的修改和扩展。

因此,当你在项目中安装并配置了某个 pytest 插件后,它会自动生效,并根据插件定义的逻辑进行相应的操作,而不需要测试代码配合。这样的设计使得插件的使用变得非常灵活和方便,允许开发者根据具体需求选择和配置插件来满足自己的测试需求。

具体怎么做

开发者需要在项目的 setup.py 文件(或者 pyproject.toml 文件,如果使用 Poetry)中添加如下的配置:

  • 使用 setuptools
arduino 复制代码
from setuptools import setup
​
setup(
    # other setup configuration...
    entry_points={
        'pytest11': [
            'plugin_name = package_name.plugin_module',
        ],
    },
)
  • 使用 Poetry:
csharp 复制代码
[tool.poetry.plugins."pytest11"]
"plugin_name" = "package_name.plugin_module"

在上述配置中,pytest11 是 pytest 插件系统所要求的 entry point group,它表示这是一个 pytest 插件。plugin_name 是插件的名称,可以根据实际情况进行自定义,但通常遵循 pytest-<name> 的命名约定。package_name.plugin_module 则是真正实现插件功能的模块路径。

pytest-repeat是这么做的吗

原理知道了,我们翻开pytest-repeat源码,看看是不是这样实现的!

源码

setup.py

ini 复制代码
from setuptools import setup
​
setup(name='pytest-repeat',
      ......
      entry_points={'pytest11': ['repeat = pytest_repeat']},
      ...... 
     )

可以看到pytest-repeat就是按照原理中介绍那样来做的。这样当项目安装了 pytest-repeat 插件之后,pytest 会自动检测到该插件,并根据插件提供的功能来运行测试用例。

通过源码可以看出,真正实现插件功能的模块在pytest_repeat.py

最后

这片文章主要讲述了pytest是如何自动查找集成三方插件的,要想实现一个三方插件必须在项目的 setup.py 文件(或者 pyproject.toml 文件)中添加配置。之后我们来探讨,具体的插件功能到底是如何实现的呢?

相关推荐
lzp07911 小时前
元数据驱动开发 - 面向对象编程思想的补充(上)
spring boot·后端·ui
明月_清风9 小时前
加密解密系统完全指南:原理剖析与 Go 实践
后端
风吹夏回9 小时前
Python 全局异常处理:从“满屏 try-except”到优雅兜底
开发语言·python
小熊Coding9 小时前
Python爬取当当网二手图书项目实战!
开发语言·爬虫·python·beautifulsoup·requests·二手图书
秋99 小时前
Java项目运行5天左右自动宕机:系统性定位与解决方案
java·开发语言·python
小江的记录本9 小时前
【JVM虚拟机】垃圾回收GC:垃圾收集器:CMS:核心原理、回收流程、优缺点、废弃原因(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·spring·面试·maven
田里的水稻10 小时前
OE_ubuntu26.04与宿主机之间复制粘贴内容
人工智能·python·机器人
冬奇Lab10 小时前
每日一个开源项目(第105篇):Twenty - 跳出 Salesforce 的圈套,定义现代开源 CRM
前端·后端·开源
jiayong2311 小时前
02 创建虚拟环境
python
旺仔来了11 小时前
不联网的Linux下部署python环境
linux·开发语言·python