2013-06-08 7 views
15

Desidero utilizzare Nose per una suite di test di integrazione over the wire. Tuttavia, l'ordine di esecuzione di alcuni di questi test è importante.Un plug-in Naso per specificare l'ordine di esecuzione del test dell'unità

Detto questo, ho pensato di lanciare insieme un rapido plugin per decorare un test con l'ordine lo voglio eseguito: https://gist.github.com/Redsz/5736166

def Foo(unittest.TestCase): 

    @step(number=1) 
    def test_foo(self): 
     pass 

    @step(number=2) 
    def test_boo(self): 
     pass 

Da rivedere il costruito nel plugin avevo pensato, ho potuto semplicemente di override loadTestsFromTestCase e ordinare i test dal decorata 'numero di passo' .:

def loadTestsFromTestCase(self, cls): 
    """ 
    Return tests in this test case class. Ordered by the step definitions. 
    """ 
    l = loader.TestLoader() 
    tmp = l.loadTestsFromTestCase(cls) 

    test_order = [] 
    for test in tmp._tests: 
     order = test.test._testMethodName 
     func = getattr(cls, test.test._testMethodName) 
     if hasattr(func, 'number'): 
      order = getattr(func, 'number') 
     test_order.append((test, order)) 
    test_order.sort(key=lambda tup: tup[1]) 
    tmp._tests = (t[0] for t in test_order) 
    return tmp 

questo metodo sta tornando prove nell'ordine desidero, tuttavia quando i test vengono eseguiti dal naso non vengono eseguiti in questo ordine ?

Forse ho bisogno di spostare questo concetto di ordine in un altro luogo?

UPDATE: Come per il commento che ho fatto, il plugin sta funzionando come previsto. Mi sono sbagliato a fidarmi del reporter del pycharm. I test sono in esecuzione come previsto. Piuttosto che rimuovere la domanda, ho pensato di lasciar perdere.

+1

Bene, immagino che questa domanda possa essere ignorata, il plugin funziona come previsto ... Ho avuto una scoreggia cerebrale mentre lo eseguivo da pychamr dove il reporter di test veniva ordinato diversamente. Tuttavia, i test vengono effettivamente ordinati come previsto durante l'esecuzione. – Jesse

+3

Non voglio presumere troppo, dal momento che non conosco il codice base, ma sulla base della mia esperienza con i test automatici, è molto probabile che la migliore soluzione a lungo termine sia la riprogettazione dei test in modo tale che non hanno più dipendenze l'una dall'altra. Potresti considerare di ripetere le precondizioni necessarie nelle funzioni di configurazione o per sequenze di eventi che sono realmente dipendenti, unendoli in un singolo test. Inoltre, tieni presente che, come test unitario, devi generalmente testare singole "unità" di funzionalità ed evitare l'eventuale IO esterno, ove possibile. – GrandOpener

risposta

16

Dal documentation:

[...] naso esegue test funzionali nell'ordine in cui appaiono nel file del modulo. I test derivati ​​da TestCase e altre classi di test vengono eseguiti in ordine alfabetico.

Quindi una soluzione semplice potrebbe essere quella di rinominare i test nel caso di test:

class Foo(unittest.TestCase): 

    def test_01_foo(self): 
     pass 

    def test_02_boo(self): 
     pass 
1

ho trovato una soluzione per esso usando PyTest ordinazione plug fornito here.

Prova py.test YourModuleName.py -vv nella CLI e il test verrà eseguito nell'ordine in cui sono apparsi nel vostro modulo (prima test_foo e poi test_bar)

ho fatto la stessa cosa e funziona bene per me.

Nota: è necessario installare il pacchetto PyTest e importarlo.

Problemi correlati