2017-09-16 5 views
1

J'écris des fichiers de test pytest qui sont attachés à des fichiers de fonctionnalités qui n'ont pas de tables d'exemples ou de pas. Ce que je ne comprends pas, c'est comment je peux utiliser mes variables inline (USER1 et USER2) qui sont des chaînes dans mes étapes Given, When et Then (exemple simple ci-dessous pour quand) pour que la première fois l'étape 'when' est exécutée il utilise John et la seconde fois que l'étape 'quand' est utilisée, il utilise Peter.Pytest comment utiliser les variables inline dans mes arguments step?

J'ai lu ces documents http://pytest-bdd.readthedocs.io/en/latest/#step-arguments et son dicton d'utiliser un analyseur? Peut-être que je suis mal compris les docs mais ce n'est pas vraiment clair comment je peux faire quelque chose comme ci-dessous. Peut-être que les utilisateurs doivent être dans un dict? {'user1': 'John', 'user2': 'Peter'}. Je comprends que l'utilisation d'une table d'exemples ou d'une table d'étapes dans le fichier de caractéristiques serait bien ici, mais dans ce cas, j'ai besoin de savoir comment faire cela en arrière-plan (dans le fichier pytest uniquement).

Merci à l'avance tous les

USER1 = 'John' 
USER2 = 'Peter' 

@scenario('User logs in') 
def test_user_logs_in(): 
    """User logs in to website.""" 
    pass 

@given('I go to a website') 
def I_go_to_a_website(): 
    Do something 

@When('{user} logs in') 
def user_logs_in(user): 
    Do something with user1 the first time this step is used 
    Do something with user2 the second time this step is used. 

@then('I should see the account page') 
def should_see_account_page(): 
    Do something 

Répondre

0

Si ce que vous dites est que vous voulez exécuter tous vos tests une fois avec USER1, et encore une fois avec USER2, alors ce que vous cherchez est parametrized tests. Essentiellement, vous définissez votre test une seule fois. Vous définissez ensuite un groupe de variables dans les tuples, avec un ensemble facultatif d'identifiants, et pytest exécute ensuite ce test une fois pour chaque ensemble de paramètres.

Prenons un exemple de base.

addition(a, b): 
    return a + b 

def test_addition(a, b, expected): 
    assert addition(a, b) == expected 

Plutôt que de définir le test à plusieurs reprises avec des paramètres différents, comme:

def test_addition(): 
    a = 2 
    b = 2 
    expected = 4 
    assert addition(a, b) == expected 

def test_addition(): 
    a = -2 
    b = -2 
    expected = -4 
    assert addition(a, b) == expected 

Vous pouvez utiliser le pytest.mark.parametrize décorateur:

import pytest 

@pytest.mark.parametrize('a, b, expected', ((2, 2, 4), (-2, -2, -4))) 
def test_addition(a, b, expected): 
    assert addition(a, b) == expected 

Lorsque vous exécutez ce test, vous ll verra la sortie suivante.

$ pytest -v test_addition.py 
====================================== test session starts ======================================= 
platform linux -- Python 3.6.2, pytest-3.2.2, py-1.4.34, pluggy-0.4.0 -- /home/stackoverflow 
cachedir: .cache 
rootdir: /home/stackoverflow, inifile: 
collected 2 items                     

test_addition.py::test_addition[2-2-4] PASSED 
test_addition.py::test_addition[-2--2--4] PASSED 

==================================== 2 passed in 0.01 seconds ==================================== 

Donc, pour revenir à votre question, vous voulez faire quelque chose comme ceci:

import pytest 

USER1 = 'John' 
USER2 = 'Peter' 

@pytest.mark.parametrize('user', ((USER1), (USER2))) 
def test_something(user): 
    # Do something with ``user`` 
    # Test runs twice - once with USER1, once with USER2 
    pass 

Si votre liste était longue, il serait préférable d'utiliser une fixture.

users_to_test = { 
    'params': ((USER1), (USER2)), 
    'ids': ['test first user', 'test second user'] 
} 

@pytest.fixture(**users_to_test, scope='function') 
def params_for_test_something(request): 
    return request.param 

def test_something(params_for_test_something): 
    user = params_for_test_something[0] 
    pass 

Je pense que c'est une façon beaucoup plus gérable de faire les choses. Vous pouvez également paramétrer vos appareils, donc la magie va vraiment très loin.