上下文:我使用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")
首先要做的是防止捕获
stdout
(也可能是stderr
),正如Xuan或Ben所解释的那样。然而,还有一个更复杂的问题会让那些不知道的人难堪。默认情况下,
behave
以彩色输出其报告。这是有问题的,因为它的工作方式是,当它运行一个步骤时,它首先以中性颜色打印出该步骤的行,这表示它还不知道该步骤是否通过。步骤完成后,它将使用转义代码用新颜色覆盖前一行。如果不做些什么来解决这个问题,behave
可能只是覆盖您的print
语句生成的内容,而且可能很难找出发生了什么。在下面的插图中,我将把颜色放在行末尾的括号中。如果不使用
print
,则在执行步骤“do something”之前,将显示如下:一旦执行,它将被一条绿线取代:
behave
输出转义序列,使终端向上并用新颜色覆盖行。没问题。如果在步骤中放入
print "foo"
,则在步骤完成之前,终端将包含以下内容:然后,当步骤成功完成时,您将在终端上看到:
同样的转义序列导致
behave
覆盖print
语句生成的输出。除了关闭
stdout
捕获之外,我还使用了两种方法来解决此问题:使用
--no-color
选项。这将关闭转义序列,并且您的print
语句将产生可见的输出。在
print
的末尾添加一些额外的换行符。例如,print "foo\n\n"
。behave
将覆盖无用的空行,而不是覆盖所需的信息。这是我最后最常做的事情,因为我从不直接调用behave
,也不向behave
的调用添加一个附加选项,或者编辑设置文件比只向print
添加几行新行更麻烦。在命令行中,可以使用以下命令:
--no-capture
立即打印任何标准输出。--no-capture-stderr
以便立即打印任何stderr输出。我花了更多的时间阅读文档后才明白。其实很简单。默认情况下,
behave
不显示任何输出(即使用print()
),除非测试失败。 要强制显示所有输出,而不管测试结果如何(通过/失败),只需更改一些默认设置。最简单的方法是在项目目录的根目录中创建一个名为behave.ini
的文件,并放置以下内容:文件名:
behave.ini
下次运行行为测试时,无论测试通过与否,都将看到调试语句的所有输出。
相关问题 更多 >
编程相关推荐