上下文:我正在使用带有Behave的Python(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")
答案 0 :(得分:31)
从命令行,您可以使用以下内容:
--no-capture
可以立即打印任何stdout输出。
--no-capture-stderr
可以立即打印任何stderr输出。
答案 1 :(得分:24)
我花了更多时间阅读文档后想出来了。它实际上非常简单。默认情况下,behave
会不显示任何输出(即使用print()
),除非测试失败。
要强制显示所有输出而不管测试结果(通过/失败),您只需要更改一些默认设置。实现这一目标的最简单方法是在项目目录的根目录中创建名为behave.ini
的文件,并输入以下内容:
文件名: behave.ini
[behave]
stderr_capture=False
stdout_capture=False
下次运行行为测试时,无论测试通过还是失败,您都会看到调试语句的所有输出。
答案 2 :(得分:19)
首先要做的是按照Xuan或Ben的说明阻止捕获stdout
(也可能stderr
)。
然而,还有一个复杂的问题会让那些不了解它的人感到困惑。默认情况下,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
捕获之外,我还使用了两种方法来解决此问题:
使用--no-color
选项。这将关闭转义序列,您的print
语句应生成可见输出。
在print
的末尾添加一些额外的换行符。例如,print "foo\n\n"
。 behave
将覆盖无用的空白行,而不是覆盖您想要的信息。这是我最常做的事情,因为我从不直接调用behave
并为behave
的调用添加一个额外的选项,或者编辑设置文件比添加一个更麻烦print
的新内容很少。
答案 3 :(得分:1)
behave.ini
对我不起作用。
我选择
--no-capture
参数查看控制台中的print()
语句(虽然最后print()
永远不会出现,但我不知道为什么),或答案 4 :(得分:0)
另一种查看stdout / stderr最后一行的方法,即使在使用带--no-capture的彩色输出时也是如此;在您的环境中放置以下内容。py:
def after_step(context, step):
print()
这样一来,空行就会被吃掉,而不是您真正想看到的那一行。