Einführung in das Testen in Python. Teil 3

Freunde, wir haben tolle Neuigkeiten für euch. Erstens scheint endlich die Sonne auf die Straße, was bedeutet, dass der Frühling beginnt, seine Rechte vollständig zu übernehmen. Die zweite Neuigkeit ist spezialisierter - am 20. März beginnt die erste Lektion in einem neuen Thread zum Kurs "Python Developer" . In diesem Zusammenhang veröffentlichen wir den letzten Teil des Artikels "Einführung in das Testen in Python", dessen vorherige Teile hier und hier gelesen werden können .

Testen in mehreren Umgebungen

Bisher haben Sie eine Version von Python in einer virtuellen Umgebung mit bestimmten Abhängigkeiten getestet. Möglicherweise muss die Anwendung jedoch immer auf mehreren Versionen von Python oder mehreren Versionen des Pakets getestet werden. Tox ist eine Anwendung, die das Testen in mehreren Umgebungen automatisiert.



Tox Installation

Tox ist auf PyPl als Paket verfügbar, das über pip installiert werden kann:

$ pip install tox 

Nach der Installation können Sie Tox konfigurieren.

Anpassen von Tox für Ihre Abhängigkeiten

Tox wird über die Konfigurationsdatei im Projektverzeichnis konfiguriert. Es enthält Folgendes:

  • Der Befehl zum Ausführen der Tests.
  • Alle zusätzlichen Pakete, die zum Ausführen erforderlich sind;
  • Zum Testen ausgewählte Zielversionen von Python.

Anstatt die Syntax zum Konfigurieren von Tox zu lernen, können Sie zunächst eine Schnellstartanwendung starten.

 $ tox-quickstart 

Das Tox-Konfigurationstool stellt Ihnen Fragen und erstellt eine Datei ähnlich der folgenden in tox.ini :

 [tox] envlist = py27, py36 [testenv] deps = commands = python -m unittest discover 

setup.py vor dem Starten von Tox sicher, dass sich die setup.py mit den Installationsschritten für das Paket im Anwendungsordner befindet. Wenn nicht, verwenden Sie die Erstellungsanleitung setup.py .

Wenn Ihr Projekt nicht für die Verteilung auf PyPl vorgesehen ist, können Sie diese Anforderung überspringen, indem Sie der Datei tox.ini unter der Überschrift tox die folgende Zeile hinzufügen:

 [tox] envlist = py27, py36 skipsdist=True 

Wenn Sie die Datei setup.py nicht erstellen und die Anwendung einige Abhängigkeiten von PyPl aufweist, müssen Sie diese im Abschnitt testenv . Zum Beispiel benötigt Django Folgendes:

 [testenv] deps = django 

Am Ende dieses Schritts können Sie die Tests ausführen.

Jetzt können Sie Tox ausführen und es werden zwei virtuelle Umgebungen erstellt: eine für Python 2.7 und eine für Python 3.6. Das Tox-Verzeichnis heißt .tox/ . Darin führt Tox -m unittest discover für jede virtuelle Umgebung aus.

Sie können diesen Prozess starten, indem Sie Tox über die Befehlszeile aufrufen:

 $ tox 

Tox liefert Testergebnisse für jede Umgebung. Wenn Sie Tox zum ersten Mal starten, dauert es einige Zeit, virtuelle Umgebungen zu erstellen. Wenn Sie Tox jedoch zum zweiten Mal ausführen, funktioniert alles viel schneller.
Die Ergebnisse von Tox sind ziemlich einfach. Für jede Version werden Umgebungen erstellt, Abhängigkeiten installiert und anschließend Testbefehle ausgeführt.

Es gibt einige zusätzliche Befehlszeilenoptionen, an die Sie sich erinnern sollten.
Ausführen einer einzelnen Umgebung, z. B. Python 3.6:

 $ tox -e py36 

