2012-12-18 20 views
9

Ho due semplici configurazioni di prova e sto provando a raggrupparle in un apparecchio e voglio che la funzione di test passi nei "parametri" all'apparecchio.I parametri passati al dispositivo pytest possono essere passati come variabili?

Ecco un esempio forzato, per spiegare la mia domanda. Dire che ho il seguente dispositivo pytest:

@pytest.fixture(scope="module", params=['param1','param2']) 
def myFixture(request): 
    if request.param == 'param1': 
     p = 5 
    elif request.param == 'param2': 
     p = 10 
    return p 

# would like to set request.param = ['param1'] for myFixture 
def test_madeup(myFixture): 
    assert myFixture == 5 

# would like to set request.param = ['param2'] for myFixture 
def test_madeup2(myFixture): 
    assert myFixture == 10 

Posso fare in modo che i params sopra sono passati come un input per la funzione test_madeup? Quindi, qualcosa di simile al seguente:

@pytest.fixture(scope="module", params=fixtureParams) 
def myFixture(request): 
    if request.param == 'param1': 
     return 5 
    elif request.param == 'param2': 
     return 10 


def test_madeup(myFixture, ['param1']): 
    assert myFixture == 5 

Quanto sopra, ovviamente, non funziona. Il caso reale è un po 'più complesso, ma voglio solo sapere se riesco a passare il all'apparecchio dalla funzione test_madeup.

risposta

14

Se ho capito bene la tua domanda, che, fondamentalmente, desidera selezionare un'istanza di un apparecchio parametrizzato per l'esecuzione con un test, fornendo alcune informazioni con il test. Non è possibile anche se potremmo probabilmente pensare a un meccanismo. Non sono sicuro se la seguente soluzione mappe a tutto il problema, ma qui è un modo per risolvere il caso concreto di cui sopra:

import pytest 

@pytest.fixture(scope="module") 
def myFixture1(): 
    return 5 

@pytest.fixture(scope="module") 
def myFixture2(): 
    return 2 

@pytest.fixture(scope="module", params=["param1", "param2"]) 
def myFixture(request): 
    if request.param == 'param1': 
     return request.getfuncargvalue("myFixture1") 
    elif request.param == 'param2': 
     return request.getfuncargvalue("myFixture2") 

def test_1(myFixture1): 
    assert myFixture1 == 5 

def test_2(myFixture2): 
    assert myFixture2 == 2 

def test_all(myFixture): 
    assert myFixture in (2,5) 

Questo viene eseguito quattro prove, perché il test_all viene eseguita due volte con entrambi i dispositivi.

Se la configurazione dei dispositivi non è pesante, si potrebbe anche avere un faro che produce un elenco e uno "iterating" parametrizzato. Un test potrebbe quindi catturare l'intera lista e indicizzarla al suo interno.

3

Non sono sicuro se questo è ciò che si vuole, ma il caso ad esempio può essere implementato come:

@pytest.mark.parametrize(('param', 'expected'), [('param1', 5), ('param2', 10)]) 
def test_madeup(param, expected): 
    assert param == expected