跳转到主要内容

一个用于自定义doctest结果字符串表示的py.test插件。

项目描述

开发

Travis CI builds Coveralls coverage report (pytest>=2.8.0)

最后发布

Last stable version (PyPI) Python versions (PyPI) Python implementations (PyPI)

PyPI状态

Downloads (PyPI) Distribution format (PyPI) Project status (PyPI) License (PyPI)

在CPython 2.6+/3.2+,PyPy(2,4和5),PyPy3(2和5),PyPy-STM 2.5.1和Jython 2.7.0上测试,使用py.test 2.1+(CI服务为2.8.5+;Jython为2.2.4+)。

它做什么?

更改doctest使用的显示钩子来渲染对象表示。

对于具有doctest的给定代码,您可以运行

py.test --doctest-modules --doctest-repr=IPython.lib.pretty:pretty

这将像通常一样运行doctest示例,但结果不会通过直接调用__repr__方法来打印,而是通过调用给定的函数,并将结果值作为其单个参数。

为了实现这一点,只需要一个表示格式化可调用函数,该函数接受一个对象并返回其表示的字符串。它应作为 --doctest-repr 命令行选项传递,格式为 module:object,嵌套模块/对象之间用点分隔。对于内置函数如 ascii,可以直接删除 module: 前缀。

您还可以使用一个总是返回 None 但将结果写入某些流/文件的打印器可调用函数。在这种情况下,应使用此包 stdout_proxy

# mymodule.py
from pytest_doctest_custom import stdout_proxy
from pprint import PrettyPrinter
pp = PrettyPrinter(width=72, stream=stdout_proxy).pprint

因此您可以运行

py.test --doctest-modules --doctest-repr=mymodule:pp

常见的表示格式化器/打印器

注意默认的“打印器”,您应该始终使用格式化方法/函数而不是打印方法,因为打印器对象通常在初始化时将其自身分配给 sys.stdout,而 doctest 运行器通过短暂模拟此类流来收集打印数据。此包在找到所请求的可调用函数时临时更改 sys 输出/错误流,但如果模块已经导入(如 conftest.py),则这还不够。当可能时,使用表示格式化器可调用函数或明确指定打印器可调用函数的输出流(它应该是 pytest_doctest_custom.stdout_proxy)。

  • IPython “pretty” 模块(输出,无“Out[#]:”前缀)

要使用此模块,需要在测试环境中安装 IPython(例如,将 ipython 包含在 tox 依赖项列表中)。运行项目中 toctests 的可能的 tox.ini 文件如下所示

[tox]
envlist = py{35,34,27}

[testenv]
deps = ipython
commands = py.test {posargs}

[pytest]
addopts = --doctest-modules
          --doctest-glob=test_*.rst
          --doctest-repr=IPython.lib.pretty:pretty
          --ignore setup.py

您可以通过创建一个自定义函数来自定义其参数,例如通过将此添加到 conftest.py 模块并使用 --doctest-repr=conftest:doctest_pretty 调用 py.test 来自定义其参数,如 max_widthmax_seq_length

# conftest.py
from IPython.lib.pretty import pretty
def doctest_pretty(value):
    return pretty(value, max_width=72)

此美化打印器对集合、frozensets 和字典(按键排序)进行排序,以固定缩进换行,并在 Python 2 和 3(CPython 2.7 和 3.3+)上对集合/frozenset 打印结果进行一致处理。但它不是 Python 标准库,此类打印器需要 IPython 运行测试,这包括更多内容,而不仅仅是美化打印器。在 CPython 2.6/3.2 中,您需要确保 IPython 版本兼容(例如,在 tox.ini 中使用 deps = ipython<2)。

在 PyPy 中,该表示打印器将任何字典都显示为 dictproxy(使用 IPython 5.0.0,PyPy 5.3.1 测试),因为它们都是相同的,并且字典打印器被替换,因此需要一个诡计来确保 CPython 和 PyPy 之间的共同行为。您可以在相同的 conftest.py 中创建一个 pytest_configure 钩子,要么将其 monkeypatch 到 types.DictProxyType 的字典派生类型,如 type("dictproxy", (dict,), {}),然后重新加载 IPython.lib.pretty 模块,要么通过将 _dict_pprinter_factory("{", "}", dict) 分配回其 _type_pprinters[dict] 来重建 IPython.lib.pretty 字典表示打印器。同样,PyPy3 也是如此,其 v2.4.0 是 Python 3.2,因此它需要 ipython<2

IPython 与 Jython 不兼容。

  • Python “pprint” 模块(标准库)

您可以直接使用 pprint.pformat 函数与 --doctest-repr=ppretty:pformat。除非将流正确设置为 stdout_proxy,否则不应直接使用来自 pprint.PrettyPrinter 对象的 pprint 方法。

要自定义其参数,如 widthindent,您可以在代码中将 PrettyPrinter 对象放入其中,例如

# conftest.py
import pprint
doctest_pp = pprint.PrettyPrinter(width=72)

要使用该 PrettyPrinter 实例的 pformat 属性运行 py.test,使用 --doctest-repr=conftest:doctest_pp.pformat 即可。

标准库的 pretty printer 对字典进行排序(按键排序),使用自定义缩进大小进行换行,但几个容器的结果取决于 Python 版本(例如,Python 2.6 和 3 中的空集为 "set()",而在 Python 2.7 中为 set([]);Python 3 中的单元素集合为 {item},而在 Python 2 中为 set([item]))。另一方面,这是 Python 标准库,没有额外的测试要求,在 PyPy/PyPy3 和 Jython 中的行为与 CPython 相同。

安装

您可以使用 pip

pip install pytest-doctest-custom

或直接使用 setup.py

python setup.py install

版权(C)2016 丹尼尔·德·耶稣·达·席尔瓦·贝利尼

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。

源代码分发

pytest-doctest-custom-1.0.0.zip (22.7 kB 查看哈希值)

上传时间 源代码

pytest-doctest-custom-1.0.0.tar.gz (13.8 kB 查看哈希值)

上传时间 源代码

构建分发

pytest_doctest_custom-1.0.0-py2.py3-none-any.whl (10.0 kB 查看哈希值)

上传时间 Python 2 Python 3

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面