examples behave python bdd python-behave

behave - cucumber python



¿Cómo puedo ver las instrucciones print() en behave(BDD)? (4)

Lo descubrí después de pasar más tiempo leyendo la documentación. En realidad es bastante simple. De forma predeterminada, behave no muestra ninguna salida (es decir, mediante el uso de print() ) a menos que haya una falla en la prueba. Para forzar la visualización de todos los resultados, independientemente del resultado de la prueba (pasar / fallar), todo lo que necesita es cambiar algunas de las configuraciones predeterminadas. La forma más fácil de lograrlo es crear un archivo llamado behave.ini en la raíz del directorio de su proyecto y colocar lo siguiente:

Nombre de archivo: behave.ini

[behave] stderr_capture=False stdout_capture=False

La próxima vez que ejecute sus pruebas de comportamiento, verá todas las salidas de sus declaraciones de depuración, tanto si sus pruebas pasan como si no.

Contexto: estoy usando Python con Behave (BDD).

Si ejecuto mis pruebas desde la línea de comando (behave) o desde una main () personalizada, el comportamiento es el mismo: la prueba se ejecuta y el único resultado que veo en la consola es el informe BDD estándar.

Mis pruebas incluyen instrucciones print () que me ayudan a depurar mi código. Sin embargo, ninguna de estas instrucciones de impresión se muestra en la salida de la consola cuando ejecuto el comportamiento.

¿Hay alguna forma en que podamos "comportarnos" mostrar las declaraciones de impresión en nuestro código?

Mi principal()

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)

Mi archivo 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

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


Lo primero que debe hacer es evitar la captura de stdout (y tal vez también stderr ) como lo explicaron Xuan o Ben .

Sin embargo, existe una complicación adicional que afectará a las personas que no están conscientes de ello. Por defecto, behave produce su informe en color. Esto es problemático porque la forma en que funciona es que cuando ejecuta un paso, primero imprime la línea del paso en un color neutro que indica que aún no sabe si el paso ha pasado o no. Una vez que el paso ha terminado, usa códigos de escape para sobrescribir la línea anterior con un nuevo color. Si no hace algo para behave , el behave puede simplemente sobrescribir lo que produjo su declaración print , y puede ser difícil averiguar qué sucedió.

En las siguientes ilustraciones, voy a poner el color entre paréntesis al final de la línea. Si no utiliza la print , el paso "hacer algo" aparecerá así, antes de que se ejecute:

When do something [gray]

Y una vez ejecutado sería reemplazado por una línea verde:

When do something [green]

behave genera una secuencia de escape que hace que el terminal suba y sobrescriba la línea con un nuevo color. No hay problema allí.

Si coloca print "foo" en su paso, el terminal contendrá esto, justo antes de que se complete el paso:

When do something [gray] foo

Y luego, cuando el paso se completa con éxito, esto es lo que verías en la terminal:

When do something [gray] When do something [green]

La misma secuencia de escape ha provocado que el behave sobrescriba la salida producida por la declaración de print .

He utilizado dos métodos para solucionar el problema, además de desactivar la captura de la salida stdout :

  1. Utilice la --no-color . Esto desactiva las secuencias de escape y sus declaraciones de print deberían producir una salida visible.

  2. Agregue algunas líneas adicionales al final de una print . Así que print "foo/n/n" , por ejemplo. behave sobrescribirá una línea en blanco inútil en lugar de sobrescribir la información que desea. Esto es lo que termino haciendo con más frecuencia porque nunca invoco a behave directamente y agregar una sola opción adicional para que se behave la invocación, o editar un archivo de configuración es más engorroso que simplemente agregar algunas líneas nuevas para print .


desde la línea de comando, puedes usar lo siguiente:

--no-capture para cualquier salida de stdout que se imprima inmediatamente.

--no-capture-stderr para que cualquier salida de stderr se imprima inmediatamente.


behave.ini no funciona para mí.
Yo elijo

  • use el argumento --no-capture para ver print() declaraciones de print() en la consola (aunque la última print() nunca aparecerá, y no sé por qué), o
  • redirigir la salida a un archivo para que pueda ver todas las líneas stdout allí para depurar.