2013-06-23 16 views
10

Vorrei eseguire un'iterazione su un elenco di elementi ed eseguire un'asserzione su ciascuno di essi. Un esempio potrebbe essere verificare se ciascun numero in una lista è dispari.Istanziare Python unittest.TestCase con argomenti

TestCase:

class TestOdd(unittest.TestCase): 
    def runTest(self): 
     """Assert that the item is odd""" 
     self.assertTrue(NUMBER %2==1, "Number should be odd") 

prova suite:

if __name__ == '__main__': 
    suite = unittest.TestSuite() 
    suite.addTest(TestOdd()) 
    # I would like to have: 
    # suite.addTest(TestOdd(1)) 
    # suite.addTest(TestOdd(2)) 
    # suite.addTest(TestOdd(3)) 
    # ... 
    unittest.main() 

Come posso istanziare un oggetto TestOdd con un argomento - per esempio, il numero da testare?

Aggiornamento: in base a un post del blog del 2011 (pubblicato come risposta), non esiste un meccanismo integrato per i test parametrizzati. Sarò felice di accettare qualsiasi soluzione più pulita.

+0

Vedi anche: [Accesso argomenti argparse dalla classe] (http: //codereview.stackexchange. it/q/88655/15346) presso CR – kenorb

risposta

4

Lo stesso può essere ottenuto utilizzando gli attributi di classe.

class TestOdd1(unittest.TestCase): 
    NUMBER=1 
    def runTest(self): 
     """Assert that the item is odd""" 
     self.assertTrue(self.NUMBER % 2 == 1, "Number should be odd") 

class TestOdd2(TestOdd1): 
    NUMBER=2 

if __name__ == '__main__': 
    unittest.main() 

L'unit testing scoprirà automaticamente, quindi non c'è bisogno di creare una suite.

Se si vuole evitare di utilizzare un TestCase per classe di base, è possibile utilizzare l'ereditarietà multipla:

from unittest import TestCase, main 

class TestOdd: 
    def runTest(self): 
     """Assert that the item is odd""" 
     self.assertTrue(self.NUMBER % 2 == 1, "Number should be odd") 

class TestOdd1(TestOdd, TestCase): 
    NUMBER=1 
class TestOdd2(TestOdd, TestCase): 
    NUMBER=2 

if __name__ == '__main__': 
    main() 
9

Secondo "Python unit testing: parametrized test cases", pubblicato nel blog di Eli Bendersky:

serie di Python unittest biblioteca è grande e lo uso per tutto il tempo. Una cosa che manca, tuttavia, è un modo semplice per eseguire i casi di test parametrizzati . In altre parole, non è possibile passare facilmente gli argomenti in un unestest.TestCase dall'esterno.

soluzione di Eli eredita unittest.TestCase in ParametrizedTestCase. Non sono sicuro dei problemi di copyright, quindi non copierò il codice qui.

Se c'è una soluzione migliore, sarò felice di accettarlo.

Problemi correlati