2017-02-13 2 views
1

Je voudrais créer une application de ligne de commande Bonjour tout le monde avec l'aide de BDD python3 et se comportent. J'ai mon dossier de fonctions mis en place ainsi:Comment puis-je tester stdout en utilisant le comportement?

Feature: Hello World 

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

Dans mon features/steps/hello.py les grandes lignes de mon @Then étape est la suivante:

Comment puis-je tester la sortie de mon programme? Comment puis-je capturer stdout pour ce test?

+0

Je vois que votre première étape est "Je démarre le programme". Lancez-vous un processus enfant là-bas? Et puis vous devez vérifier * ce processus '* sortie? – Louis

+0

@Louis Je pouvais lancer un processus fils mais j'étais fainéant et j'appelais simplement la fonction main(). –

Répondre

0

L'un des moyens typiques pour vérifier la sortie print est de pirater sys.stdout et analyser:

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 

Bien sûr, le try/finally logique peut être implicite dans le cadre de tests que vous utilisez. Dans unittest, ce serait /tearDown; Je n'ai aucune idée sur behave mais ses docs le couvriront probablement.

+0

En passant, c'est https://docs.python.org/3/library/contextlib.html#contextlib.redirect_stdout. –

+1

@JoshLee: Pourriez-vous répondre à votre commentaire? (J'ai dû utiliser redirection stdout peut-être une fois dans ma vie, n'était pas au courant, merci!) – 9000

0

est ici l'idée de 9000 appliquée à se comporter:

rediriger stdout à une maquette dans le fichier nommé 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 

Et puis dans features/steps/hello.py j'affirme sur le contenu de la stdout maquette:

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