如何使用behave测试stdout?

时间:2017-02-13 15:59:04

标签: python python-3.x bdd python-behave

我想使用 python3 表现 ,使用BDD创建Hello World命令行应用程序。我的功能文件设置方式如下:

Feature: Hello World

  Scenario: the program greets us
    When I start the program
    Then it prints "Hello World!"

features/steps/hello.py我的@Then步骤的大纲是:

from behave import *

@then('it prints "{text}"')
def step_impl(context, text):
    # what goes here???

如何测试程序的输出?如何捕获此测试的标准输出?

2 个答案:

答案 0 :(得分:0)

检查print输出的典型方法之一是劫持sys.stdout并对其进行分析:

from StringIO import StringIO
import sys

real_stdout = sys.stdout
try:
  mock_stdout = StringIO()
  sys.stdout = mock_stdout
  print "Hi there"
  assert mock_stdout.getvalue() == "Hi there"
finally:
  sys.stdout = real_stdout

当然,try / finally逻辑可能隐含在您使用的测试框架中。在unittest中,它将是setUp / tearDown;我不知道behave,但它的文档很可能涵盖它。

答案 1 :(得分:0)

这是适用于行为的9000的想法:

我将stdout重定向到名为features/environment.py的文件中的模拟:

import sys
import io

def before_all(context):
    context.real_stdout = sys.stdout
    context.stdout_mock = io.StringIO()
    sys.stdout = context.stdout_mock

def after_all(context):
    sys.stdout = context.real_stdout

然后在features/steps/hello.py中断言模拟标准输出的内容:

@then('it prints "{text}"')
    def step_impl(context, text):
    output = context.stdout_mock.getvalue()
    assertEqual( "Hello World!\n", output )