Подтвердить что ты не робот

Как я могу видеть инструкции print() в behave (BDD)

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

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

Мои тесты включают команды 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")
4b9b3361

Ответ 1

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

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

[behave]
stderr_capture=False
stdout_capture=False

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

Ответ 2

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

--no-capture для вывода любого выходного файла stdout.

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

Ответ 3

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

Однако, есть еще одно осложнение, которое обрушит людей, которые не знают об этом. По умолчанию 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 capture:

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

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