web-dev-qa-db-ja.com

動作中のprint()ステートメントを確認するにはどうすればよいですか(BDD)

コンテキスト:Python with Behave(BDD)を使用しています。

テストをコマンドライン(動作)から実行する場合でも、カスタムmain()から実行する場合でも、動作は同じです。テストが実行され、コンソールに表示される唯一の出力は標準BDDレポートです。

テストには、コードのデバッグに役立つprint()ステートメントが含まれています。ただし、動作を実行すると、これらの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")
41
Ben

ドキュメントを読むのにより多くの時間を費やした後、それを理解しました。実際には非常に簡単です。デフォルトでは、behavenot出力を表示します(つまり、print()を使用して)。テストに失敗がない限り。テストの結果(合格/不合格)に関係なく、すべての出力を強制的に表示するには、デフォルト設定の一部を変更するだけです。それを実現する最も簡単な方法は、プロジェクトのディレクトリのルートにbehave.iniという名前のファイルを作成し、以下を配置することです。

ファイル名:behave.ini

[behave]
stderr_capture=False
stdout_capture=False

次回動作テストを実行すると、テストが成功したか失敗したかにかかわらず、デバッグステートメントからのすべての出力が表示されます。

25
Ben

コマンドラインから、次を使用できます。

--no-captureすべてのstdout出力をすぐに印刷します。

--no-capture-stderrすべてのstderr出力をすぐに印刷します。

35
Xuan

最初に行うことは、 Xuan または Ben で説明されているように、stdout(および場合によってはstderr)のキャプチャを防ぐことです。

しかし、それを知らない人々を困らせるさらなる複雑さがあります。デフォルトでは、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]

同じエスケープシーケンスにより、behaveprintステートメントによって生成された出力を上書きします。

stdoutキャプチャをオフにすることに加えて、この問題を回避するために2つの方法を使用しました。

  1. 使用 --no-colorオプション。これにより、エスケープシーケンスがオフになり、printステートメントで可視出力が生成されます。

  2. printの末尾にいくつかの改行を追加します。そう print "foo\n\n"、 例えば。 behaveは、必要な情報を上書きする代わりに、無駄な空白行を上書きします。 behaveを直接呼び出してbehaveの呼び出しに単一の追加オプションを追加したり、設定ファイルを編集したりするのは、いくつかの改行を追加するよりも面倒だからです。 print

21
Louis

_behave.ini_は機能しません。
選択する

  • _--no-capture_引数を使用して、コンソールにprint()ステートメントを表示します(ただし、最後のprint()は表示されないため、理由はわかりません)、または
  • 出力をファイルにリダイレクトして、デバッグするすべてのstdout行を表示できるようにします。
2
Ruberzen

--no-captureでカラー出力を使用している場合でも、stdout/stderrの最後の行を表示するもう1つの方法。 environment.pyに以下を配置します。

def after_step(context, step):
    print()

そうすれば、実際に見たいものではなく、空の行が食べられます。

1
ILikeFish