web-dev-qa-db-fra.com

Comment puis-je voir les instructions print () dans behave (BDD)

Contexte: J'utilise Python avec Behave (BDD).

Que j'exécute mes tests à partir de la ligne de commande (behave) ou d'un main () personnalisé, le comportement est identique: le test s'exécute et le seul résultat visible dans la console est le rapport BDD standard.

Mes tests incluent des instructions print () qui m'aident à déboguer mon code. Cependant, aucune de ces instructions d'impression ne s'affiche dans la sortie de la console lorsque je me comporte bien.

Est-il possible "se comporter" a-t-il affiché les instructions d'impression dans notre code?

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

Mon fichier 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

Mon fichier 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")
34
Ben

Je l'ai compris après avoir passé plus de temps à lire la documentation. C'est en fait assez simple. Par défaut, behave affiche pas n’affiche aucune sortie (c’est-à-dire en utilisant print()) à moins d’un échec du test . vous devez modifier certains paramètres par défaut. Pour ce faire, le moyen le plus simple consiste à créer un fichier nommé behave.ini à la racine du répertoire de votre projet et à placer les éléments suivants:

Nom de fichier:behave.ini

[behave]
stderr_capture=False
stdout_capture=False

La prochaine fois que vous exécuterez vos tests de comportement, vous verrez toutes les sorties de vos instructions de débogage, que vos tests réussissent ou échouent.

23
Ben

à partir de la ligne de commande, vous pouvez utiliser les éléments suivants:

--no-capture pour toute sortie stdout à imprimer immédiatement.

--no-capture-stderr pour toute sortie stderr à imprimer immédiatement.

28
Xuan

La première chose à faire est d’empêcher la capture de stdout (et peut-être aussi stderr) comme expliqué par Xuan ou Ben .

Cependant, il existe une complication supplémentaire qui déconcertera les personnes qui ne le savent pas. Par défaut, behave génère son rapport en couleur. Cela pose problème car il fonctionne de telle sorte que, lorsqu’il exécute une étape, il affiche d’abord la ligne de l’étape dans une couleur neutre qui indique qu’elle ne sait pas encore si l’étape est réussie ou non. Une fois que l'étape est terminée, il utilise des codes d'échappement pour écraser la ligne précédente avec une nouvelle couleur. Si vous ne faites rien pour y remédier, behave peut simplement écraser ce que votre déclaration print a produit, et il peut être difficile de savoir ce qui s'est passé.

Dans les illustrations suivantes, je vais mettre la couleur entre parenthèses à la fin de la ligne. Si vous n'utilisez pas print, l'étape "faire quelque chose" apparaîtra ainsi, avant qu'elle ne soit exécutée:

When do something [gray]

Et une fois exécuté, il serait remplacé par une ligne verte:

When do something [green]

behave génère une séquence d'échappement qui fait monter le terminal et remplace la ligne par une nouvelle couleur. Pas de problème là-bas.

Si vous mettez print "foo" dans votre étape, le terminal le contiendra juste avant la fin de l'étape:

When do something [gray]
foo

Et ensuite, lorsque l'étape est terminée avec succès, voici ce que vous voyez sur le terminal:

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

La même séquence d'échappement a amené behave à écraser la sortie générée par l'instruction print.

J'ai utilisé deux méthodes pour contourner le problème en plus d'activer la capture stdout:

  1. Utilisez l'option --no-color. Cela désactive les séquences d'échappement et vos instructions print doivent produire une sortie visible.

  2. Ajoutez quelques nouvelles lignes supplémentaires à la fin d'une print. Donc, print "foo\n\n", par exemple. behave écrasera une ligne vide inutile au lieu d'écraser les informations souhaitées. C’est ce que je fais le plus souvent parce que je n’invoque jamais behave directement et que l’ajout d’une seule option supplémentaire à l’appel de behave ou la modification d’un fichier de paramètres est plus fastidieux que l’ajout de quelques nouvelles lignes à print.

16
Louis

behave.ini ne fonctionne pas pour moi.
J'ai choisi de 

  • utilisez l'argument --no-capture pour voir les instructions print() dans la console (bien que la dernière print() ne s'affiche jamais et je ne sais pas pourquoi), ou 
  • redirige la sortie vers un fichier afin que je puisse voir toutes les lignes stdout à déboguer.
1
Ruberzen

Une autre façon d'afficher la dernière ligne de stdout/stderr même lorsque vous utilisez une sortie colorée avec --no-capture; placez les éléments suivants dans votre environnement.py:

def after_step(context, step):
    print()

De cette façon, la ligne vide est mangée, pas celle que vous voulez réellement voir.

0
ILikeFish