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
:
Utilice la
--no-color
. Esto desactiva las secuencias de escape y sus declaraciones deprint
deberían producir una salida visible.Agregue algunas líneas adicionales al final de una
print
. Así queprint "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 abehave
directamente y agregar una sola opción adicional para que sebehave
la invocación, o editar un archivo de configuración es más engorroso que simplemente agregar algunas líneas nuevas paraprint
.
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 verprint()
declaraciones deprint()
en la consola (aunque la últimaprint()
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.