Unit-Tests in Python schreiben: Wie fange ich an? [geschlossen]

534

Ich habe mein erstes richtiges Projekt in Python abgeschlossen und jetzt ist es meine Aufgabe, Tests dafür zu schreiben.

Da ich zum ersten Mal ein Projekt durchgeführt habe, schreibe ich zum ersten Mal Tests dafür.

Die Frage ist, wie fange ich an? Ich habe absolut keine Ahnung. Kann mich jemand auf eine Dokumentation / ein Tutorial / einen Link / ein Buch verweisen, mit denen ich mit dem Schreiben von Tests beginnen kann (und ich denke, insbesondere Unit-Tests)?

Ratschläge zu diesem Thema sind willkommen.

user225312
quelle
4
Es ist nie zu spät, Tests zu schreiben, wenn Sie dies beabsichtigen. Besser einige als keine für alle, die sich beschweren ...
Asken
1
Hier ist ein gutes testgetriebenes Entwicklungsbuch, das kostenlos online erhältlich ist: chimera.labs.oreilly.com/books/1234000000754/index.html
Will
4
Gute Ressource Ich bin auf https://www.jeffknupp.com/blog/2013/12/09/improve-your-python-understanding-unit-testing/ gestoßen . Als Neuling in Python fand ich es verständlich.
Fähre
2
Der Per Anhalter durch Python hat einen kurzen Überblick über Tools zum Testen von Einheiten: python-guide-pt-br.readthedocs.io/en/latest/writing/tests
Anton Tarasenko
Der vorherige Kommentar sollte höher bewertet werden, da das Handbuch auch ein Beispielcode-Repository unter github.com/kennethreitz/samplemod enthält, das auch ein guter Ausgangspunkt ist.
Setempler

Antworten:

101

Wenn Sie mit der Verwendung von Unittests noch nicht vertraut sind, ist der einfachste Lernansatz oft der beste. Auf dieser Grundlage zusammen empfehle ich py.testeher als das unittestStandardmodul .

Betrachten Sie diese beiden Beispiele, die dasselbe tun:

Beispiel 1 (unittest):

import unittest

class LearningCase(unittest.TestCase):
    def test_starting_out(self):
        self.assertEqual(1, 1)

def main():
    unittest.main()

if __name__ == "__main__":
    main()

Beispiel 2 (Pytest):

def test_starting_out():
    assert 1 == 1

Unter der Annahme, dass beide Dateien benannt sind test_unittesting.py, wie führen wir die Tests durch?

Beispiel 1 (unittest):

cd /path/to/dir/
python test_unittesting.py

Beispiel 2 (Pytest):

cd /path/to/dir/
py.test
Tim McNamara
quelle
7
Ich habe an mehreren Stellen von der Einfachheit von py.test gehört ( docs.python-guide.org/en/latest/writing/tests/#py-test , docs.python.org/3.5/library/unittest.html#module -unittest , jeffknupp.com/blog/2013/12/09/... ) Warum ist unit-testimmer noch in der Standardbibliothek enthält, wenn py.testund nosebietet die gleiche Funktionalität mit vielen einfacheren Schnittstelle? Ist es nur die Abwärtskompatibilität zur Verfügung zu stellen, oder hat unittesteinige Vorteile hat , dass py.testund nosetestbietet nicht?
Alpha_989
@ alpha_989 Die Standard-Python-Bibliothek soll nicht die besten verfügbaren Tools enthalten. Dafür ist PyPI da. Das Standardpaket unittestist immer noch gut genug. Es ist Standard, was bedeutet, dass es garantiert gut funktioniert. Schließlich muss jeder, der Ihren Code verwendet, keine zusätzlichen Pakete installieren.
Jeyekomon
72

Das kostenlose Python-Buch Dive Into Python enthält ein Kapitel über Unit-Tests , das Sie möglicherweise nützlich finden.

Wenn Sie modernen Praktiken folgen, sollten Sie die Tests wahrscheinlich schreiben, während Sie Ihr Projekt schreiben, und nicht warten, bis Ihr Projekt fast abgeschlossen ist.

Etwas spät, aber jetzt weißt du es für das nächste Mal. :) :)

