如何在行为 (BDD) 中查看 print() 语句
Posted
技术标签:
【中文标题】如何在行为 (BDD) 中查看 print() 语句【英文标题】:How can I see print() statements in behave (BDD) 【发布时间】:2014-09-28 19:11:08 【问题描述】:上下文:我正在使用 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")
【问题讨论】:
检查行为的命令行参数:pythonhosted.org/behave/behave.html 您还需要将 junit 设置为 False,因为在行为/configuration.py 中您可以看到 - stderr_capture、stdout_capture 和 log_capture 为 True 比使用打印更好的方法是手动使测试失败,例如: test.fail(f'Could not run test:meaningful_data') 【参考方案1】:从命令行,您可以使用以下内容:
--no-capture
用于立即打印任何标准输出。
--no-capture-stderr
用于立即打印任何 stderr 输出。
【讨论】:
【参考方案2】:首先要做的是防止捕获stdout
(可能还有stderr
),正如Xuan 或Ben 所解释的那样。
但是,还有一个更复杂的情况会让不知情的人感到困惑。默认情况下,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
中添加几个换行符更麻烦。
【讨论】:
--no-color
选项是我看到输出的关键 - 我很困惑为什么在阅读此答案之前我什么都看不到【参考方案3】:
我花了更多时间阅读文档后才明白这一点。其实很简单。默认情况下,behave
不会不显示任何输出(即使用print()
),除非测试失败。
无论测试结果如何(通过/失败),要强制显示所有输出,您只需更改一些默认设置即可。实现这一目标的最简单方法是在项目目录的根目录中创建一个名为 behave.ini
的文件,然后输入以下内容:
文件名:behave.ini
[behave]
stderr_capture=False
stdout_capture=False
下次运行行为测试时,无论测试通过还是失败,您都会看到调试语句的所有输出。
【讨论】:
它并不能解决所有问题。我做了一个测试,在一个步骤中打印了三行,在我的测试过程中被多次调用。前两次测试都正确打印了 3 行,然后在接下来的测试中只有第三行仍然可见。【参考方案4】:behave.ini
不适合我。
我选择了
--no-capture
参数在控制台中查看print()
语句(尽管最后一个print()
永远不会出现,我也不知道为什么),或者
将输出重定向到一个文件,这样我就可以看到那里的所有标准输出行以进行调试。
【讨论】:
澄清:你到底是怎么设置--no-capture
的?
我没有设置,我在运行behaviour的时候在命令行中作为参数使用
要查看最后一个print()
语句,我必须在afer_step
中运行print()
语句environment.py
【参考方案5】:
另一种查看stdout/stderr最后一行的方法,即使使用带有--no-capture的彩色输出;将以下内容放在您的 environment.py 中:
def after_step(context, step):
print()
这样空行就被吃掉了,而不是你真正想看到的。
【讨论】:
我已按照上述步骤操作,但没有任何打印语句打印到控制台。添加一个空的打印语句解决了这个问题。行为中的错误?【参考方案6】:我的问题是线条被吃掉了。这有效(黑客)。
print(my_variable, "\n")
【讨论】:
以上是关于如何在行为 (BDD) 中查看 print() 语句的主要内容,如果未能解决你的问题,请参考以下文章
哪些行为驱动开发 (BDD) 工具/框架可用于 Microsoft Stack? [关闭]