Python-Test mit Pytest. Einfach, schnell, effizient und skalierbar. Vorwort und Einführung

Weiter


Systematische Softwaretests, insbesondere in der Python-Community, werden häufig entweder vollständig ignoriert oder auf besondere Weise durchgeführt. Viele Python-Programmierer sind sich der Existenz von Pytest überhaupt nicht bewusst. Brian Ocken macht sich die Mühe zu beweisen, dass das Testen von Software mit pytest einfach, natürlich und sogar interessant ist.

Dmitri Sinowjew
Autor von Data Science Essentials in Python



Die Beispiele in diesem Buch wurden mit Python 3.6 und pytest 3.2 geschrieben. pytest 3.2 unterstützt Python 2.6, 2.7 und Python 3.3+.


Der Quellcode für das Aufgabenprojekt sowie für alle in diesem Buch gezeigten Tests ist unter dem Link auf der Webseite des Buches unter pragprog.com verfügbar . Sie müssen den Quellcode nicht herunterladen, um den Testcode zu verstehen. Der Testcode wird in den Beispielen in einer praktischen Form dargestellt. Um jedoch die Aufgaben des Projekts zu verfolgen oder Testbeispiele anzupassen, um Ihr eigenes Projekt zu testen (Ihre Hände sind losgebunden!), Müssen Sie auf die Webseite des Buches gehen und die Arbeit herunterladen. Dort, auf der Webseite des Buches, gibt es einen Link für Errata- Nachrichten und ein Diskussionsforum .

Unter dem Spoiler befindet sich eine Liste der Artikel dieser Reihe.



Danksagung


Zuerst muss ich mich bei Michelle bedanken - meiner Frau und besten Freundin. Schade, dass Sie den Raum, in dem ich schreibe, nicht sehen. Anstelle eines Tisches habe ich einen antiken quadratischen Esstisch aus Eichenholz, auf dem genügend Platz für das Auslegen von Papier ist. Ein wunderschönes Glasregal mit meinen Retro-Weltraumspielzeugen, die wir im Laufe der Jahre gesammelt haben, sowie technischen Büchern, Leiterplatten und Jonglierbällen. Antike Aluminiumboxen zur Aufbewahrung von Papier auf der Oberseite, gefüllt mit Notizen, Schnüren und sogar den restlichen Aufklebern für Raketen. Eine Wand ist mit Samt bedeckt, den wir vor vielen Jahren gekauft haben, als der Stoffladen beschlossen hat, endgültig zu schließen. Der Stoff sollte das Echo beruhigen, wenn ich Podcasts aufnehme.


Ich schreibe hier nicht nur, weil es bequem und im Einklang mit meiner inneren Welt ist, sondern auch, weil es der Raum ist, den Michel mit mir und für mich geschaffen hat. Sie und ich waren schon immer ein Team und sie hat meine verrückten Ideen, einen Blog zu schreiben, einen oder zwei Podcasts zu starten und dieses Buch im letzten Jahr oder so zu schreiben, unglaublich unterstützt. Sie sorgte dafür, dass ich Zeit und Raum zum Schreiben hatte. Wenn ich müde werde und darüber nachdenke, ob ich noch die Kraft zum Schreiben habe, bietet sie mir an, nur zwanzig Minuten weiterzumachen und zu beobachten, wie ich mich dann fühlen werde. Sie tat dasselbe, als sie mir später half College-Nächte. Ich hätte es wirklich nicht ohne sie tun können.


Ich habe auch zwei überraschend erstaunliche, neugierige und brillante Töchter, Gabriella und Sofia, die zwei meiner größten Fans sind. Ella bietet allen, die über Programmierung sprechen, an, meine Podcasts anzuhören, und Phia zeigte einen Aufkleber für den Testcode auf ihrem Rucksack, den sie in der zweiten Klasse mitnahm.


Es gibt so viel mehr Menschen zu danken.


