pytest8.x版本 中文使用文档-------32.示例:使用自定义目录收集器
创始人
2024-11-12 14:06:31

默认情况下,pytest 使用pytest.Package来收集包含 __init__.py 文件的目录,使用 pytest.Dir来收集其他目录。如果你想要自定义目录的收集方式,你可以编写自己的pytest.Directory 收集器,并使用 pytest_collect_directory钩子来连接它。

对于目录清单文件的一个基本示例

假设你想要自定义每个目录的收集方式。以下是一个conftest.py插件的示例,它允许目录包含一个manifest.json文件,该文件定义了该目录的收集方式。在这个示例中,仅支持一个简单的文件列表,但你可以想象添加其他键,如排除项和通配符。

from __future__ import annotations      import json      import pytest         class ManifestDirectory(pytest.Directory):       def collect(self):           # pytest的标准行为是遍历所有`test_*.py`文件,并对每个文件调用`pytest_collect_file`。           # 这个收集器改为读取`manifest.json`文件,并且仅对其中定义的文件调用`pytest_collect_file`。           manifest_path = self.path / "manifest.json"           manifest = json.loads(manifest_path.read_text(encoding="utf-8"))           ihook = self.ihook           for file in manifest["files"]:               yield from ihook.pytest_collect_file(                   file_path=self.path / file, parent=self               )         @pytest.hookimpl   def pytest_collect_directory(path, parent):       # 对于包含`manifest.json`文件的目录,使用我们的自定义收集器。       if path.joinpath("manifest.json").is_file():           return ManifestDirectory.from_parent(parent=parent, path=path)       # 否则,回退到标准行为。       return None

你可以创建一个 manifest.json 文件和一些测试文件:

{     "files": [         "test_first.py",         "test_second.py"     ] }
# content of test_first.py from __future__ import annotations   def test_1():     pass
# content of test_second.py from __future__ import annotations   def test_2():     pass
# content of test_third.py from __future__ import annotations   def test_3():     pass

现在你可以执行测试规范了:

customdirectory $ pytest =========================== test session starts ============================ platform linux -- Python 3.x.y, pytest-8.x.y, pluggy-1.x.y rootdir: /home/sweet/project/customdirectory configfile: pytest.ini collected 2 items  tests/test_first.py .                                                [ 50%] tests/test_second.py .                                               [100%]  ============================ 2 passed in 0.12s =============================

请注意,test_three.py 没有被执行,因为它没有在清单中列出。

你可以验证你的自定义收集器是否出现在收集树中:

customdirectory $ pytest --collect-only =========================== test session starts ============================ platform linux -- Python 3.x.y, pytest-8.x.y, pluggy-1.x.y rootdir: /home/sweet/project/customdirectory configfile: pytest.ini collected 2 items                               ======================== 2 tests collected in 0.12s ========================

相关内容

热门资讯

裸辞做“一人公司”,我后悔了 去年这个时候,一位以色列程序员正在东南亚旅行。他顺手把一个在脑子里转了很久的想法做成了产品,一个让任...
南京建成国内首个Pre-6G试... 4月21日,2026全球6G技术与产业生态大会在南京开幕。全息互动技术展台前,一名远在北京的工作人员...
超梵求职受邀参加“2025抖音... 超梵求职受邀参加“2025抖音巨量引擎成人教育行业生态大会”,探讨分享优质内容传播,服务万千学员。 ...
摩托罗拉Razr 2026(R... IT之家 4 月 22 日消息,摩托罗拉宣布新一代 Razr 折叠手机将于 4 月 29 日在美国发...
库克卸任,特纳斯领航:苹果新纪... 苹果首席执行官蒂姆·库克将卸任,硬件工程主管约翰·特纳斯将接任,苹果公司今天宣布此事。 库克将在夏季...