2016-08-28 2 views
3

Je veux utiliser la même méthode pour @given, @when et @then de la même étape. par exemple.pytest-bdd réutiliser la même méthode pour différentes étapes

Scenario: Launch an application   
    Given username and password entered 
    And login button pressed 
    Then the app launches 

Scenario: Launch application again   
    Given user logged out 
    And username and password entered 
    When login button pressed 
    Then the app launches 

Si je le fais dans la mise en œuvre de l'étape:

@when('login button pressed') 
@given('login button pressed') 
def loginButtonPressed(): 
    print 'button pressed' 

Il semble, pytest_bdd ne peut pas gérer cela. Je reçois l'erreur:

fixture 'login button pressed' not found Is there a way I can maybe alias the steps?

+0

Supprimer une définition, par exemple quand et essayer de l'utiliser avec tout si eux, ça devrait marcher. Étant donné, Quand, Alors ne devrait pas influencer l'étape regex. – lauda

+0

Oui, le nom de la fonction doit également être différent. – rpal

Répondre

0

Dans pytest-BDD il ne supporte pas la possibilité d'utiliser deux types/définitions de pas différentes sur une définition de la fonction. Comment jamais il y a des "travail contournements"

Option 1: Désactiver le mode strict Gherkin

@pytest.fixture 
def pytestbdd_strict_gherkin(): 
    return False 

Cela vous permettra d'utiliser les étapes dans un ordre quelconque:

@when('login button pressed') 
def loginButtonPressed(): 
    print 'button pressed' 

En cornichon

Scenario: Use given anywhere   
     Given username and password entered 
     when login button pressed 
     then I am logged in 
     when login button pressed 

Avantages: ne doit pas créer des versions données/quand/alors ...

peut: peut rendre moins lisible ... va à l'encontre de la procédure en temps réel.

voir pour plus d'infos Relax strict gherkin

Option 2: Appel de la fonction définie précédemment dans la définition nouvelle étape

@given('login button pressed') 
    def loginButtonPressed(): 
     # do stuff... 
     # do more stuff... 
     print 'button pressed' 

@when('login button pressed') 
    def when_loginButtonPressed(): 
     loginButtonPressed() 

@then('login button pressed') 
    def then_loginButtonPressed(): 
     loginButtonPressed() 

pros: ne dédouble pas le code de corps de la fonction, garder given-> lorsque -> alors motif. Toujours maintenable (code de variation 1 place)

contre : ont toujours de créer de nouvelles définitions de fonctions pour donné, quand, puis versions ...

+0

Merci de votre réponse. Mais maintenant j'essaie d'obtenir un comportement similaire en utilisant la chaîne regex. C'est, je veux passer la chaîne de paramètre de Gherkin.
Scenario: Go Somewhere Given Go to "" Then verify went there Given Go to "" Then verify went there
@given(parsers.re(r'Go to "(?P.+)" from here')) def go_there(place): print "Went there"
pytest-bdd donne erreur:
GivenAlreadyUsed: Fixture "go_there" qui met en œuvre ce "Aller à" "" étape donnée a déjà été utilisé. – rpal

+0

Oui, les étapes indiquées ne peuvent pas être répétées. Mais quand et puis peut. Donc, vous pouvez en faire un quand, mais encore l'utiliser comme un donné si votre tour de mode strict de cornichon – ajputnam

+0

Ok, super. Merci. – rpal