Написать функцию 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 в основном делает три вещи:

  1. Собери свои тесты
  2. Запустите ваши тесты
  3. Показать статистику и, возможно, ошибки

По умолчанию py.test ищет (настраиваемый IIRC) test_foo.py тестовые модули и test_foo() тестовые функции в ваших тестовых модулях.

Проблема заключается в явном вызове вашей тестовой функции в самом конце вашего первого блока фрагмента кода:

test_add(sys.stdout)

Вы не должны делать это; Задача Pytest- вызывать ваши тестовые функции. Когда это произойдет, он узнает имя capsys (или же capfdв этом случае) и автоматически предоставит вам подходящий внутренний объект pytest в качестве аргумента вызова. ( Пример, приведенный в документации по pytest, вполне завершен.)

Этот объект обеспечит необходимый readouterr() функция. sys.stdout не имеет этой функции, поэтому ваша программа не работает.

Другие вопросы по тегам