Neuerstellung der virtuellen Umgebung, wenn sich die Abhängigkeit ändert oder Seitenpakete beschädigt werden:

 $ tox -r 

Running Tox mit weniger detaillierten Ergebnissen:

 $ tox -q 

Ausführen von Tox mit ausführlicherer Ausgabe:

 $ tox -v 

Weitere Informationen zu Tox finden Sie auf der Tox-Dokumentationsseite .

Testautomatisierung

Bisher haben Sie Tests manuell durchgeführt, indem Sie den Befehl ausgeführt haben. Es gibt jedoch Tools zum automatischen Ausführen von Tests, wenn Änderungen vorgenommen werden, und zum Festschreiben in ein Repository mit einem Versionskontrollsystem, z. B. Git. Testautomatisierungstools werden häufig als CI / CD-Tools bezeichnet, was „Kontinuierliche Integration / Kontinuierliche Bereitstellung“ bedeutet. Sie können Tests ausführen, Anwendungen kompilieren, veröffentlichen und sogar für die Produktion bereitstellen.
Travis CI ist einer der vielen verfügbaren CI-Dienste.

Travis CI funktioniert gut mit Python, und jetzt können Sie die Ausführung aller erstellten Tests in der Cloud automatisieren! Travis CI ist für Open Source-Projekte auf GitHub und GitLab kostenlos und für private Projekte gegen eine Gebühr erhältlich.

Melden Sie sich zunächst an und authentifizieren Sie sich mit Ihren GitHub- oder GitLab-Anmeldeinformationen. Erstellen Sie dann eine Datei mit dem Namen .travis.yml mit den folgenden Inhalten:

 language: python python: - "2.7" - "3.7" install: - pip install -r requirements.txt script: - python -m unittest discover 

Diese Konfiguration gibt Travis CI die folgenden Anweisungen:

  • Testen auf Python 2.7 und 3.7 (Optional können Sie sie durch andere ersetzen.)
  • Installieren aller in den Anforderungen.txt aufgeführten Pakete (Sie können diesen Abschnitt entfernen, wenn Sie keine Abhängigkeiten haben.)
  • Ausführen von Python -m unittest entdecken, um Tests auszuführen.

Nach dem Festschreiben und Übertragen dieser Datei führt Travis CI diese Befehle jedes Mal aus, wenn Sie sie in Ihr Remote-Git-Repository übertragen. Die Ergebnisse können auf ihrer Website eingesehen werden.

Was weiter

Jetzt wissen Sie, wie Sie Tests schreiben, zu Ihrem Projekt hinzufügen, ausführen und sogar automatisch ausführen, damit Sie sich mit erweiterten Methoden vertraut machen können, die sich mit dem Wachstum der Testbibliothek als nützlich erweisen können.

Linter Einführung in die Anwendung

Tox und Travis CI haben ein Testteam eingerichtet. In diesem Tutorial haben wir Python -m unittest Discover als Testteam verwendet.

Sie können in diesen Tools einen oder mehrere Befehle bereitstellen, mit denen neue Tools hinzugefügt werden, um die Qualität der Anwendung zu verbessern.

Eine solche Anwendung ist der Linter. Er wird sich Ihren Code ansehen und Kommentare hinterlassen. So kann er Ratschläge zu Fehlern geben, Leerzeichen korrigieren und sogar mögliche Fehler antizipieren.

Weitere Informationen zu Lintern finden Sie im Python Code Quality Tutorial .

Passives Flusen mit Flake8

flake8 ist ein beliebter Linter, der Kommentare zum Stil Ihres Codes gemäß der PEP 8- Spezifikation hinterlässt.

Sie können flake8 mit pip installieren:

 $ pip install flake8 

Dann können Sie flake8 für eine einzelne Datei, einen Ordner oder eine Vorlage flake8 :

 $ flake8 test.py test.py:6:1: E302 expected 2 blank lines, found 1 test.py:23:1: E305 expected 2 blank lines after class or function definition, found 1 test.py:24:20: W292 no newline at end of file 

