Ich habe ein Verzeichnis, das meine Python-Unit-Tests enthält. Jedes Unit-Test-Modul hat die Form test _ *. Py . Ich versuche, eine Datei mit dem Namen all_test.py zu erstellen , die, wie Sie es erraten haben, alle Dateien in der oben genannten Testform ausführt und das Ergebnis zurückgibt . Ich habe bisher zwei Methoden ausprobiert; beide sind gescheitert. Ich werde die beiden Methoden zeigen, und ich hoffe, jemand da draußen weiß, wie man das tatsächlich richtig macht.
Bei meinem ersten tapferen Versuch dachte ich: "Wenn ich nur alle meine unittest.main()
Testmodule in die Datei importiere und dann diesen Doodad aufrufe, funktioniert es, oder?" Es stellte sich heraus, dass ich falsch lag.
import glob
import unittest
testSuite = unittest.TestSuite()
test_file_strings = glob.glob('test_*.py')
module_strings = [str[0:len(str)-3] for str in test_file_strings]
if __name__ == "__main__":
unittest.main()
Das hat nicht funktioniert, das Ergebnis war:
$ python all_test.py
----------------------------------------------------------------------
Ran 0 tests in 0.000s
OK
Für meinen zweiten Versuch werde ich allerdings versuchen, diese ganze Testsache "manueller" zu machen. Also habe ich versucht, das unten zu tun:
import glob
import unittest
testSuite = unittest.TestSuite()
test_file_strings = glob.glob('test_*.py')
module_strings = [str[0:len(str)-3] for str in test_file_strings]
[__import__(str) for str in module_strings]
suites = [unittest.TestLoader().loadTestsFromName(str) for str in module_strings]
[testSuite.addTest(suite) for suite in suites]
print testSuite
result = unittest.TestResult()
testSuite.run(result)
print result
#Ok, at this point I have a result
#How do I display it as the normal unit test command line output?
if __name__ == "__main__":
unittest.main()
Das hat auch nicht funktioniert, aber es scheint so nah!
$ python all_test.py
<unittest.TestSuite tests=[<unittest.TestSuite tests=[<unittest.TestSuite tests=[<test_main.TestMain testMethod=test_respondes_to_get>]>]>]>
<unittest.TestResult run=1 errors=0 failures=0>
----------------------------------------------------------------------
Ran 0 tests in 0.000s
OK
Ich habe anscheinend eine Suite, und ich kann das Ergebnis ausführen. Ich bin ein wenig besorgt über die Tatsache, dass es heißt, ich habe nur run=1
, scheint so zu sein run=2
, aber es ist Fortschritt. Aber wie übergebe ich das Ergebnis und zeige es an main an? Oder wie kann ich es im Grunde zum Laufen bringen, damit ich diese Datei einfach ausführen und dabei alle Komponententests in diesem Verzeichnis ausführen kann?
quelle
Antworten:
Mit Python 2.7 und höher müssen Sie keinen neuen Code schreiben oder Tools von Drittanbietern verwenden, um dies zu tun. Die rekursive Testausführung über die Befehlszeile ist integriert. Legen Sie ein
__init__.py
in Ihr Testverzeichnis und:Weitere Informationen finden Sie in der unittest-Dokumentation zu Python 2.7 oder Python 3.x.
quelle
Sie könnten einen Testläufer verwenden, der dies für Sie erledigt. Nase ist zum Beispiel sehr gut. Beim Ausführen werden Tests im aktuellen Baum gefunden und ausgeführt.
Aktualisiert:
Hier ist ein Code aus meiner Zeit vor der Nase. Sie möchten wahrscheinlich nicht die explizite Liste der Modulnamen, aber vielleicht ist der Rest für Sie nützlich.
quelle
Wenn Sie in Python 3 Folgendes verwenden
unittest.TestCase
:__init__.py
Datei in Ihremtest
Verzeichnis haben ( muss benannt werdentest/
)test/
stimmen mit dem Muster übereintest_*.py
. Sie können sich in einem Unterverzeichnis unter befindentest/
, und diese Unterverzeichnisse können wie alles benannt werden.Anschließend können Sie alle Tests ausführen mit:
Erledigt! Eine Lösung mit weniger als 100 Zeilen. Hoffentlich spart ein anderer Python-Anfänger Zeit, indem er dies findet.
quelle
Dies ist jetzt direkt von unittest aus möglich: unittest.TestLoader.discover .
quelle
.... ---------------------------------------------------------------------- Ran 4 tests in 0.000s OK
Warum? Der Unterschied, woher kommt es?python file.py
Nun, indem ich den obigen Code ein wenig studierte (speziell mit
TextTestRunner
unddefaultTestLoader
), konnte ich ziemlich nahe kommen. Schließlich habe ich meinen Code behoben, indem ich auch alle Testsuiten an einen einzelnen Suites-Konstruktor übergeben habe, anstatt sie "manuell" hinzuzufügen, wodurch meine anderen Probleme behoben wurden. Also hier ist meine Lösung.Ja, es ist wahrscheinlich einfacher, nur die Nase zu benutzen, als dies zu tun, aber das ist nicht der Punkt.
quelle
Wenn Sie alle Tests aus verschiedenen Testfallklassen ausführen möchten und diese gerne explizit angeben, können Sie dies folgendermaßen tun:
Wo
uclid
ist mein Projekt undTestSymbols
undTestPatterns
sind Unterklassen vonTestCase
.quelle
TestSuite
eine iterable als Argument akzeptiert wird , können Sie diese iterable in einer Schleife erstellen, um Wiederholungen zu vermeidenloader.loadTestsFromTestCase
.Ich habe die
discover
Methode und eine Überladung von verwendetload_tests
, um dieses Ergebnis in einer (meiner Meinung nach minimalen) Anzahl von Codezeilen zu erzielen:Hinrichtung auf fünf so etwas wie
quelle
Ich habe verschiedene Ansätze ausprobiert, aber alle scheinen fehlerhaft zu sein, oder ich muss Code erstellen, das ist ärgerlich. Aber unter Linux gibt es einen bequemen Weg, einfach jeden Test anhand eines bestimmten Musters zu finden und ihn dann einzeln aufzurufen.
und vor allem funktioniert es definitiv.
quelle
Im Falle einer gepackten Bibliothek oder Anwendung möchten Sie dies nicht tun.
setuptools
werde es für dich tun .Sagen Sie einfach, wo sich Ihr Root-Testpaket befindet, wie:
Und renn
python setup.py test
.Die
discover
dateibasierte Erkennung kann in Python 3 problematisch sein, es sei denn, Sie vermeiden relative Importe in Ihre Testsuite, da der Dateiimport verwendet wird. Obwohl es optional unterstützttop_level_dir
, hatte ich einige unendliche Rekursionsfehler. Eine einfache Lösung für einen nicht gepackten Code besteht darin, Folgendes in__init__.py
Ihr Testpaket einzufügen (siehe load_tests-Protokoll ).quelle
Ich verwende PyDev / LiClipse und habe nicht wirklich herausgefunden, wie alle Tests gleichzeitig über die GUI ausgeführt werden können. (Bearbeiten: Sie klicken mit der rechten Maustaste auf den Stammtestordner und wählen
Run as -> Python unit-test
Dies ist meine aktuelle Problemumgehung:
Ich habe diesen Code in ein Modul eingefügt, das
all
in meinem Testverzeichnis aufgerufen wird . Wenn ich dieses Modul als Unittest von LiClipse aus starte, werden alle Tests ausgeführt. Wenn ich nur bestimmte oder fehlgeschlagene Tests wiederholen möchte, werden nur diese Tests ausgeführt. Es stört auch meinen Befehlszeilentestläufer nicht (Nosetests) - es wird ignoriert.Möglicherweise müssen Sie die Argumente
discover
basierend auf Ihrem Projekt-Setup ändern .quelle
Basierend auf der Antwort von Stephen Cagle habe ich Unterstützung für verschachtelte Testmodule hinzugefügt.
Der Code durchsucht alle Unterverzeichnisse von
.
nach*Tests.py
Dateien, die dann geladen werden. Es wird erwartet, dass jede*Tests.py
Klasse eine einzelne Klasse enthält,*Tests(unittest.TestCase)
die nacheinander geladen und nacheinander ausgeführt wird.Dies funktioniert mit einer willkürlichen tiefen Verschachtelung von Verzeichnissen / Modulen, aber jedes Verzeichnis dazwischen muss
__init__.py
mindestens eine leere Datei enthalten . Auf diese Weise kann der Test die verschachtelten Module laden, indem Schrägstriche (oder Backslashes) durch Punkte ersetzt werden (siehereplace_slash_by_dot
).quelle
Dies ist eine alte Frage, aber was jetzt (2019) für mich funktioniert hat, ist:
Alle meine Testdateien befinden sich im selben Ordner wie die Quelldateien und enden mit
_test
.quelle
Da die Testerkennung ein vollständiges Thema zu sein scheint, gibt es einen speziellen Rahmen für die Testerkennung:
Weitere Informationen finden Sie hier: https://wiki.python.org/moin/PythonTestingToolsTaxonomy
quelle
Dieses BASH-Skript führt das Python-Unittest-Testverzeichnis von ANYWHERE im Dateisystem aus, unabhängig davon, in welchem Arbeitsverzeichnis Sie sich befinden: Das Arbeitsverzeichnis
test
befindet sich immer dort, wo sich dieses Verzeichnis befindet.ALLE TESTS, unabhängig $ PWD
Das unittest Python-Modul reagiert empfindlich auf Ihr aktuelles Verzeichnis, es sei denn, Sie geben an, wo (mit der
discover -s
Option).Dies ist nützlich, wenn Sie im
./src
oder./example
Arbeitsverzeichnis bleiben und einen schnellen Gesamttest benötigen:AUSGEWÄHLTE TESTS, unabhängige $ PWD
Ich benenne diese Dienstprogrammdatei:
runone.py
und benutze sie wie folgt:Es ist keine
test/__init__.py
Datei erforderlich, um den Paket- / Speicheraufwand während der Produktion zu belasten.quelle
Hier ist mein Ansatz, indem ich einen Wrapper erstelle , um Tests über die Befehlszeile auszuführen:
Entschuldigen Sie der Einfachheit halber meine Nicht- PEP8- Codierungsstandards.
Dann können Sie für alle Ihre Tests eine BaseTest-Klasse für allgemeine Komponenten erstellen, sodass jeder Ihrer Tests einfach so aussehen würde:
Zum Ausführen geben Sie einfach Tests als Teil der Befehlszeilenargumente an, z.
quelle