2009-07-28 14 views
21

Eventuali duplicati:
How to generate dynamic (parametrized) unit tests in python?di Python unittest e dinamica creazione di casi di test

Esiste un modo per creare dinamicamente unittest casi di test? Ho provato quanto segue ..

class test_filenames(unittest.TestCase): 

    def setUp(self): 
     for category, testcases in files.items(): 
      for testindex, curtest in enumerate(testcases): 
       def thetest(): 
        parser = FileParser(curtest['input']) 
        theep = parser.parse() 
        self.assertEquals(theep.episodenumber, curtest['episodenumber']) 

       setattr(self, 'test_%s_%02d' % (category, testindex), thetest) 

..che crea tutti i metodi correttamente (si fanno vedere in dir() e sono callable), ma rivelatore di prova di unittest, nè nosetest li esegue ("Ran 0 test in .. . ")

Dal momento che può chiedere la domanda sbagliata - quello che sto cercando di realizzare:

ho un file contenente i dati di test, un elenco di nomi di file di input, e aspettavo i dati (semplificati per episodenumber nel sopra il codice), memorizzato in un dizionario Python. La chiave è la categoria, il valore è un elenco di casi di test, per esempio ..

test_cases = {} 
test_cases['example_1'] = [ 
    {'input': 'test.01', 
    'episodenumber': 1}, 
    {'input': 'test.02', 
    'episodenumber': 2} 
] 

test_cases['example_2'] = [ 
    {'input': 'another.123', 
    'episodenumber': 123}, 
    {'input': 'test.e42', 
    'episodenumber': 32} 
] 

Attualmente ho solo un ciclo su tutti i dati, chiamano self.assertEquals su ogni test. Il problema è che, se uno fallisce, non vedo il resto degli errori poiché sono anche raggruppati in un test, che si interrompe quando un'asserzione fallisce.

Il modo per aggirare questo, ho pensato, sarebbe quello di (in modo dinamico) creare una funzione per ogni caso di test, forse c'è un modo migliore?

risposta

12

Per questo si dovrebbe utilizzare il test generators nel naso. Tutto quello che devi fare è produrre una tupla, con il primo essere una funzione e il resto essere gli args. Dai documenti ecco l'esempio.

def test_evens(): 
    for i in range(0, 5): 
     yield check_even, i, i*3 

def check_even(n, nn): 
    assert n % 2 == 0 or nn % 2 == 0 
+0

pytest (http://pytest.org/) supporta anche i test del generatore-based. –

+0

+1 per link utili --- collegamenti su risposte simili su questa e altre domande non avevano quel collegamento. –

21

Nella seguente soluzione, la classe Tests contiene il metodo di supporto check e nessun caso di test definito in modo statico. Quindi, per aggiungere dinamicamente un caso di test, io uso setattr per definire le funzioni nella classe. Nell'esempio seguente, vengono generati i casi di test test_<i>_<j> con i e j spanning [1,3] e [2,5] rispettivamente, che utilizzano il metodo helper check con diversi valori di i e j.

class Tests(unittest.TestCase): 
    def check(self, i, j): 
     self.assertNotEquals(0, i-j) 



for i in xrange(1, 4): 
    for j in xrange(2, 6): 
     def ch(i, j): 
      return lambda self: self.check(i, j) 
     setattr(Tests, "test_%r_%r" % (i, j), ch(i, j)) 
Problemi correlati