In Ihrem von flake8 gefundenen Code wird eine Liste mit Fehlern und Warnungen flake8 .
flake8 kann in der Befehlszeile oder in der Projektkonfigurationsdatei konfiguriert werden. Wenn Sie einige Regeln ignorieren möchten, z. B. E305 (siehe oben), können Sie dies in der Konfiguration festlegen. flake8 überprüft die flake8 Datei im Projektordner oder in der Datei setup.cfg . Wenn Sie Tox verwenden möchten, können Sie den Konfigurationsabschnitt tox.ini zu tox.ini .

In diesem Beispiel werden die Verzeichnisse .git und __pycache__ sowie die E305-Regel ignoriert. Außerdem wird die maximale Zeichenfolgenlänge von 80 Zeichen auf 90 Zeichen erhöht. Sie werden irgendwann feststellen, dass die Standardbeschränkung von 79 Zeichen pro Zeile nicht für Tests geeignet ist, die lange Methodennamen, Zeichenfolgenliterale mit Testwerten und enthalten können andere lange Daten. Erhöhen Sie für Tests normalerweise die Zeichenfolgenlänge auf 120 Zeichen:

 [flake8] ignore = E305 exclude = .git,__pycache__ max-line-length = 90 

Alternativ können Sie diese Optionen in der Befehlszeile bereitstellen:

 $ flake8 --ignore E305 --exclude .git,__pycache__ --max-line-length=90 

Eine vollständige Liste der Einstellungen finden Sie auf der Dokumentationsseite .
Jetzt können flake8 Ihrem CI-Setup flake8 hinzufügen. Für Travis CI sieht es folgendermaßen aus:

 matrix: include: - python: "2.7" script: "flake8" 

Travis liest die Konfiguration in .flake8 und kann den Build nicht abschließen, wenn .flake8 . flake8 Sie sicher, dass Sie die flake8 Abhängigkeit zur Datei flake8 hinzufügen.

Aggressives Flusen mit Code-Formatierer

flake8 ist ein passiver Linter, der nur Änderungen empfiehlt, die Sie selbst in den Code eingeben müssen. Code-Formatierer ist ein aggressiverer Ansatz. Der Code wird automatisch entsprechend den Stilen und Layouts geändert.

black ist ein sehr unaufhaltsamer Formatierer. Es hat keine Einstellungen und es ist sehr genau. Das macht es zu einem großartigen Werkzeug, um es in Ihre Testpipeline einzufügen.

Bitte beachten Sie: Schwarz erfordert Python Version 3.6 und höher.

Sie können black mit pip installieren:

 $ pip install black 

Um von der Befehlszeile aus zu beginnen, geben Sie die Datei oder das Verzeichnis an, die Sie formatieren möchten:

 $ black test.py 

Halten Sie den Testcode sauber

Möglicherweise stellen Sie fest, dass Sie beim Schreiben von Tests Codefragmente viel häufiger kopieren und einfügen als beim Erstellen regulärer Anwendungen. Von Zeit zu Zeit können Tests sehr eintönig sein, aber dies ist kein Grund, den Code in einer ungenauen und fragmentierten Form zu löschen.

Im Laufe der Zeit wird sich in Ihrem Testcode eine technische Verschuldung ansammeln, und es wird sich aufgrund der Struktur als sehr schwierig herausstellen, die Änderungen vorzunehmen, die für wesentliche Änderungen des Anwendungscodes in den Tests erforderlich sind.

Versuchen Sie beim Schreiben von Tests, das DRY-Prinzip zu befolgen: Wiederholen Sie sich nicht.

Testgeräte und -funktionen sind eine großartige Möglichkeit, Code zu schreiben, der einfach zu warten ist. Vergessen Sie auch nicht die Leichtigkeit des Lesens. flake8 Sie die Bereitstellung von flake8 wie flake8 für Ihren flake8 :

 $ flake8 --max-line-length=120 tests/ 

