如何在行为 (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)实践示例

我在 BDD 场景中的具体程度如何?

哪些行为驱动开发 (BDD) 工具/框架可用于 Microsoft Stack? [关闭]

行为驱动开发(BDD) - 深入了解

如何在每个场景之后执行拆除以释放资源在使用黄瓜的宁静BDD中

node.js 的 BDD 和 TDD?