Das Material, dessen Übersetzung wir heute veröffentlichen, ist Tools gewidmet, mit denen Python-Projekte mit Tools zur Code-Formatierung, zum Testen, zur kontinuierlichen Integration und zur Abhängigkeitsanalyse ausgestattet werden können. Dies beschleunigt den Entwicklungsprozess und verbessert die Qualität, Einheitlichkeit und Sicherheit des Codes. Es wird davon ausgegangen, dass der Leser dieses Materials bereits Erfahrung in der Python-Entwicklung und in einem Python-Projekt hat, mit dem er beim Lesen experimentieren wird. Wenn Sie kein solches Projekt haben, erfahren Sie
hier , wie Sie eine Entwicklungsumgebung vorbereiten und ein Python-Paket erstellen. Die hier aufgeführten Beispiele werden mit macOS und Python 3.7 erstellt.

Schritt 1. Schwarz installieren
Der Projektcode muss den Konventionen des Codestils entsprechen.
Schwarz ist ein Python-Paket, das den Code automatisch formatiert und sein Erscheinungsbild dem
PEP 8- Standard entspricht. Schwarz ist ein relativ neues Projekt, aber es hat bereits über eine Million Downloads erhalten. Seine Verwendung wurde schnell zu einem Zeichen für guten Geschmack in der Python-Entwicklung.
Hier ist das Black-Handbuch.
Ich verwende als Code-Editor Atom und habe Atom das
Python-Black
Paket hinzugefügt. Hier erfahren Sie, wie Sie es installieren. Nach der Installation dieses Pakets formatiert Atom den Code nach dem Speichern der Datei neu.
Während wir über Schwarz sprechen, statten wir dieses Tool mit der Entwicklungsumgebung derer aus, die mit uns an dem Projekt arbeiten. Infolgedessen verwendet jeder, der an dem Projekt arbeitet, dieselben Code-Formatierungsregeln, andernfalls werden seine Pull-Anforderungen nicht akzeptiert.
Fügen Sie den
black==18.9b0
zur ersten gefundenen freien Zeile der Datei "
black==18.9b0
und führen Sie den Befehl "
install -r requirements_dev.txt
black==18.9b0
.
Schwarz legt die Länge der Codezeile standardmäßig auf 88 Zeichen fest. Einige Styleguides wie
Sphinx erfordern eine Zeichenfolgenlänge von 79 Zeichen. In den Einstellungen des
Black-Atom
Pakets können Sie die gewünschte Zeilenlänge einstellen.
Nachdem wir nun ein Tool haben, mit dem Sie Zeit bei der Code-Formatierung sparen können, werden wir uns überlegen, wie Sie das Senden von Code an PyPI beschleunigen und vereinfachen können.
Schritt 2. Erstellen der .pypirc-Datei
Wenn mit Twine Anwendungsassemblys an TestPyPI und PyPI gesendet werden, müssen
Sie die Anmeldeinformationen manuell eingeben. Wenn Sie mit Garn nicht vertraut sind, schauen Sie sich
dieses Material an. Jetzt werden wir diesen Prozess automatisieren.
Twine kann mit der
.pypirc
Datei arbeiten, die sich in unserem Home-Verzeichnis befinden sollte. Dieses Tool entlädt beim Entladen von Daten eine URL, einen Benutzernamen und ein Kennwort aus einer bestimmten Datei.
Erstellen Sie also eine
.pypirc
Datei in Ihrem Home-Verzeichnis:
touch ~/.pypirc
Fügen Sie den folgenden Text hinzu:
[distutils] index-servers = pypi testpypi [testpypi] repository: https://test.pypi.org/legacy username = your_username password = your_pypitest_password [pypi] username = your_username password = your_pypi_password
Es ist klar, dass Sie hier Ihren echten Benutzernamen und Ihr Passwort eingeben müssen. Überprüfen Sie außerdem, ob diese Datei im Ausgangsverzeichnis und nicht im aktuellen Arbeitsverzeichnis gespeichert ist. Wenn Sie diese Datei vor anderen Benutzern schützen möchten, können Sie mithilfe der Befehlszeilentools ihre Berechtigungen konfigurieren:
chmod 600 ~/.pypirc
Jetzt kann Ihr Paket mit dem folgenden Befehl in TestPyPI geladen werden:
twine upload -r testpypi dist/*
In normalem PyPI können Sie Pakete wie folgt laden:
twine upload dist/*
Nachdem Sie die
.pypirc
Datei erhalten haben, müssen Sie Ihren Benutzernamen und Ihr Passwort nicht mehr manuell eingeben.
Fügen wir nun unserer Entwicklungsumgebung Testtools hinzu, mit denen wir den korrekten Betrieb des von uns erstellten Pakets überprüfen können.
Schritt 3. Installieren und konfigurieren Sie pytest
Pytest ist die beliebteste und
benutzerfreundlichste Bibliothek zum Testen von in Python geschriebenem Code. In diesem Beispiel fügen wir dem Projekt einfache Tests hinzu. Wenn Sie sich für die Details von pytest interessieren, finden Sie hier eine gute Einführung in dieses Tool.
Fügen Sie pytest details zu require_dev.txt hinzu:
pytest==4.3.0
Lassen Sie uns das Paket installieren:
pip install requirements_dev.txt
Führen Sie nun den folgenden Befehl aus, damit pytest unser Paket finden kann:
pip install -e .
Wenn Sie Ihre virtuelle Entwicklungsumgebung deaktiviert haben, müssen Sie beide
pip
Befehle erneut ausführen, um die Tests auszuführen.
Schritt 4. Tests erstellen
Fügen Sie den Testordner zum Stammverzeichnis Ihres Projekts hinzu. Platzieren Sie die Datei
test_your_package_name.py
darin. Meine Datei heißt
test_notebookc.py
. Wenn der Dateiname mit
test_
beginnt, kann pytest eine solche Datei automatisch erkennen.
Ich habe der Datei
test_notebookc.py
den folgenden Test
test_notebookc.py
, um zu überprüfen, ob die Funktion den richtigen Namen anzeigt. Ändern Sie diesen Code so, dass die darin verwendeten Datei- und Funktionsnamen mit Ihren übereinstimmen, und beschreiben Sie darin Ihre eigenen Tests.
"""Tests for `notebookc` package.""" import pytest from notebookc import notebookc def test_convert(capsys): """Correct my_name argument prints""" notebookc.convert("Jill") captured = capsys.readouterr() assert "Jall" in captured.out
Was ist hier los?
Zuerst importieren wir hier unser Modul. Dann erstellen wir eine Funktion, deren Name gemäß der Vorlage
test_my_function_name
. Diese Namenskonvention für Funktionen ermöglicht es anderen Personen, die Ihren Projektcode lesen, schnell zu verstehen, was genau in den Tests getestet wird. Darüber hinaus ist dies für ein Paket erforderlich, mit dessen Hilfe die Codeabdeckung mit Tests gesteuert werden kann. Dies wird weiter unten erläutert.
Danach rufen wir die Funktion (
convert
) auf und übergeben ihr den Namen
Jill
als Argument. Weiter - Erfassen Sie, was die Funktion anzeigt. Hier ist anzumerken, dass die fragliche Funktion äußerst einfach ist. Sie nimmt den Parameter
my_name
und führt Folgendes aus:
print(f"I'll convert a notebook for you some day, {my_name}.")
Pytest prüft, ob
Jall
in den Ausgaben der Funktion enthalten ist. Diese Zeile sollte nicht vorhanden sein, da wir
Jill
Funktionen übergeben.
Hier ist die Pytest-Dokumentation, in der Sie Informationen zum Abfangen von Ausgaben finden.
Führen Sie den Test aus, indem
pytest
an der Eingabeaufforderung
pytest
eingeben. Dieser Test sollte fehlschlagen. Fehlerinformationen werden rot angezeigt.
Während des Tests wurde ein Fehler festgestellt.Es wird empfohlen, die Tests auf ihre Richtigkeit zu überprüfen und sie so zu beschreiben, dass sie unter bestimmten Bedingungen mit einem Fehler enden. Sie sollten keine Tests schreiben, die nur grüne Nachrichten ausgeben, da sich sonst herausstellen kann, dass die Tests überhaupt nicht überprüfen, was sie zur Überprüfung geschrieben wurden.
Nachdem wir sichergestellt haben, dass der Test fehlgeschlagen ist, ändern Sie die
Jall
Anweisung in
Jill
und führen Sie den Test erneut aus. Jetzt sollte es erfolgreich abgeschlossen werden.
Erfolgreicher Abschluss des Tests.Jetzt ist alles gut. Mit dem Test können Sie sicherstellen, dass diese Zeile in den Text fällt, den diese Funktion anzeigt, wenn jemand eine Zeile an unsere Funktion übergibt.
Sie können auch einen Test schreiben, der die Funktion überprüft, wie sie mit den an sie übergebenen Daten umgeht. Wenn es Daten empfängt, deren Typ sich von der Zeichenfolge unterscheidet, sollte es nämlich einen TypeError-Fehler verursachen.
Hier finden Sie einige gute Informationen zu Ausnahmen und zur Fehlerbehandlung in Python.
Als wir den vorherigen Test erstellt haben, haben wir Code geschrieben, der zum erfolgreichen Abschluss des Tests führt. Dies wird als Test-Driven Development (TDD) bezeichnet. TDD ist ein bewährter Programmieransatz, mit dem Sie Code schreiben können, der weniger Fehler aufweist als ohne TDD.
Hier ist ein nützliches TDD-Material.
Versuchen Sie nun als Übung, einen Test zu schreiben, der
convert()
Funktion
convert()
überprüft
convert()
damit beim Übergeben von etwas anderem als der Zeichenfolge ein Fehler ausgegeben wird, und implementieren Sie die entsprechenden Mechanismen für diese Funktion. Beachten Sie, dass Ganzzahlen, Listen und Wörterbücher in Zeichenfolgen konvertiert werden.
Nachdem das Paket die Tests erfolgreich bestanden hat, können wir das kontinuierliche Integrationssystem nutzen.
Schritt 5. Registrierung im Travis CI-Dienst und dessen Konfiguration
Travis CI ist ein "verteilter Webdienst zum Erstellen und Testen von Software". Es wurde kürzlich von
Idera gekauft . Es gibt andere kontinuierliche Integrationssysteme, aber Travis CI ist ein beliebtes Open-Source- und gut dokumentiertes Tool, daher werden wir es verwenden.
Mit Travis CI können Sie nur den Code in Ihr Projekt integrieren, der die Tests besteht und den Standards entspricht.
Hier können Sie mehr über Travis CI und hier über die kontinuierliche
Integration lesen.
Erstellen Sie ein Konto unter
https://travis-ci.org/ . Klicken Sie anschließend auf den Link
Review and add your authorized organizations
auf der Profilseite hinzu. Sie werden aufgefordert, ein Kennwort für den Zugriff auf GitHub einzugeben. Klicken Sie im Bereich
Organization access
auf
Grant
.
Richten Sie ein Travis CI-Konto einIch musste das Konto synchronisieren, damit die Informationen zu
notebooktoall
und dem
notebookc
Repository im Konto angezeigt wurden. Normalerweise dauert es ungefähr eine Minute, bis Travis CI mit Code arbeitet. Danach müssen Sie das Repository mit dem in der folgenden Abbildung gezeigten Schalter aktivieren.
Repository-AktivierungKlicken Sie nun auf die Schaltfläche
Settings
. Hier müssen Sie angeben, ob Travis basierend auf Pull-Anforderungen oder an das Repository gesendeten Zweigen erstellen kann.
Project Build SetupJetzt ist es an der Zeit, das Projekt einzurichten, an dem wir arbeiten. Dadurch kann Travis das Projekt für jede Pull-Anforderung erstellen.
Schritt 6. Erstellen der Datei .travis.yml
Erstellen
.travis.yml
im Projektstammordner eine
.travis.yml
Datei mit den folgenden Inhalten:
dist: xenial language: python python: 3.7.2 install: - pip install -r requirements_dev.txt - pip install -e . script: - pytest
Die
dist: xenial
benötigt, um Travis
dist: xenial
Ubuntu Xenial 16.04 zum Organisieren der virtuellen Umgebung zu verwenden. Zum Testen von Python 3.7-Code wird Ubuntu Xenial benötigt. Details dazu finden Sie
hier .
Im
install
können Sie Pakete installieren, die in der Projektentwicklung verwendet werden.
pip install -e .
Befehl führt die Installation unseres Pakets in der virtuellen Umgebung von Travis durch. Danach kann Travis, der mit dem Pytest beginnt, unser Paket finden.
Schritt 7. Testen in Travis CI
Übernehmen Sie die Änderungen, senden Sie sie an GitHub und führen Sie die PR durch. Travis sollte innerhalb von Sekunden anfangen zu arbeiten.
Travis bei der ArbeitDies ist, was Travis bei der Abwicklung des Projekts tut.
Aktionen, die Travis während der Projektabwicklung ausführtWenn die PR nicht erfolgreich war, wird Travis dies melden. Bitte beachten Sie, dass Sie die Änderungen an denselben Zweig senden können, wenn die Pull-Anforderung nicht erfolgreich ist, und Travis automatisch mit der Arbeit beginnt.
Gehen Sie zu Ihrer Repository-Seite auf der Travis-Website und sehen Sie sich dort um. Hier finden Sie viele interessante Dinge über Baugruppen. Wahrscheinlich werden Sie in Zukunft ein häufiger Gast dieser Seite, wenn Sie versuchen zu verstehen, was die fehlgeschlagene Assembly verursacht hat.
Wenn wir davon ausgehen, dass alles gut gelaufen ist und die Seite grüne Etiketten enthält, war die Überprüfung und Zusammenstellung des Projekts erfolgreich.
Projektmontage erfolgreich abgeschlossenWenn die Seite keine grünen oder roten Beschriftungen enthält, öffnen Sie das Menü
More options
und wählen Sie
Requests
. Wenn hier rote Fehlermeldungen angezeigt werden, analysieren Sie diese. Wenn
Build config file is required
Fehlermeldung "
Build config file is required
.travis.yml
, bedeutet dies, dass Travis Ihre
.travis.yml
Datei nicht im Repository finden kann. Korrigieren Sie es und der Fehler verschwindet.
Travis sendet Benutzer-E-Mails in Fällen, in denen die Montage des Projekts nicht erfolgreich war und in denen es möglich ist, das Problem zu beheben.
Denken Sie daran, dass Sie Commits an Open PR senden können und Travis den Projekterstellungsprozess automatisch neu startet.
Lassen Sie uns nun unser Projekt analysieren, um den Code mit Tests abzudecken.
Schritt 8. Bewertung der Codeabdeckung mit Tests
Mit dem Bericht über die Codeabdeckung mit Tests können Sie herausfinden, welcher Teil des Projektcodes, wenn auch ein kleiner, getestet wurde. Um solche Berichte zu erstellen, verwenden wir das Paket
pytest-cov .
Fügen Sie der Datei required_dev.txt die folgende Zeile hinzu:
pytest-cov==2.6.1
Führen Sie den folgenden Befehl aus:
pytest --cov=my_project_name
In meinem Fall wurde nach
pytest --cov=notebookc
der folgende Bericht angezeigt.
Code Coverage ReportWie sich herausstellte, wird der gesamte Projektcode mit Tests versehen. Solche Indikatoren sind sehr einfach zu erreichen, wenn das gesamte Projekt aus mehreren Codezeilen besteht.
Lassen Sie uns nun über ein Tool sprechen, mit dem Sie den Status des Projekts in der Öffentlichkeit protokollieren können, indem Sie dessen Code mit Tests abdecken.
Schritt 9. Overalls verwenden
Mit dem Coveralls-Projekt können Sie historische Informationen zur Codeabdeckung mit Tests verwalten.
OverallsUm die Funktionen dieses Projekts nutzen zu können, müssen Sie sich auf der Website
https://coveralls.io/ mit den Daten Ihres GitHub-Kontos registrieren. Dann müssen Sie das Repository verbinden.
coveralls==1.6.0
in der Datei
coveralls==1.6.0
. Diese Datei sollte übrigens in dieser Phase der Projektarbeit folgendermaßen aussehen:
pip==19.0.3 wheel==0.33.0 twine==1.13.0 pytest==4.3.0 pytest-cov==2.6.1 coveralls==1.6.0
.travis.yml
Datei
.travis.yml
und in dieses Formular bringen (in Ihrem Fall finden Sie hier den Namen Ihres Projekts):
dist: xenial language: python python: 3.7.2 install: — pip install -r requirements_dev.txt — pip install -e . script: — pytest --cov=my_package_name after_success: — coveralls
Wenn Travis das Projekt erstellt, installiert er die erforderlichen Pakete, führt die Tests aus und erstellt einen Bericht über die Abdeckung des Codes mit Tests. Dieser Bericht wird dann an den Overalls-Dienst gesendet.
Übernehmen Sie, senden Sie den Code an GitHub und beobachten Sie, was passiert. Es kann einige Minuten dauern, bis der Testbericht zur Codeabdeckung in Overalls eingeht.
Projektabwicklung, TestberichtUnter den PR-Überprüfungen gibt es jetzt auch eine Überprüfung durch Coveralls.
Auf der Seite Overalls können Sie überprüfen, ob das Projekt zu 100% von Tests abgedeckt wird.
Informationen zur TestabdeckungLassen Sie uns nun unser Projekt mit einem weiteren nützlichen Werkzeug ausstatten.
Schritt 10. Arbeiten mit PyUp
Mit dem PyUp.io-Dienst kann der Entwickler herausfinden, ob die von ihm verwendeten Abhängigkeiten veraltet sind und ob sie Schwachstellen aufweisen. Dieser Dienst führt automatisch Pull-Anforderungen aus, die darauf abzielen, das Paket auf GitHub zu aktualisieren. Um die Funktionen dieses Projekts nutzen zu können, müssen Sie sich mit einem GitHub-Konto auf der Website
https://pyup.io/ registrieren. Beim Hinzufügen eines Repositorys wird empfohlen, die
Update Schedules
auf
every week
. Wenn Ihr Projekt bei diesem Ansatz viele Abhängigkeiten aufweist, werden Sie nicht auf zu viele Pull-Anforderungen stoßen.
Updates konfigurierenSo sehen Paketinformationen auf der PyUp.io-Website aus, von denen einige veraltet sind.
PaketdetailsWenn Sie diesen Dienst verwenden, wissen Sie immer, wann die neuesten Versionen der von Ihnen verwendeten Pakete herauskommen. Wissen ist, wie sie sagen, der halbe Sieg. Und die zweite Hälfte sind natürlich automatische Pull-Anfragen zum Aktualisieren von Abhängigkeiten.
Zusammenfassung
In diesem Artikel haben Sie gelernt, wie Sie Tools wie Black, Pytest, Travis CI, Overalls und PyUp bei der Entwicklung von Python-Projekten verwenden. Sie helfen dabei, Projektabhängigkeiten zu steuern, Code zu formatieren und zu testen sowie Projekte zu überprüfen und zu erstellen. Wir hoffen, dass Sie diese Tools nützlich finden.
Liebe Leser! Welche Tools verwenden Sie bei der Entwicklung von Python-Projekten?
