In unserem Team definieren wir die meisten Testfälle folgendermaßen:
Eine "Framework" -Klasse ourtcfw.py
:
import unittest
class OurTcFw(unittest.TestCase):
def setUp:
# something
# other stuff that we want to use everywhere
und viele Testfälle wie testMyCase.py:
import localweather
class MyCase(OurTcFw):
def testItIsSunny(self):
self.assertTrue(localweather.sunny)
def testItIsHot(self):
self.assertTrue(localweather.temperature > 20)
if __name__ == "__main__":
unittest.main()
Wenn ich neuen Testcode schreibe und ihn häufig ausführen und Zeit sparen möchte, setze ich "__" vor alle anderen Tests. Aber es ist umständlich, lenkt mich von dem Code ab, den ich schreibe, und das dadurch verursachte Commit-Rauschen ist einfach ärgerlich.
Wenn testItIsHot()
ich z. B. Änderungen an vornehme , möchte ich dies tun können:
$ python testMyCase.py testItIsHot
und sind nurunittest
gelaufen testItIsHot()
Wie kann ich das erreichen?
Ich habe versucht, den if __name__ == "__main__":
Teil neu zu schreiben , aber da ich neu in Python bin, fühle ich mich verloren und stoße immer wieder auf alles andere als die Methoden.
quelle
__init__.py
in diesem Verzeichnis (und gegebenenfalls Unterverzeichnissen) erstellen und z.python test/testMyCase.py test.MyCase.testItIsHot
.Wenn Sie Ihre Testfälle organisieren, folgen Sie der gleichen Organisation wie der eigentliche Code und verwenden Sie auch relative Importe für Module im selben Paket
Sie können auch das folgende Befehlsformat verwenden:
Python3-Dokumentation hierzu: https://docs.python.org/3/library/unittest.html#command-line-interface
quelle
Es kann gut funktionieren, wie Sie vermuten
Und es gibt noch eine andere Möglichkeit, nur zu testen
testItIsHot
:quelle
Wenn Sie sich die Hilfe des unittest-Moduls ansehen, werden verschiedene Kombinationen beschrieben, mit denen Sie Testfallklassen aus einem Modul und Testmethoden aus einer Testfallklasse ausführen können.
Es ist nicht erforderlich, dass Sie a
unittest.main()
als Standardverhalten Ihres Moduls definieren.quelle
usage
sogar seltsamerweise inkonsistent ist): Ausführenpython -m unittest module_test.TestClass.test_method
setzt eine Datei vorausmodule_test.py
(Ausführen aus dem aktuellen Verzeichnis; und__init.py__
ist nicht erforderlich); undmodule_test.py
enthält,class TestClass(unittest.TestCase)...
die enthältdef test_method(self,...)
(dies funktioniert auch für mich auf Python 2.7.13)Vielleicht ist es für jemanden hilfreich. Wenn Sie nur Tests einer bestimmten Klasse ausführen möchten:
Es funktioniert für mich in Python 3.6
quelle
Inspiriert von @yarkee habe ich es mit einem Teil des Codes kombiniert, den ich bereits erhalten habe. Sie können dies auch von einem anderen Skript aus aufrufen, indem Sie die Funktion aufrufen,
run_unit_tests()
ohne die Befehlszeile verwenden zu müssen, oder sie einfach über die Befehlszeile mit aufrufenpython3 my_test_file.py
.Leider funktioniert dies nur für
Python 3.3
oder überlegen:Runner-Code:
Wenn Sie den Code ein wenig bearbeiten, können Sie ein Array mit allen Unit-Tests übergeben, die Sie aufrufen möchten:
Und noch eine Datei:
Alternativ können Sie https://docs.python.org/3/library/unittest.html#load-tests-protocol verwenden und die folgende Methode für Ihr Testmodul / Ihre Testdatei definieren:
Wenn Sie die Ausführung auf eine einzelne Testdatei beschränken möchten, müssen Sie nur das Testerkennungsmuster auf die einzige Datei festlegen, in der Sie die
load_tests()
Funktion definiert haben .Verweise:
Alternativ zum letzten Hauptprogrammbeispiel habe ich nach dem Lesen der
unittest.main()
Methodenimplementierung die folgende Variante gefunden :quelle
TL; DR : Dies würde sehr wahrscheinlich funktionieren:
Die Erklärung :
Der bequeme Weg
würde funktionieren, ABER seine unausgesprochene Annahme ist, dass Sie dieses herkömmliche Code-Snippet bereits (normalerweise am Ende) Ihrer Testdatei haben.
Der unbequeme Weg
würde immer funktionieren, ohne dass Sie dieses
if __name__ == "__main__": unittest.main()
Code-Snippet in Ihrer Testquelldatei haben müssen.Warum wird die zweite Methode als unpraktisch angesehen? Weil es ein Schmerz wäre, wenn Sie diesen langen, punktbegrenzten Pfad von Hand eingeben (_ fügen Sie hier einen Ihrer Körperteile ein _). Während in der 1. Methode die
mypkg/tests/test_module.py
Teil automatisch vervollständigt werden, entweder durch eine moderne Shell oder durch Ihren Editor.PS: Wenn Sie dachten, dass sich der Körperteil irgendwo unterhalb Ihrer Taille befindet, sind Sie eine authentische Person. :-) Ich will "Fingergelenk" sagen. Zu viel Tippen wäre schlecht für Ihre Gelenke. ;-);
quelle