阅读量:0
默认情况下,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 <Dir customdirectory> <ManifestDirectory tests> <Module test_first.py> <Function test_1> <Module test_second.py> <Function test_2> ======================== 2 tests collected in 0.12s ========================