Mark Byers
quelle
13
Ich würde immer noch sagen, wenn Sie Code ohne Unit-Tests umgestalten möchten, sollten Sie zuerst Unit-Tests dafür schreiben
Hubert Kario
9
Ja, viele Leute, die zum ersten Mal zu Unittests kommen, hören von alten Hasen, was sich wie "Nun, es ist etwas zu spät für Ihr aktuelles Projekt" anhört: Auch wenn dies nicht das ist, was sie eigentlich sagen wollten, hören Neulinge das . Es ist wie das chinesische Sprichwort über das Pflanzen eines Baumes: Die beste Zeit, um Tests zu beginnen, ist zu Beginn eines Projekts; Die zweitbeste Zeit, um Tests zu starten, ist jetzt!
JP
4
Das Eintauchen in die Python-Verbindung ist unterbrochen ... :-(
Scott Skiles
40

Meiner Meinung nach gibt es drei großartige Python-Test-Frameworks, die sich gut testen lassen.
unittest - Modul wird standardmäßig mit allen Python-Distributionen
geliefert - kann unittest-Tests ausführen und verfügt über weniger Boilerplate.
pytest - führt auch unittest Tests durch, hat weniger Boilerplate, bessere Berichterstattung, viele coole Zusatzfunktionen

Um einen guten Vergleich all dieser zu erhalten, lesen Sie die jeweiligen Einführungen unter http://pythontesting.net/start-here .
Es gibt auch erweiterte Artikel über Spielpaarungen und mehr.

Okken
quelle
35

Die Dokumente für unittest wären ein guter Anfang.

Es ist jetzt auch etwas spät, aber in Zukunft sollten Sie vor oder während des Projekts selbst Unit-Tests schreiben. Auf diese Weise können Sie sie zum Testen verwenden, und (theoretisch) können Sie sie als Regressionstests verwenden, um zu überprüfen, ob Ihre Codeänderungen keinen vorhandenen Code beschädigt haben. Dies würde Ihnen den vollen Vorteil geben, Testfälle zu schreiben :)

Justin Ethier
quelle
Das ist, wenn Sie eine testgetriebene Entwicklung wollen, was keine schlechte Sache ist. In meinem Fall schaue ich mir vorhandenen Code an und versuche ihn zu verstehen, indem ich Tests schreibe und optimiere, um ihn zu bestehen. Das hat mich dazu gebracht unittest. Sobald ich den Dreh raus habe, werde ich es mehr für die Entwicklung verwenden und die Anzahl der Testfälle für jede Einheit erhöhen.
Eiswasser
27

unittest wird mit der Standardbibliothek geliefert , aber ich würde Ihnen Nosetests empfehlen .

"Die Nase erstreckt sich am wenigsten, um das Testen zu erleichtern. "

Ich würde Ihnen auch Pylint empfehlen

" analysiert Python-Quellcode auf Fehler und Anzeichen von schlechter Qualität. "

ssoler
quelle
8

Wie andere bereits geantwortet haben, ist es spät, Unit-Tests zu schreiben, aber nicht zu spät. Die Frage ist, ob Ihr Code testbar ist oder nicht. In der Tat ist es nicht einfach, vorhandenen Code zu testen, es gibt sogar ein Buch darüber: Effektiv mit Legacy-Code arbeiten (siehe wichtige Punkte oder PDF-Vorläufer ).

Jetzt die Unit-Tests zu schreiben oder nicht, ist Ihr Anruf. Sie müssen sich nur bewusst sein, dass dies eine mühsame Aufgabe sein kann. Sie können dies in Angriff nehmen, um Unit-Tests zu lernen, oder zuerst in Betracht ziehen, Akzeptanztests (End-to-End-Tests) zu schreiben und Unit-Tests zu schreiben, wenn Sie den Code ändern oder dem Projekt neue Funktionen hinzufügen.

Philant
quelle
2
+1 für "Effektiv mit Legacy-Code arbeiten". Es geht um Code, der keine Tests hat.
David
3

nosetests ist eine brillante Lösung für Unit-Tests in Python. Es unterstützt sowohl unittest-basierte Testfälle als auch Doctests und erleichtert Ihnen den Einstieg mit einer einfachen Konfigurationsdatei.

Daniel Kluev
quelle
Ihr Nosetests-Link ist veraltet. Es scheint, der neue Ort ist: Nase.readthedocs.org/en/latest
Odigity
1
Gemäß der Dokumentation auf Github und der Nosetest-Website noseund nose2befinden sich im Wartungsmodus. Es ist besser zu beginnen, py.testda es viel mehr Unterstützung hat
Alpha_989