Может ли pytest захватить вывод из doctest? - PullRequest
2 голосов
/ 09 июля 2019

Я бегу pytest с --doctest-modules и без других опций.

У меня есть doctest тест, который не проходит, и я пытаюсь отладить проблему, добавив print() операторов в базовый код.

Захват вывода работает и отображается так, как ожидалось для моих обычных (не doctest) тестов, но тесты doctest не показывают стандартный вывод в моем выводе pytest, хотя у меня есть print() заявления, происходящие там.

Я мог бы переписать свой doctest как не-doctest тест, чтобы заставить эти print() операторы проходить, но это звучит ужасно окольным путем.

Есть ли способ сказать pytest, что я хочу, чтобы он также захватывал вывод для doctest с?

$ python --version
Python 3.7.2
$ pytest --version
This is pytest version 3.10.1, imported from /home/gene/.pythonz/pythons/CPython-3.7.2/lib/python3.7/site-packages/pytest.py
setuptools registered plugins:
  pytest-xdist-1.26.1 at /home/gene/.pythonz/pythons/CPython-3.7.2/lib/python3.7/site-packages/xdist/plugin.py
  pytest-xdist-1.26.1 at /home/gene/.pythonz/pythons/CPython-3.7.2/lib/python3.7/site-packages/xdist/looponfail.py
  pytest-pythonpath-0.7.3 at /home/gene/.pythonz/pythons/CPython-3.7.2/lib/python3.7/site-packages/pytest_pythonpath.py
  pytest-mock-1.10.0 at /home/gene/.pythonz/pythons/CPython-3.7.2/lib/python3.7/site-packages/pytest_mock.py
  pytest-forked-1.0.1 at /home/gene/.pythonz/pythons/CPython-3.7.2/lib/python3.7/site-packages/pytest_forked/__init__.py
  hypothesis-4.4.1 at /home/gene/.pythonz/pythons/CPython-3.7.2/lib/python3.7/site-packages/hypothesis/extra/pytestplugin.py
  flaky-3.5.3 at /home/gene/.pythonz/pythons/CPython-3.7.2/lib/python3.7/site-packages/flaky/flaky_pytest_plugin.py

1 Ответ

2 голосов
/ 10 июля 2019

Превращение моего комментария в ответ: проще всего распечатать на stderr, так как doctest захватывает только stdout для сравнения.Пример:

import sys


def greet(who):
    """Greet someone.

    >>> greet('world')
    'Hello world'

    >>> greet('fizz')
    'Hello fizz'

    >>> greet('buzz')
    'Hello buzz'
    """

    print('input:', who, file=sys.stderr)
    return f'Hello {who}'

Запуск тестов:

$ pytest --doctest-modules -sv
======================================= test session starts ========================================
...
collected 1 item                                                                                   

spam.py::spam.greet input: world
input: fizz
input: buzz
PASSED

===================================== 1 passed in 0.03 seconds =====================================
...