Как увидеть операторы print() в поведении (BDD)

Контекст: я использую Python с поведением (BDD).

Независимо от того, запускаю ли я свои тесты из командной строки (поведение) или из пользовательской функции main(), поведение одинаково: тест выполняется, и единственный вывод, который я вижу в консоли, - это стандартный отчет BDD.

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

Есть ли способ, которым мы можем "вести себя", отображая операторы print в нашем коде?

Мой основной()

config = Configuration()
if not config.format:
    default_format = config.defaults["default_format"]
    config.format = [ default_format ]
    config.verbose = True
r = runner.Runner(config)
r.run()

if config.show_snippets and r.undefined_steps:
    print_undefined_step_snippets(r.undefined_steps)

Мой файл test.feature:

Feature: My test feature with the Behave BDD
    Scenario: A simple test
    Given you are happy
    When someone says hi
    Then you smile

Мой файл test_steps.py:

from behave import given, when, then, step, model

@given('you are happy')
def step_impl(context):
    pass

@when ('someone says {s}')
def step_impl(context, s):
    context.message = s
    print("THIS IS NEVER DISPLAYED IN THE CONSOLE")
    pass

@then ('you smile')
def step_impl(context):
        assert(context.message == "hi")

8 ответов

Решение

Я понял это, потратив больше времени на чтение документации. Это на самом деле довольно просто. По умолчанию, behave не отображает какой-либо вывод (т.е. с помощью print()) если в тесте не будет ошибки. Для принудительного отображения всех выходных данных независимо от результата теста (успешно / успешно) все, что вам нужно, это изменить некоторые настройки по умолчанию. Самый простой способ добиться этого - создать файл с именем behave.ini в корне каталога вашего проекта и поместите следующее:

Имя файла: behave.ini

[behave]
stderr_capture=False
stdout_capture=False

В следующий раз, когда вы запустите свои тесты на поведение, вы увидите все выходные данные из ваших отладочных операторов, независимо от того, пройдены они или нет.

Из командной строки вы можете использовать следующее:

--no-capture для любого вывода stdout, который будет напечатан немедленно.

--no-capture-stderr для любого вывода stderr, который будет напечатан немедленно.

Первое, что нужно сделать, это предотвратить захват stdout (а может и stderr) как объяснил Сюань или Бен.

Однако есть еще одно осложнение, которое ошарашит людей, которые не знают об этом. По умолчанию, behave выводит свой отчет в цвете. Это проблематично, потому что способ, которым он работает, состоит в том, что, когда он выполняет шаг, он сначала печатает линию шага в нейтральном цвете, который указывает, что он еще не знает, прошел шаг или нет. После завершения шага он использует escape-коды, чтобы перезаписать предыдущую строку новым цветом. Если вы не делаете что-то, чтобы обойти это, behave может просто перезаписать то, что ваш print Заявление произведено, и может быть трудно выяснить, что произошло.

На следующих иллюстрациях я собираюсь поставить цвет в скобках в конце строки. Если вы не используете print шаг "сделать что-то" будет выглядеть следующим образом, прежде чем он будет выполнен:

When do something [gray]

И после выполнения он будет заменен зеленой линией:

When do something [green]

behave выводит escape-последовательность, которая заставляет терминал подниматься и перезаписывать строку новым цветом. Нет проблем там.

Если вы положите print "foo" на вашем шаге терминал будет содержать это непосредственно перед завершением шага:

When do something [gray]
foo

И затем, когда шаг завершится успешно, это то, что вы увидите на терминале:

When do something [gray]
When do something [green]

Такая же escape-последовательность вызвала behave перезаписать вывод, произведенный print заявление.

Я использовал два метода, чтобы обойти проблему в дополнение к выключению stdout захватить:

  1. Использовать --no-color вариант. Это отключает escape-последовательности и ваши print заявления должны производить видимый вывод.

  2. Добавьте несколько дополнительных символов новой строки в конце print, Так print "foo\n\n", например. behave перезапишет бесполезную пустую строку вместо того, чтобы перезаписать нужную информацию. Это то, что я делаю чаще всего, потому что я никогда не призываю behave непосредственно и добавив одну дополнительную опцию к behave Вызов или редактирование файла настроек более громоздки, чем просто добавление нескольких новых строк в print,

behave.ini не работает для меня
Я выбираю

  • использовать --no-capture аргумент, чтобы увидеть print() операторы в консоли (хотя последний print() никогда не появится, и я не знаю почему), или
  • перенаправить вывод в файл, чтобы я мог видеть все строки stdout для отладки.

Моя проблема заключалась в том, что строчки были съедены. Это сработало (взломать).

      print(my_variable, "\n")

Еще один способ просмотреть последнюю строку stdout/stderr, даже если используется цветной вывод с параметром --no-capture; поместите следующее в вашем environment.py:

def after_step(context, step):
    print()

Таким образом, пустая строка съедается, а не та, которую вы на самом деле хотите видеть.

один из способов: использовать --no-capture в командной строке cmd

второй способ: создайте файл поведения.ini в каталоге проекта. добавить следующее

[вести себя]stdout_capture = нет

это работает 100%!!! добавьте Beve.ini в папку проекта:

      [behave]
color = no
stdout_capture = no
stderr_capture = no
log_capture = no

color и stdout_capture являются наиболее важными для печати!

беги как:

      $ behave my.feature

ИЛИ не иметь поведения.ini: запустить как:

      $ behave --no-capture --no-color my.feature
Другие вопросы по тегам