10 Schritte zu einem erfolgreichen Python-Projekt

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 ein

Ich 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-Aktivierung

Klicken 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 Setup

Jetzt 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 Arbeit

Dies ist, was Travis bei der Abwicklung des Projekts tut.


Aktionen, die Travis während der Projektabwicklung ausführt

Wenn 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 abgeschlossen

Wenn 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 Report

Wie 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.


Overalls

Um 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, Testbericht

Unter 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 Testabdeckung

Lassen 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 konfigurieren

So sehen Paketinformationen auf der PyUp.io-Website aus, von denen einige veraltet sind.


Paketdetails

Wenn 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?

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


All Articles