2012-01-25 12 views
6

Sto usando unittest del Python con semplice codice in questo modo:Come posso estrarre un elenco di TestCase da un TestSuite?

suite = unittest.TestSuite() 
suite.addTest(unittest.defaultTestLoader.loadTestsFromTestCase(module1)) 
suite.addTest(unittest.defaultTestLoader.loadTestsFromTestCase(module2)) 

Tuttavia, Sono voler fare alcune cose personalizzate per ogni test dopo che sono stati raccolti dalla suite. Ho pensato che avrei potuto fare qualcosa di simile per scorrere i casi di test in suite:

print suite.countTestCases() 
for test in suite:    # Also tried with suite.__iter__() 
    # Do something with test 
    print test.__class__ 

Tuttavia, per il maggior numero di casi di test, come ho carico, sempre e solo stampa

3 
<class 'unittest.suite.TestSuite'> 

C'è un modo Posso ottenere tutti gli oggetti della classe TestCase dalla suite? C'è un altro modo in cui dovrei caricare i casi di test per facilitare questo?

risposta

5

Prova

for test in suite: 
    print test._tests 
+1

Ok, penso che sia quello che volevo. Ho notato i _test, ma stavo cercando di chiamarlo 'print suite._tests'. Immagino che mi limiterò a farmi diventare un noob in Python. – denaje

+0

Stavo per, ma a quanto pare devi aspettare 10 minuti prima di accettare. Grazie mille! – denaje

1

Io uso questa funzione come alcuni degli elementi in suite._tests sono suite stessi:

def list_of_tests_gen(s): 
    """ a generator of tests from a suite 

    """ 
    for test in s: 
    if unittest.suite._isnotsuite(test): 
     yield test 
    else: 
     for t in list_of_tests_gen(test): 
     yield t 
0

Un modo pulito di ottenere l'elenco dei test è quello di utilizzare i nose2 raccolgono collegare.

$ nose2 -s <testdir> -v --plugin nose2.plugins.collect --collect-only 
test_1 (test_test.TestClass1) 
Test Desc 1 ... ok 
test_2 (test_test.TestClass1) 
Test Desc 2 ... ok 
test_3 (test_test.TestClass1) 
Test Desc 3 ... ok 
test_2_1 (test_test.TestClass2) 
Test Desc 2_1 ... ok 
test_2_2 (test_test.TestClass2) 
Test Desc 2_2 ... ok 

---------------------------------------------------------------------- 
Ran 5 tests in 0.001s 

OK 

In realtà non esegue i test.

È possibile installare nose2 (ed è) come questo plugin:

$ pip install nose2 

E naturalmente è possibile utilizzare nose2 per eseguire unit test per esempio come questo o questo:

# run tests from testfile.py 
$ nose2 -v -s . testfile 

# generate junit xml results: 
$ nose2 -v --plugin nose2.plugins.junitxml -X testfile --junit-xml 
$ mv nose2-junit.xml results_testfile.xml 
Problemi correlati