如何在behave(BDD)中看到print()语句

2024-04-29 00:54:50 发布

您现在位置:Python中文网/ 问答频道 /正文

上下文:我使用Python with Behave(BDD)。

无论是从命令行(behave)还是从自定义main()运行测试,行为都是相同的:测试运行,我在控制台中看到的唯一输出是标准的BDD报告。

我的测试包括帮助我调试代码的print()语句。但是,当我运行behave时,这些print语句都不会显示在控制台输出中。

有没有办法让“behave”在代码中显示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")

Tags: testyouconfigformatdefaultdefstepcontext
3条回答

首先要做的是防止捕获stdout(也可能是stderr),正如XuanBen所解释的那样。

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

在下面的插图中,我将把颜色放在行末尾的括号中。如果不使用print,则在执行步骤“do something”之前,将显示如下:

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添加几行新行更麻烦。

在命令行中,可以使用以下命令:

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

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

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

文件名:behave.ini

[behave]
stderr_capture=False
stdout_capture=False

下次运行行为测试时,无论测试通过与否,都将看到调试语句的所有输出。

相关问题 更多 >