Meine Herausgeberin, Katherine Dvorak, hat mir geholfen, eine Reihe von zufälligen Ideen und Themen in einem zusammenhängenden Verlauf zusammenzustellen. Dies ist der Grund, warum dies ein Buch ist, nicht eine Reihe von Blog-Posts, die zusammengehalten werden. Ich bin als Blogger in dieses Projekt gegangen und habe mich zu sehr mit den vielen Überschriften, Unterüberschriften und Listenelementen beschäftigt, und Katie hat mich geduldig angeleitet, damit ich eine bessere Schriftstellerin werden kann.


Vielen Dank an Suzanne Davidson Palatinate, Andy Hunt und den Rest des Pragmatic Bookshelf, die mir eine Chance gegeben haben.


Technische Gutachter haben mich im Pytest, aber auch im Python-Stil ehrlich gehalten und sind der Grund dafür, dass die Codebeispiele PEP 8 folgen. Dank an Oliver Bestwalter, Florian Bruhin, Floris Bruinog, Mark Goody, Peter Hampton, Dave Hunt, Al Crinker und Lokesh Kumaru Makani, Bruno Oliveira, Ronnie Pfannschmidt, Rafael Pierzine, Luciano Ramallo, Frank Ruiz und Dmitry Zinoviev. Viele dieser Listen sind auch Pytest-Kernel-Entwickler und / oder unterstützen unglaubliche Pytest-Plugins.


Besonderer Dank geht an Luciano. Nachdem ich dieses Buch geschrieben hatte, schickte ich die ersten vier Kapitel an mehrere Rezensenten. Luciano war einer von ihnen, und seine Rezension war am schwierigsten zu lesen. Ich glaube nicht, dass ich all seinen Ratschlägen gefolgt bin, aber aufgrund seiner Bemerkungen habe ich die meisten der ersten drei Kapitel überarbeitet und neu geschrieben und im Rest des Buches etwas geändert.


Vielen Dank an das gesamte pytest-dev-Team für die Erstellung eines so coolen Testwerkzeugs. Vielen Dank an Oliver Bestwalter, Florian Bruhin, Floris Bruinoohe, Dave Hunt, Holger Kreckel, Bruno Oliveira, Ronnie Pfannschmidt, Rafael Pierzine und viele andere für die Beantwortung meiner Fragen über das Leben im Laufe der Jahre.


Und zu guter Letzt muss ich mich bei den Leuten bedanken, die sich bei mir bedankt haben. Sie nutzten die Gelegenheit, um mich per E-Mail darüber zu informieren, dass meine Arbeit ihre Zeit sparte und die Arbeit erleichterte. Das ist cool und macht mich glücklich! Vielen Dank!


Brian okken


September 2017


Vorwort


Der Einsatz von Python nimmt nicht nur in der Softwareentwicklung zu, sondern auch in Bereichen wie Datenanalyse, Forschung, Test und Messung sowie in anderen Branchen. Die Entwicklung von Python in vielen kritischen Bereichen geht auch mit dem Wunsch einher, Softwaretests korrekt, effizient und effektiv durchzuführen, um sicherzustellen, dass die Programme korrekt funktionieren und die richtigen Ergebnisse liefern. Darüber hinaus umfassen immer mehr Softwareprojekte die kontinuierliche Integration und umfassen eine automatisierte Testphase, da die Release-Zyklen verkürzt werden und ein sorgfältiges manuelles Testen immer komplexerer Projekte einfach nicht möglich ist. Teams sollten in der Lage sein, den von den Continuous Integration Servern durchgeführten Tests zu vertrauen, die ihnen mitteilen, ob sie ihrer Software genug vertrauen können, um sie freizugeben.


Geben Sie pytest ein.


Was ist Pytest?


