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

Ben*_*Ben 41 python bdd python-behave

上下文:我使用Python with Behave(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)
Run Code Online (Sandbox Code Playgroud)

我的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
Run Code Online (Sandbox Code Playgroud)

我的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")
Run Code Online (Sandbox Code Playgroud)

Xua*_*uan 37

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

--no-capture 任何stdout输出立即打印.

--no-capture-stderr 对于任何立即打印的stderr输出.


Ben*_*Ben 26

我花了更多的时间阅读文档后想出来了.它实际上非常简单.缺省情况下,behave显示任何输出(通过使用即print()除非在测试中的故障).要强制显示所有输出而不管测试结果(通过/失败),您只需要更改一些默认设置.实现这一目标的最简单方法是创建一个以behave.ini项目目录的根目录命名的文件,并输入以下内容:

文件名: behave.ini

[behave]
stderr_capture=False
stdout_capture=False
Run Code Online (Sandbox Code Playgroud)

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


Lou*_*uis 21

首先要做的是防止XuanBen解释stdout(也可能stderr).

然而,还有一个复杂的问题是让那些不了解它的人陷入困境.默认情况下,behave以彩色输出报告.这是有问题的,因为它的工作方式是当它运行一个步骤时,它首先以中性颜色打印出该步骤的线,表明它还不知道该步骤是否已经过去.步骤完成后,它使用转义码用新颜色覆盖上一行.如果你不做任何事情来解决它,behave可能只是覆盖你的print陈述产生的东西,并且可能很难弄清楚发生了什么.

在下面的插图中,我将把颜色放在行尾的括号中.如果您不使用print,在执行之前,"执行某些操作"步骤将如下所示:

When do something [gray]
Run Code Online (Sandbox Code Playgroud)

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

When do something [green]
Run Code Online (Sandbox Code Playgroud)

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

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

When do something [gray]
foo
Run Code Online (Sandbox Code Playgroud)

然后当步骤成功完成时,这就是您在终端上看到的内容:

When do something [gray]
When do something [green]
Run Code Online (Sandbox Code Playgroud)

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

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

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

  2. 在a的末尾添加一些额外的换行符print.所以print "foo\n\n",例如.behave将覆盖无用的空行而不是覆盖您想要的信息.这是我最常做的事情,因为我从不behave直接调用并为调用添加一个额外的选项behave,或者编辑设置文件比添加一些新行更麻烦print.

  • “ --no-color”选项使我看到输出的关键是什么-为什么在阅读此答案之前看不到任何显示,我感到很困惑 (2认同)

Rub*_*zen 5

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

  • 使用--no-capture参数查看print()控制台中的语句(尽管最后一个print()语句(尽管最后一个永远不会出现,我不知道为什么),或者
  • 将输出重定向到一个文件,这样我就可以看到所有要调试的标准输出行。

  • 我没有设置它,我在运行behave时将其用作命令行中的参数 (2认同)