如何在behave(BDD)中查看print()语句

56 投票
8 回答
42146 浏览
提问于 2025-04-18 16:10

背景:我正在用Python和Behave(行为驱动开发)进行测试。

无论我是在命令行中运行测试(用behave命令),还是通过自定义的main()函数运行,结果都是一样的:测试会执行,但我在控制台上看到的只有标准的BDD报告。

我的测试代码里有一些print()语句,用来帮助我调试代码。不过,当我运行behave时,这些print语句的输出在控制台上完全看不到。

有没有办法让“behave”显示我们代码中的print语句呢?

我的Main()

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")

8 个回答

4

我的问题是,某些行被吞掉了。这是一个解决方法(小技巧)。

print(my_variable, "\n")
5

我发现 behave.ini 对我没用。
我选择了:

  • 使用 --no-capture 这个参数,这样我就能在控制台看到 print() 的输出(不过最后的 print() 输出总是不会出现,我也不知道为什么),或者
  • 把输出重定向到一个文件,这样我就可以在文件里看到所有的标准输出内容,方便调试。
42

首先要做的就是防止捕获 stdout(可能还包括 stderr),这点可以参考 XuanBen 的解释。

不过,还有一个额外的复杂情况,可能会让不太了解的人感到困惑。默认情况下,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 捕获外,我还使用了两种方法来解决这个问题:

  1. 使用 --no-color 选项。这会关闭颜色输出,你的 print 语句应该能正常显示输出。

  2. print 的末尾多加几行空行。比如 print "foo\n\n"。这样 behave 就会覆盖掉一个无用的空行,而不是你想要的信息。这是我最常用的方法,因为我从来不直接调用 behave,添加一个额外的选项或者编辑设置文件都比较麻烦,所以我宁愿在 print 后面加几行空行。

50

从命令行中,你可以使用以下命令:

--no-capture 这个选项可以让你看到所有标准输出(也就是正常的打印信息)立即显示出来。

--no-capture-stderr 这个选项可以让你看到所有错误输出(也就是出错时的提示信息)立即显示出来。

39

我花了一些时间阅读文档后终于搞明白了。这其实很简单。默认情况下,behave 不会显示任何输出(也就是用 print() 打印的内容),除非测试失败。
如果你想强制显示所有输出,不管测试是通过还是失败,你只需要改变一些默认设置。最简单的方法是,在你项目的根目录下创建一个叫 behave.ini 的文件,并在里面写上以下内容:

文件名:behave.ini

[behave]
stderr_capture=False
stdout_capture=False

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

撰写回答