Als zuverlässiges Python-Testwerkzeug kann pytest für alle Arten und Ebenen von Softwaretests verwendet werden. pytest kann von Entwicklungsteams, QS-Teams, unabhängigen Testgruppen, Personen, die TDD praktizieren, und Open Source-Projekten verwendet werden. Tatsächlich haben Projekte im Internet von Unittest oder Nose zu Pytest gewechselt , einschließlich Mozilla und Dropbox. Warum? Denn pytest bietet leistungsstarke Funktionen wie das Umschreiben von "assert", Plug-in-Modelle von Drittanbietern und ein leistungsstarkes, aber einfaches Fixture-Modell, das in keinem anderen Testframework zu finden ist.


pytest ist eine Software-Testplattform, was bedeutet, dass pytest ein Befehlszeilenprogramm ist. Ein Tool, das automatisch schriftliche Tests findet, Tests ausführt und Berichte mit dem Ergebnis schreibt. Es verfügt über eine Bibliothek mit Lotionen, die Sie in Tests verwenden können, um effizienter zu testen. Es kann erweitert werden, indem Sie Ihre eigenen Plugins schreiben oder solche von Drittanbietern installieren. Es kann zum Testen von Python-Distributionen verwendet werden. Und es lässt sich nahtlos in andere Tools wie die kontinuierliche Integration und die Webautomatisierung integrieren.


Hier sind einige Gründe, warum sich pytest von vielen anderen integrierten Systemtests abhebt:


  • Einfache Tests sind im Pytest einfach zu schreiben.
  • Komplexe Tests sind noch einfacher zu schreiben.
  • Tests sind leicht zu lesen.
  • Tests sind leicht zu lesen. (Es ist so wichtig, dass dies zweimal angezeigt wird.)
  • Sie können in Sekundenschnelle loslegen.
  • assert verwendet, um den Test nicht zu self.assertEqual() , nicht self.assertEqual() oder self.assertLessThan() . Einfach behaupten !
  • Sie können pytest verwenden, um Tests durchzuführen, die für unittest oder Nase geschrieben wurden.

pytest wird von einer leidenschaftlichen und wachsenden Community aktiv entwickelt und unterstützt. Es ist so erweiterbar und flexibel, dass es problemlos in Ihren Workflow passt. Und da es separat von Ihrer Python-Version installiert wird, können Sie dieselbe neueste Version von pytest für Python 2 (2.6 und höher) und Python 3 (3.3 und höher) verwenden.


Pytest lernen beim Testen einer Beispielanwendung


Möchten Sie Pytest lernen, indem Sie alberne Beispiele testen, die Sie im wirklichen Leben nie sehen werden? Ich auch. Wir werden dies in diesem Buch nicht tun. Stattdessen werden wir Tests für ein Projekt schreiben, das hoffentlich viel mit den Anwendungen gemeinsam hat, die Sie nach dem Lesen dieses Buches testen werden.


Aufgaben Projekt


Die Anwendung, die wir uns ansehen werden, heißt Aufgaben. Tasks ist eine Anwendung zur minimalen Aufgabenverfolgung mit einer Befehlszeilenschnittstelle. Es hat genug mit vielen anderen Arten von Anwendungen gemeinsam. Ich hoffe, Sie können leicht erkennen, wie die Testkonzepte, die Sie bei der Entwicklung von Tests gegen Probleme lernen, jetzt und in Zukunft auf Ihre Projekte anwendbar sind.


Obwohl Tasks über eine Befehlszeilenschnittstelle (Command Line Interface, CLI) verfügt, interagiert die CLI über eine Anwendungsprogrammierschnittstelle (API) mit dem Rest des Codes. Eine API ist die Schnittstelle, an die wir die meisten unserer Tests richten werden. Die API interagiert mit der Datenbankverwaltungsschicht, die mit der Dokumentdatenbank - MongoDB oder TinyDB - interagiert . Der Datenbanktyp wird bei der Initialisierung der Datenbank konfiguriert. Bevor wir uns auf die API konzentrieren, schauen wir uns die Aufgaben selbst an, ein Befehlszeilentool, das eine Benutzeroberfläche für Aufgaben bietet.


