我正在使用 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
导入它并使用它。
从 pytest 6.2.0 开始,你应该使用
pytest.LogCaptureFixture
在此之前,您需要导入一个不推荐的私有名称(我们经常更改
_pytest
命名空间内的内部结构,恕不另行通知,并且不承诺向前或向后兼容性)
免责声明:我是 pytest 核心开发者
此答案适用于尚未或无法更新到 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
请注意,
_
中的_pytest
表明它不是“公共”API(如本答案中所述)。向固定装置添加类型是从这个 Github 问题开始的:支持静态类型:
我还要补充一点,如果您从这导致了这个 Github 问题:
_pytest
导入,我们不保证稳定性。只要您愿意在出现问题时进行调整就可以了。我们正在为 pytest 6.1 开发一个稳定的解决方案:#7469。
打字和公共 API:
pytest 的“官方”公共 API 由...“其他所有内容”包括
pytest
包导出,其他所有内容都在_pytest
包中定义。
LogCaptureFixture
类型提示(从该问题的 TODO 列表中可以看出)。关于如何使其“正式”进行了很多讨论:
我们要如何正式声明某些东西为公共 API?我认为应该有三个标准:
它是在
- 它没有
pytest
导出的。- 它记录在参考文献中。
_
或__
前缀。