Tests zur Erkennung von Produktivitätsverlusten zwischen den Bearbeitungen

Es gibt viele Möglichkeiten, Code in Python zu vergleichen. Die Standardbibliothek verfügt über ein Zeitmodul, das Funktionen mehrmals plant und Ihnen die Verteilung anzeigt. In diesem Beispiel wird test () 100 Mal ausgeführt und anschließend mit print () ausgegeben:

 def test(): # ... your code if __name__ == '__main__': import timeit print(timeit.timeit("test()", setup="from __main__ import test", number=100)) 

Wenn Sie sich für die Verwendung von pytest als Testläufer entscheiden, lesen Sie das Pytest-Benchmark-Plugin. Es bietet eine Pytest-Vorrichtung namens Benchmark. Jedes aufgerufene Objekt kann als Benchmark () übergeben werden. Es analysiert die Zeit der aufgerufenen Pytestergebnisse.

Sie können pytest-Benchmark von PyPl mit pip installieren:

 $ pip install pytest-benchmark 

Anschließend können Sie einen Test mit fixture hinzufügen und das aufgerufene Objekt an die Ausführung übergeben:

 def test_my_function(benchmark): result = benchmark(test) 

Wenn Sie pytest ausführen, erhalten Sie Benchmark-Ergebnisse:



Weitere Informationen finden Sie auf der Dokumentationsseite .

Testen auf Identifizieren von Sicherheitsfehlern

Ein weiterer Test, den Sie für Ihre Anwendung ausführen sollten, ist die Überprüfung auf häufige Fehler und Sicherheitslücken.

Installieren Sie bandit von PyPl mit pip:

 $ pip install bandit 

Anschließend können Sie den Namen Ihres Anwendungsmoduls mit dem Flag -r und kurze Informationen erhalten:

 $ bandit -r my_sum [main] INFO profile include tests: None [main] INFO profile exclude tests: None [main] INFO cli include tests: None [main] INFO cli exclude tests: None [main] INFO running on Python 3.5.2 Run started:2018-10-08 00:35:02.669550 Test results: No issues identified. Code scanned: Total lines of code: 5 Total lines skipped (#nosec): 0 Run metrics: Total issues (by severity): Undefined: 0.0 Low: 0.0 Medium: 0.0 High: 0.0 Total issues (by confidence): Undefined: 0.0 Low: 0.0 Medium: 0.0 High: 0.0 Files skipped (0): 

Wie bei flake8 können die bandit konfiguriert werden. Wenn Sie einige davon ignorieren möchten, können Sie der Datei setup.cfg das folgende Fragment mit Parametern hinzufügen:

 [bandit] exclude: /test tests: B101,B102,B301 

Weitere Informationen auf der GitHub-Website .

Fazit

Python hat Tests dank der integrierten Befehle und Bibliotheken verfügbar gemacht, die zur Überprüfung des korrekten Betriebs von Anwendungen erforderlich sind. Es ist einfach, mit dem Testen in Python zu beginnen: Sie können unittest verwenden und kleine, einfach zu wartende Methoden schreiben, um den Code zu testen.

Wenn Sie mehr über das Testen und Erweitern Ihrer Anwendung erfahren möchten, sollten Sie zu einem der Testframeworks wie pytest wechseln, um erweiterte Funktionen zu verwenden.

Danke fürs Lesen. Haben Sie eine unverwechselbare Zukunft mit Python!

Und für diejenigen, die den Artikel gelesen haben, haben wir noch eine gute Nachricht. Im Moment können Sie den Python Developer- Kurs mit einem Rabatt von 10.000 Rubel erhalten!

Erster Teil
Zweiter Teil

Source: https://habr.com/ru/post/de444204/


All Articles