2013-03-11 13 views
12

Desidero avere i file della mia applicazione nella cartella/File, mentre le unità di test in/UnitTests, in modo da avere app e test chiaramente separati.Python unittest: eseguire test in un altro modulo

Per poter utilizzare gli stessi percorsi del modulo di mainApp.py, ho creato un testController.py nella cartella principale.

mainApp.py 
testController.py 
Files 
    |__init__.py 
    |Controllers 
    | blabla.py 
    | ... 
UnitTests 
    |__init__.py 
    |test_something.py 

Quindi, se in test_something.py Voglio testare una funzione che è in /Files/Controllers/blabla.py, provo il seguente:

import unittest 
import Files.Controllers.blabla as blabla 


class TestMyUnit(unittest.TestCase): 

    def test_stupid(self): 
     self.assertTrue(blabla.some_function()) 


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


E poi dal file testController.py, ho eseguire il seguente codice:

import TestUnits.test_something as my_test 
my_test.unittest.main() 

quali uscite fallimenti, ma nessun test eseguito

---------------------------------------------------------------------- 
Ran 0 tests in 0.000s 

OK 
[Finished in 0.3s] 


Ho provato con un test che non ha dipendenze, e se eseguito come "principale" funziona, ma quando chiamato dall'esterno, emette lo stesso:

import unittest 


def tested_unit(): 
    return True 


class TestMyUnit(unittest.TestCase): 

    def test_stupid(self): 
     self.assertTrue(tested_unit()) 


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

Domanda: come faccio a farlo funzionare?

risposta

4

In test_something.py, fare questo:

def suite(): 
    suite = unittest.TestSuite() 
    suite.addTest(unittest.makeSuite(TestMyUnit, 'test')) 
    return suite 

In testController.py, fare questo:

from TestUnits import test_something 

def suite(): 
    suite = unittest.TestSuite() 
    suite.addTest(test_something.suite()) 
    return suite 

if __name__ == '__main__': 
    unittest.main(defaultTest='suite') 
+0

Questo è un po ' un po 'prolisso, ma funziona, grazie. – bgusach

15

Il metodo unittest.main() guarda tutte le classi di unittest.TestCase presente nel contesto. Quindi è sufficiente importare le classi di test nel file testController.py e chiamare unittest.main() nel contesto di questo file.

Così il vostro testController.py file dovrebbe semplicemente apparire come questo:

import unittest  
from UnitTests.test_something import * 
unittest.main() 
+0

Grazie, ma non funziona. Il risultato è lo stesso: non esegue test. – bgusach

+0

Ok mio male. Devi importare tutti i casi di test dal file test_something. Prova con UnitTests.test_something import TestMyUnit (o *) e dovrebbe funzionare! – rparent

+0

Funziona, grazie. – bgusach

0

C'è una soluzione di utilizzare subprocess.call() per eseguire i test, come:

import subprocess 

args = ["python", "test_something.py"] 
subprocess.call(args) 
Problemi correlati