Pytest 的“caplog”装置的类型提示是什么?

问题描述 投票:0回答:2

我正在使用 pytest 附带的

caplog
夹具。我正在使用 mypy 进行类型检查,并且想知道 caplog 的正确类型提示是什么。

例如:

def test_validate_regs(caplog: Any) -> None:
    validate_regs(df, logger)
    assert caplog.text == "", "No logs should have been made."

在这个例子中,我将其设置为

Any
,但我想知道是否有更具体的类型提示我可以使用。

我尝试阅读 caplog 上的文档,并在 github 中搜索 pytest 代码以查看 caplog 夹具返回的内容,但除了以下之外找不到任何内容。但是使用

str
类型只是给了我一个错误,说
str
类型没有属性
text
,这是有道理的。

当我打印 caplog 的类型时,我得到

_pytest.logging.LogCaptureFixture
,尽管我不确定如何从
_pytest
导入它并使用它。

python pytest mypy
2个回答
26
投票

从 pytest 6.2.0 开始,你应该使用

pytest.LogCaptureFixture

在此之前,您需要导入一个不推荐的私有名称(我们经常更改

_pytest
命名空间内的内部结构,恕不另行通知,并且不承诺向前或向后兼容性)


免责声明:我是 pytest 核心开发者


3
投票

此答案适用于尚未或无法更新到 pytest 6+ 的用户
如果您使用的是 pytest 6+ 及以上版本,请参阅更多更新的答案


用于 pytest <6.x, you can use

_pytest.logging.LogCaptureFixture

from _pytest.logging import LogCaptureFixture

def test_logs(caplog: LogCaptureFixture) -> None:
    ...

类型提示确实适用于 MyPy:

from _pytest.logging import LogCaptureFixture

def test_logs(caplog: LogCaptureFixture) -> None:
    caplog.at_level(logging.ERROR)
    caplog.at_level('10')
$ mypy test.py
/path/to/test.py:18: error: Argument 1 to "at_level" of "LogCaptureFixture" has incompatible type "str"; expected "int"
Found 3 errors in 2 files (checked 1 source file)

类型提示也适用于 Intellisense:

(上面的 Intellisense 弹出窗口与 get_records

API 文档匹配)。

请注意,

_
中的
_pytest
表明它不是“公共”API(如本答案中所述)。向固定装置添加类型是从这个 Github 问题开始的:支持静态类型

我还要补充一点,如果您从

_pytest

导入,我们不保证稳定性。只要您愿意在出现问题时进行调整就可以了。我们正在为 pytest 6.1 开发一个稳定的解决方案:
#7469

这导致了这个 Github 问题:

打字和公共 API

pytest 的“官方”公共 API 由

pytest

 包导出,其他所有内容都在 
_pytest
 包中定义。

...“其他所有内容”包括

LogCaptureFixture

 类型提示(从该问题的 TODO 列表中可以看出)。关于如何使其“正式”进行了很多讨论:

我们要如何正式声明某些东西为公共 API?

我认为应该有三个标准:

    它是在
  • pytest
    导出的。
  • 它没有
  • _
    __
     前缀。
  • 它记录在参考文献中。
© www.soinside.com 2019 - 2024. All rights reserved.