pytest8.x版本 中文使用文档-------32.示例:使用自定义目录收集器

默认情况下,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 ========================

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值