Написать функцию pytest для проверки вывода на консоли (stdout) в Python?
Эта ссылка дает описание, как использовать pytest для захвата выходных данных консоли. Я попробовал следующий простой код, но получаю ошибку
import sys
import pytest
def f(name):
print "hello "+ name
def test_add(capsys):
f("Tom")
out,err=capsys.readouterr()
assert out=="hello Tom"
test_add(sys.stdout)
Выход:
python test_pytest.py
hello Tom
Traceback (most recent call last):
File "test_pytest.py", line 12, in <module>
test_add(sys.stdout)
File "test_pytest.py", line 8, in test_add
out,err=capsys.readouterr()
AttributeError: 'file' object has no attribute 'readouterr'
что не так и что нужно исправить? благодарю вас
РЕДАКТИРОВАТЬ: Согласно комментарию, я изменил capfd
, но я все еще получаю ту же ошибку
import sys
import pytest
def f(name):
print "hello "+ name
def test_add(capfd):
f("Tom")
out,err=capfd.readouterr()
assert out=="hello Tom"
test_add(sys.stdout)
2 ответа
Использовать capfd
крепление.
Пример:
def test_foo(capfd):
foo() # Writes "Hello World!" to stdout
out, err = capfd.readouterr()
assert out == "Hello World!"
Смотрите: http://pytest.org/latest/fixture.html для получения более подробной информации.
И посмотреть: py.test --fixtures
для списка встроенных светильников.
В вашем примере есть несколько проблем. Вот исправленная версия:
def f(name):
print "hello {}".format(name)
def test_f(capfd):
f("Tom")
out, err = capfd.readouterr()
assert out == "hello Tom\n"
Нота:
- Не использовать
sys.stdout
-- Использоватьcapfd
Приспособление как есть, как предусмотрено Pytest. - Запустите тест с:
py.test foo.py
Результат тестового прогона:
$ py.test foo.py
====================================================================== test session starts ======================================================================
platform linux2 -- Python 2.7.5 -- pytest-2.4.2
plugins: flakes, cache, pep8, cov
collected 1 items
foo.py .
=================================================================== 1 passed in 0.01 seconds ====================================================================
Также обратите внимание:
- Вам не нужно запускать ваши тестовые функции в ваших тестовых модулях.
py.test
(Инструмент CLI и Test Runner) сделает это за вас.
py.test в основном делает три вещи:
- Собери свои тесты
- Запустите ваши тесты
- Показать статистику и, возможно, ошибки
По умолчанию py.test
ищет (настраиваемый IIRC) test_foo.py
тестовые модули и test_foo()
тестовые функции в ваших тестовых модулях.
Проблема заключается в явном вызове вашей тестовой функции в самом конце вашего первого блока фрагмента кода:
test_add(sys.stdout)
Вы не должны делать это; Задача Pytest- вызывать ваши тестовые функции. Когда это произойдет, он узнает имя capsys
(или же capfd
в этом случае) и автоматически предоставит вам подходящий внутренний объект pytest в качестве аргумента вызова.
( Пример, приведенный в документации по pytest, вполне завершен.)
Этот объект обеспечит необходимый readouterr()
функция. sys.stdout
не имеет этой функции, поэтому ваша программа не работает.