написание функции 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 и Бегун испытания) делает это для вас.

py.тест делает в основном три вещи:

  1. собрать свои тесты
  2. Run тесты
  3. отображение статистики и, возможно, ошибок

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


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

test_add(sys.stdout)

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

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