2009-05-15 9 views
2

Ich schrieb eine kleine Funktion, die unittest.TestCase-Klassen (trivial Version unten) dynamisch definiert.Running unittest.main() von einem Modul?

Wenn ich es aus der gleichen Quelldatei in ein eigenes Modul verschoben habe, kann ich nicht herausfinden, wie man unittest erhält, um die neuen Klassen zu entdecken. Der Aufruf von unittest.main() aus einer der beiden Dateien führt keine Tests aus.

factory.py:

import unittest 

_testnum = 0 
def test_factory(a, b): 

    global _testnum 

    testname = 'dyntest' + str(_testnum) 

    globals()[testname] = type(testname, (unittest.TestCase,), {'testme': lambda self: self.assertEqual(a, b)}) 

    _testnum += 1 


def finish(): 
    unittest.main() 

someotherfile.py:

from factory import test_factory, finish 


test_factory(1, 1) 
test_factory(1, 2) 


if __name__ == '__main__': 
    finish() 

Ausgang:

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

OK 

es ist also keine Tests durchführen.

Beachten Sie, dass sie alle in der gleichen Datei zu halten wie erwartet funktioniert:

import unittest 

_testnum = 0 
def test_factory(a, b): 

    global _testnum 

    testname = 'dyntest' + str(_testnum) 

    globals()[testname] = type(testname, (unittest.TestCase,), {'testme': lambda self: self.assertEqual(a, b)}) 

    _testnum += 1 


test_factory(1, 1) 
test_factory(1, 2) 

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

Ausgang (wie erwartet):

.F 
====================================================================== 
FAIL: testme (__main__.dyntest1) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "partb.py", line 11, in <lambda> 
    globals()[testname] = type(testname, (unittest.TestCase,), {'testme': lambda self: self.assertEqual(a, b)}) 
AssertionError: 1 != 2 

---------------------------------------------------------------------- 
Ran 2 tests in 0.008s 

FAILED (failures=1) 

Wie ich meine test_factory() Funktion verwenden, so dass ich ausführen kann alle TestCase-Objekte, die es aus einer separaten Quelldatei definiert?

Antwort

7

Standardmäßig sucht unittest.main() nach UnitCase-Objekten im Hauptmodul. Die test_factory erstellt die TestCase-Objekte in einem eigenen Modul. Deshalb verursacht das Verschieben außerhalb des Hauptmoduls das Verhalten, das Sie sehen.

Versuchen:

def finish(): 
    unittest.main(module=__name__) 
+1

-1: Kein Hinweis auf die Dokumentation. –

9

Die allgemeine Idee (was unittest.main für Sie tut) ist:

suite = unittest.TestLoader().loadTestsFromTestCase(SomeTestCase) 
unittest.TextTestRunner(verbosity=2).run(suite) 

gemäß http://docs.python.org/library/unittest.html?highlight=unittest#module-unittest. Ihre Testfälle sind in globals() durch die test_factory Funktion versteckt, also tun Sie einfach eine dir(), finden Sie die Globals, die Instanzen von unittest.TestCase sind (oder diejenigen mit Namen beginnend mit 'dyntest', etc.), und bauen Sie einfach Ihre Suite auf diese Weise und führen Sie es aus.

Verwandte Themen