51

上下文:我正在使用 Python with 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")
4

6 回答 6

45

从命令行,您可以使用以下内容:

--no-capture立即打印任何标准输出。

--no-capture-stderr立即打印任何 stderr 输出。

于 2015-02-16T22:09:24.593 回答
37

要做的第一件事是防止被抓stdout(也许还有stderr),正如XuBen所解释的那样。

然而,还有一个更复杂的情况会让那些不知道它的人感到困惑。默认情况下,behave以彩色输出其报告。这是有问题的,因为它的工作方式是,当它运行一个步骤时,它首先以中性颜色打印出该步骤的行,表示它还不知道该步骤是否已通过。步骤完成后,它使用转义码用新颜色覆盖前一行。如果您不采取措施解决它,behave可能会简单地覆盖您的print语句产生的内容,并且可能很难弄清楚发生了什么。

在下面的插图中,我将把颜色放在行尾的括号中。如果您不使用print,则“做某事”步骤在执行之前将如下所示:

When do something [gray]

一旦执行,它将被绿线替换:

When do something [green]

behave输出一个转义序列,使终端上升并用新颜色覆盖该行。那里没问题。

如果您print "foo"输入您的步骤,终端将在步骤完成之前包含此内容:

When do something [gray]
foo

然后,当该步骤成功完成时,您会在终端上看到:

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

相同的转义序列导致behave覆盖print语句产生的输出。

除了关闭stdout捕获之外,我还使用了两种方法来解决此问题:

  1. 使用该--no-color选项。这会关闭转义序列,您的 print语句应该会产生可见的输出。

  2. print. 所以print "foo\n\n",例如。behave将覆盖一个无用的空白行,而不是覆盖你想要的信息。这是我最常做的事情,因为我从不behave直接调用并在调用中添加一个附加选项behave,或者编辑设置文件比在print.

于 2017-01-31T23:07:54.140 回答
32

我花了更多时间阅读文档后才弄清楚。其实很简单。默认情况下,除非测试失败,否则behave显示任何输出(即使用)。无论测试结果如何(通过/失败),要强制显示所有输出,您只需更改一些默认设置即可。实现这一目标的最简单方法是在项目目录的根目录中创建一个名为的文件,并放入以下内容:print()behave.ini

文件名:behave.ini

[behave]
stderr_capture=False
stdout_capture=False

下次运行行为测试时,无论测试通过还是失败,您都会看到调试语句的所有输出。

于 2014-08-13T16:22:07.583 回答
4

behave.ini对我不起作用。
我选择

  • 使用--no-capture参数在控制台中查看print()语句(尽管最后一个print()永远不会出现,我不知道为什么),或者
  • 将输出重定向到一个文件,这样我就可以看到那里的所有标准输出行进行调试。
于 2018-01-31T22:43:31.420 回答
2

即使使用带有 --no-capture 的彩色输出,也可以查看 stdout/stderr 最后一行的另一种方法;将以下内容放在您的 environment.py 中:

def after_step(context, step):
    print()

这样空行就会被吃掉,而不是你真正想看到的。

于 2018-11-26T13:41:14.663 回答
0

我的问题是线条被吃掉了。这有效(黑客)。

print(my_variable, "\n")
于 2021-08-18T10:09:38.797 回答