Hier ist eine Beispielsitzung:


 $ tasks add 'do something' --owner Brian $ tasks add 'do something else' $ tasks list ID owner done summary -- ----- ---- ------- 1 Brian False do something 2 False do something else $ tasks update 2 --owner Brian $ tasks list ID owner done summary -- ----- ---- ------- 1 Brian False do something 2 Brian False do something else $ tasks update 1 --done True $ tasks list ID owner done summary -- ----- ---- ------- 1 Brian True do something 2 Brian False do something else $ tasks delete 1 $ tasks list ID owner done summary -- ----- ---- ------- 2 Brian False do something else $ 

Hinweis für den Übersetzer: Bei Verwendung der Windows-Plattform sind beim Testen dieser Sitzung mehrere Probleme aufgetreten.
  1. Für die TinyDB-Datenbank tasks_db im Ordner Ihres Benutzers ein Ordner mit dem Namen tasks_db . Zum Beispiel c:\Users\User_1\tasks_db\
  2. Verwenden Sie Anführungszeichen anstelle von Apostrophen. Andernfalls erhalten wir einen solchen Fehler.

    $ Aufgaben hinzufügen 'etwas anderes tun'
    Verwendung: Aufgaben fügen [OPTIONEN] ZUSAMMENFASSUNG hinzu

    Fehler: Unerwartete zusätzliche Argumente (etwas anderes ')

Dies ist nicht die schwierigste Task-Management-Anwendung, aber komplex genug, um Tests zu untersuchen.


Teststrategie


Obwohl pytest für Unit-Tests, Integrationstests, Systemtests oder End-to-End-Tests und Funktionstests geeignet ist, konzentriert sich die Teststrategie des Tasks-Projekts hauptsächlich auf subkutane Funktionstests. Im Folgenden sind einige nützliche Definitionen aufgeführt:


  • Komponententest : Ein Test, bei dem ein kleiner Code wie eine Funktion oder Klasse isoliert vom Rest des Systems getestet wird. Ich überprüfe die Tests in Kapitel 1, Erste Schritte mit pytest, auf Seite 1, um Komponententests durchzuführen. Die Datenstruktur von Aufgaben.
  • Integrationstests : Ein Test, der einen größeren Code testet, kann mehrere Klassen oder Subsysteme umfassen. Meistens ist das für einige Tests verwendete Etikett größer als ein Komponententest, aber kleiner als ein Systemtest.
  • Systemtest (Ende-zu-Ende) : Ein Test, der das gesamte zu testende System in einer Umgebung testet, die der Endbenutzerumgebung so nahe wie möglich kommt.
  • Funktionstest : Ein Test, der einen Teil der Systemfunktionalität testet. Ein Test, der testet, wie gut wir ein Aufgabenelement in Aufgaben hinzufügen, entfernen oder aktualisieren, ist ein Funktionstest.
  • Subkutaner Test : Ein Test, der nicht für die Endbenutzeroberfläche ausgeführt wird, sondern für eine Schnittstelle direkt unter der Oberfläche. Da die meisten Tests in diesem Buch auf API-Ebene und nicht auf CLI-Ebene getestet werden, gelten sie als subkutane Tests.

Wie ist dieses Buch organisiert?


In Kapitel 1, „Erste Schritte mit pytest“ auf Seite 1, installieren Sie pytest und machen sich bereit, es zu verwenden. Anschließend nehmen Sie einen Teil des Aufgabenprojekts - eine Datenstruktur, die eine einzelne Aufgabe darstellt (benanntes Tupel namens Aufgabe), und verwenden sie zum Testen von Beispielen. Sie lernen, wie Sie pytest mit mehreren Testdateien ausführen. Sie werden viele beliebte und äußerst nützliche Befehlszeilenoptionen für pytest sehen, z. B. die Möglichkeit, Testfehler neu zu starten, die Ausführung nach dem ersten Fehler zu stoppen, die Stapelverfolgung und die mehrseitige Version des Testlaufs zu steuern und vieles mehr.


In Kapitel 2, „Erstellen von Testfunktionen“, auf Seite 23, installieren Sie Aufgaben lokal mit pip und erfahren, wie Sie Tests in einem Python-Projekt strukturieren. Sie müssen dies tun, um Tests für eine echte Anwendung zu schreiben. In allen Beispielen in diesem Kapitel werden Tests für die installierte Anwendung ausgeführt, einschließlich des Schreibens in die Datenbank. Die tatsächlichen Testfunktionen stehen im Mittelpunkt dieses Kapitels, und Sie lernen, wie Sie assert in Tests effektiv einsetzen. Sie lernen auch über Marker. Eine Funktion, mit der Sie viele Tests markieren können, die gleichzeitig ausgeführt werden, übersprungene Tests markieren oder pytest mitteilen, dass wir bereits wissen, dass einige Tests fehlschlagen werden. Ich werde darüber sprechen, wie nur einige Tests ausgeführt werden, nicht nur mit Markern, sondern auch indem unser Testcode in Verzeichnisse, Module und Klassen strukturiert wird und wie diese Teilmengen von Tests ausgeführt werden.


Nicht alle Testcodes sind in den Testfunktionen enthalten. In Kapitel 3, „Pytest Fixtures“, auf Seite 49, erfahren Sie, wie Sie Testdaten in Test Fixtures einfügen sowie Code konfigurieren und unterbrechen. Das Festlegen des Status eines Systems (oder eines Subsystems oder einer einzelnen Einheit) ist ein wichtiger Bestandteil des Softwaretests. Sie lernen diesen Aspekt von Pytest-Vorrichtungen kennen, um die Aufgabenprojektdatenbank zu initialisieren und Testdaten für einige Tests vorab auszufüllen. Fixtures sind ein unglaublich leistungsfähiger Bestandteil von pytest, und Sie werden lernen, wie Sie sie effektiv einsetzen können, um die Duplizierung von Testcode weiter zu reduzieren und Ihren Testcode unglaublich lesbar und wartbar zu machen. Pytest-Fixtures sind ebenfalls parametrierbar, ähnlich wie Testfunktionen. Mit dieser Funktion können Sie alle Ihre Tests sowohl mit TinyDB als auch mit MongoDB ausführen, den von Tasks unterstützten Datenbankserverteilen.


In Kapitel 4, „Eingebaute Vorrichtungen“, auf Seite 71, sehen Sie einige der von pytest gelieferten eingebauten Vorrichtungen. Sie erfahren, wie in pytest integrierte Geräte temporäre Verzeichnisse und Dateien für Sie verfolgen, die Ausgabe des Testcodes überprüfen, Affen-Patches verwenden, nach Warnungen suchen und vieles mehr.


In Kapitel 5, „Plugins“, auf Seite 95 erfahren Sie, wie Sie Pytest Befehlszeilenoptionen hinzufügen, die Ausgabe von Pytest ändern und Pytest-Einstellungen, einschließlich Fixtures, durch Schreiben, Verpacken und Verteilen für andere Benutzer freigeben ( eigene Plugins verteilen. Das Plugin, das wir in diesem Kapitel entwickeln, wird verwendet, um die Testfehler zu erstellen, die beim Testen von Aufgaben auftreten. Sie erfahren auch, wie Sie Test-Plugins richtig testen. Was für ein Meta? Und für den Fall, dass Sie von diesem Kapitel nicht genug inspiriert sind, um Ihre eigenen Plugins zu schreiben, habe ich eine Reihe großartiger Plugins ausgewählt, um zu zeigen, was in Anhang 3, „Plugin Sampler Pack“, auf Seite 163 möglich ist.


Apropos Anpassung: In Kapitel 6, „Konfiguration“, auf Seite 113 erfahren Sie, wie Sie den Standard-Pytest-Start für Ihr Projekt mithilfe von Konfigurationsdateien konfigurieren. Mit der Datei " pytest.ini " können Sie beispielsweise Befehlszeilenparameter speichern, damit Sie diese nicht ständig eingeben müssen. Weisen Sie pytest an, nicht in bestimmten Verzeichnissen nach Testdateien zu suchen, und geben Sie die Mindestversion von pytest an, die Sie verwenden Tests und mehr. Diese Konfigurationselemente können in tox.ini oder setup.cfg abgelegt werden .


Im letzten Kapitel, Kapitel 7, unter Verwendung von pytest mit anderen Tools, auf Seite 125, erfahren Sie, wie Sie den bereits leistungsstarken pytest verwenden und Ihre Tests mit zusätzlichen Tools überladen können. Sie werden das Aufgabenprojekt auf mehreren Versionen von Python mit tox ausführen. Sie werden CLI-Aufgaben testen, ohne den Rest des Systems mit mock auszuführen. Mit Coverage.py prüfen Sie, ob der Quellcode des Task-Projekts getestet wird. Sie werden Jenkins verwenden, um Testsuiten auszuführen und Ergebnisse im Laufe der Zeit anzuzeigen. Und schließlich werden Sie sehen, wie pytest verwendet werden kann, um unittest-Tests durchzuführen und um pytest-artige Fixtures mit unittest-basierten Tests auszutauschen.


Was Sie wissen müssen


Python


Sie müssen kein Python-Guru sein. Beispiele machen nichts Übernatürliches oder Bizarres.


pip


Sie müssen pip verwenden, um die pytest-Plugins und pytest selbst zu installieren. Wenn Sie pip aktualisieren möchten, lesen Sie Anhang 2, pip, auf Seite 175.


Befehlszeile


Ich habe dieses Buch geschrieben und Beispiele für die Ausgabe mit Bash auf einem Mac-Laptop aufgenommen. Die einzigen Befehle, die ich in bash verwende, sind cd, um in ein bestimmtes Verzeichnis zu gehen und natürlich pytest. Da cd in Windows cmd.exe und in allen mir bekannten Unix-Shells vorhanden ist, sollten alle Beispiele verfügbar sein, um in jeder Terminalanwendung ausgeführt zu werden, für die Sie sich entscheiden.


Das ist alles. Sie müssen kein Programmierexperte sein, um automatisierte Tests mit pytest zu schreiben.


Codebeispiele und Internetressourcen


Die Beispiele in diesem Buch wurden mit Python 3.6 und pytest 3.2 geschrieben. pytest 3.2 unterstützt Python 2.6, 2.7 und Python 3.3+.


Der Quellcode für das Aufgabenprojekt sowie für alle in diesem Buch gezeigten Tests ist unter dem Link auf der Webseite des Buches unter pragprog.com verfügbar . Sie müssen den Quellcode nicht herunterladen, um den Testcode zu verstehen. Der Testcode wird in den Beispielen in einer praktischen Form dargestellt. Um jedoch die Aufgaben des Projekts zu verfolgen oder Testbeispiele anzupassen, um Ihr eigenes Projekt zu testen (Ihre Hände sind losgebunden!), Müssen Sie auf die Webseite des Buches gehen, um die Arbeit herunterzuladen. Dort, auf der Webseite des Buches, befindet sich ein Link zum Errata- Post und zum Diskussionsforum .


Ich programmiere seit über fünfundzwanzig Jahren und nichts hat mich dazu gebracht, so viel Testcode zu schreiben wie Pytest. Ich hoffe, dass Sie viel aus diesem Buch lernen, und ich hoffe, dass Sie am Ende den Testcode genauso lieben werden wie ich.


Weiter

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


All Articles