Wenn Sie eine __init__.py
Datei innerhalb von Tests hinzufügen möchten, können Sie eine load_tests
Funktion dort platzieren, die die Erkennung für Sie übernimmt.
Wenn ein Test Paketname (Verzeichnis mit __init__.py
) das Muster dann wird das Paket für eine ‚load_tests‘ Funktion überprüft werden. Wenn diese vorhanden ist, dann wird es mit Lader, Tests, Muster bezeichnet werden.
Wenn load_tests existiert dann Entdeckung macht nicht recurse in das Paket, ist load_tests verantwortlich alle Tests im Paket zum Laden.
Ich bin weit davon entfernt davon überzeugt, dass dies der beste Weg ist, aber eine Möglichkeit, diese Funktion zu schreiben, wäre:
import os
import pkgutil
import inspect
import unittest
# Add *all* subdirectories to this module's path
__path__ = [x[0] for x in os.walk(os.path.dirname(__file__))]
def load_tests(loader, suite, pattern):
for imp, modname, _ in pkgutil.walk_packages(__path__):
mod = imp.find_module(modname).load_module(modname)
for memname, memobj in inspect.getmembers(mod):
if inspect.isclass(memobj):
if issubclass(memobj, unittest.TestCase):
print("Found TestCase: {}".format(memobj))
for test in loader.loadTestsFromTestCase(memobj):
print(" Found Test: {}".format(test))
suite.addTest(test)
print("=" * 70)
return suite
ziemlich hässlich, ich bin einverstanden.
Zuerst fügen Sie alle Unterverzeichnisse auf den Pfad der Testpakete (Docs).
Dann verwenden Sie pkgutil
den Weg zu gehen, für Pakete oder Module suchen.
Wenn es einen findet, überprüft es dann die Modulmitglieder, ob sie Klassen sind und ob es sich um Klassen handelt, ob es sich um Unterklassen von unittest.TestCase
handelt. Wenn dies der Fall ist, werden die Tests innerhalb der Klassen in die Testsuite geladen.
So, jetzt aus Ihrem Projektstamm, können Sie
python -m unittest discover -p tests
Mit dem -p
Muster Switch-Typ. Wenn alles gut geht, werden Sie sehen, was ich sah, was so etwas wie ist:
Found TestCase: <class 'test_tc.TestCase'>
Found Test: testBar (test_tc.TestCase)
Found Test: testFoo (test_tc.TestCase)
Found TestCase: <class 'test_employee.TestCase'>
Found Test: testBar (test_employee.TestCase)
Found Test: testFoo (test_employee.TestCase)
======================================================================
....
----------------------------------------------------------------------
Ran 4 tests in 0.001s
OK
das, was erwartet wurde, jede meiner zwei Beispieldateien enthalten zwei Tests, testFoo
und testBar
jeder.
Edit: Nach etwas mehr graben, es sieht aus wie Sie diese Funktion angeben könnte als:
def load_tests(loader, suite, pattern):
for imp, modname, _ in pkgutil.walk_packages(__path__):
mod = imp.find_module(modname).load_module(modname)
for test in loader.loadTestsFromModule(mod):
print("Found Tests: {}".format(test._tests))
suite.addTests(test)
Diese die loader.loadTestsFromModule()
Methode anstelle der loader.loadTestsFromTestCase()
Methode verwendet ich oben verwendet.Es ändert immer noch den Paketpfad tests
und geht es auf der Suche nach Modulen, die ich denke, ist der Schlüssel hier.
Die Ausgabe sieht ein bisschen anders jetzt, da wir gefunden Testsuite zu einem Zeitpunkt unsere Testsuite suite
sind und fügte hinzu:
python -m unittest discover -p tests
Found Tests: [<test_tc.TestCase testMethod=testBar>, <test_tc.TestCase testMethod=testFoo>]
Found Tests: [<test_employee.TestCase testMethod=testBar>, <test_employee.TestCase testMethod=testFoo>]
======================================================================
....
----------------------------------------------------------------------
Ran 4 tests in 0.000s
OK
Aber wir noch bekommen die vier Tests, die wir erwarten, in beiden Klassen, in beiden Unterverzeichnissen.
Haben Sie sich z.B. http://stackoverflow.com/q/644821/3001761? Ich denke, einige dieser Antworten könnten für Ihre Zwecke angepasst werden. – jonrsharpe