2015-01-14 7 views
15

In unittest, posso variabili per l'impostazione di una classe e poi i metodi di questa classe possono scegliere a seconda di quale variabile si vuole usare ...unittest Vs pytest

class test_class(unittest.TestCase): 
    def setUp(self):   
     self.varA = 1 
     self.varB = 2 
     self.varC = 3 
     self.modified_varA = 2 

    def test_1(self): 
     do_something_with_self.varA, self.varB 

    def test_2(self): 
     do_something_with_self_modified_varA, self.varC 

Quindi, in unittest, è stato facile mettere insieme di test che potrebbero andare sotto una classe e quindi usare molte variabili diverse (varA e varB) per metodi diversi. In pytest, ho creato un appuntamento fisso nel conftest.py invece di una classe in unittest, come questo ...

@pytest.fixture(scope="module") 
def input1(): 
    varA = 1 
    varB = 2 
    return varA, varB 

@pytest.fixture(scope="module") 
def input2(): 
    varA = 2 
    varC = 3 
    return varA, varC 

nutro questo input1 e input2 per le mie funzioni in un file diverso (diciamo test_this.py) per due diverse funzioni. Ecco le domande sulla base di informazioni di cui sopra ...

  1. Dal momento che non posso solo dichiarare le variabili locali in conftest.py come io non posso semplicemente importare questo file. C'è un modo migliore per dichiarare qui variabili diverse che possono essere utilizzate in diverse funzioni in test_this.py? Ho cinque diverse configurazioni nel mio test effettivo per queste variabili, definendo che molti dispositivi diversi in conftest.py e li uso come argomento di funzione in cinque diverse funzioni in test_this.py suona doloroso, preferirei tornare alla struttura di classe unittest, definire le mie variabili e scegli quello che voglio

  2. Devo solo dichiarare le variabili globali in test_this.py e usarle nelle funzioni nel modo che voglio? Sembra un po 'non pitonico. Queste variabili sono utilizzate solo dalle funzioni in questo file.

  3. Diciamo che ho test_that.py e test_them.py pure. Se ho alcune variabili condivise tra questi diversi file, come dovrei dichiararli? basta creare un file calle variables.py nella directory in cui sono presenti tutti questi file di test e fare un'importazione ogni volta che ho bisogno? In questo modo posso mantenere tutti i dati in un separato.

  4. È mia impressione che pytest scoraggi l'utilizzo di una classe per organizzare le proprie funzioni? Ogni esempio che leggo online, sembra che impieghino un sacco di funzioni con i soli dispositivi. Che cos'è una configurazione di definizione di classe e metodi e organizzare i test in pytest?

  5. Ho uno scenario di prova in cui devo utilizzare il risultato di una funzione in un'altra. Con pytest, ho l'asserzione che è alla fine di una funzione, non un ritorno quindi non potrò usare questa funzione come fixture. Come posso realizzare questo? So che non è una buona pratica che il mio test si basi su un altro, ma c'è un lavoro in giro?

Grazie in anticipo per le vostre risposte.

risposta

10

1) Prima di tutto è possibile dichiarare questi dispositivi non solo in conftest.py, ma in ogni modulo Python che si desidera. E puoi importare quel modulo. Inoltre è possibile utilizzare apparecchi nello stesso modo in cui si è utilizzato metodo di configurazione:

@pytest.fixture(scope='class') 
def input(request): 
    request.cls.varA = 1 
    request.cls.varB = 2 
    request.cls.varC = 3 
    request.cls.modified_varA = 2 

@pytest.usefixtures('input') 
class TestClass: 

def test_1(self): 
    do_something_with_self.varA, self.varB 

def test_2(self): 
    do_something_with_self_modified_varA, self.varC 

oppure è possibile definire variabili separate in apparecchi separati:

def fixture_a(): 
    return varA 

def fixture_b(): 
    return varB 

def fixture_c(): 
    return varC 

def fixture_mod_A(): 
    return modified_varA 

o fare un apparecchio che restituisce tutte le variabili (perchè no?) o anche fare apparecchio parametrizzata indiretta che restituisce le variabili dalla vostra scelta (strada molto confusa):

@pytest.fixture() 
def parametrized_iput(request): 
    vars = {'varA': 1, 'varB': 2, 'varC': 3} 
    var_names = request.param 
    return (vars[var_name] for var_name in var_names) 

@pytest.mark.parametrize('parametrized_iput', [('varA', 'varC')], indirect=True) 
def test_1(parametrized_iput) 
    varA, varC = parametrized_iput 
    ... 

O ancora si può fare in fabbrica apparecchio che vi farà infissi per te al volo. Sembra strano quando hai solo 5 test e 5 configurazioni di variabili, ma quando ne ottieni centinaia, può essere utile.

3) Di cortesia è possibile. Ma ti consiglio di non importare direttamente questo file, ma usa l'opzione della riga di comando che indica quale file importare. In questo caso puoi cohoose un altro file con variabili senza cambiare il tuo codice.

4) Uso le classi nei miei test perché ho eseguito la migrazione da nosetest. Non ho menzionato alcun problema con l'utilizzo di classi in pytest.

5) In questo caso propongo di fare quanto segue: pugno rendere la funzione con azioni desiderate:

def some_actions(a, b): 
    # some actions here 
    ... 
    return c 

quindi utilizzarlo sia in prova e dispositivo:

def test(): 
    assert some_actions(1,2) == 10 

@pytest.fixture() 
def some_fixture(): 
    return some_actions(1,2) 
+0

Grazie a mazzo, che aiuta. – LuckyStarr