Testgetriebene Entwicklung in Python mit Pytest

May 29, 2025
14 min read
Loading the Elevenlabs Text to Speech AudioNative Player...

Einführung

Das Testen von Code ist ein sehr wichtiger Schritt während der Softwareentwicklung. Wenn ein Programmierer ein Projekt einreicht, muss er sicher sein, dass die von ihm erstellte Software ordnungsgemäß funktioniert. Testgetriebene Entwicklung in Python mit Pytest ist ein leistungsstarker Ansatz, der hilft, die Codequalität sicherzustellen und Fehler zu vermeiden. Bei der Verwendung der Software können viele Fehler auftreten, z. B. ein falscher Eingabedatentyp, eine falsche Eingabedatei, eine falsche API oder eine falsche Benutzeroperation. Tests helfen dabei, mögliche Codenutzungsszenarien vorherzusagen und das Auftreten von Fehlern zu verhindern

Was ist TDD (Test-Driven Development)?

TDD (Test-Driven Development) ist eine Softwareentwicklungstechnik, die Softwareanforderungen anhand von Tests darstellt. Beim Schreiben von Tests schreibt der Programmierer die Anforderungen auf, die die endgültige Software erfüllen sollte. Der Test kann nur bestanden werden, wenn der endgültige Code alle Bedingungen erfüllt. Aus diesem Grund wird der Code während der Softwareentwicklung wiederholt getestet und alle Anforderungen werden gesammelt, anhand derer festgestellt wird, dass die endgültige Software korrekt geschrieben wurde und keine Fehler enthält. Der TDD-Ansatz kann in drei Schritten vorgestellt werden:

  1. Schreiben Sie Tests, die alle zukünftigen Softwareanforderungen enthalten. Alle Tests sollten fehlschlagen.
  2. Entwickeln Sie minimale Software und überprüfen Sie deren Richtigkeit, indem Sie Tests durchführen. Dieser Schritt sollte enden, wenn alle Tests bestanden sind.
  3. Refaktorieren und verbessern Sie Ihren Code. Führen Sie die Tests erneut durch und denken Sie daran, dass sie bestanden werden sollten.

Was ist das Pytest-Framework?

Pytest ist eines der beliebtesten Frameworks zum Testen Python-Code. Es gibt viele Vorteile, die Menschen dazu bringen, Pytest zu nutzen. Eine davon ist auf jeden Fall die einfache Bedienung, neben zusätzlichen Plugins und einer sehr gut geschriebenen Dokumentation. Pytest unterstützt Komponententests und ermöglicht es Ihnen, einfache skalierbare Testsätze zu schreiben. Darüber hinaus ermöglicht Pytest Programmierern die Verwendung von Fixtures und die Parametrisierung und bietet die Möglichkeit, ausgewählte Tests während der Ausführung zu überspringen. Darüber hinaus ist es Open Source und im Internet gibt es viele Artikel und Tutorials zum Testen von Python-Code mit Pytest. Aufgrund dieser Vorteile entscheiden sich viele Entwickler dafür, Tests mit diesem Framework zu schreiben.

Einfacher Pytest-Testfall, testgetriebene Entwicklung in Python

Zunächst müssen wir uns überlegen, wie die Struktur unseres Projekts aussehen soll. Es gibt mehrere Ansätze, aber meiner Meinung nach ist es am besten, die Tests von dem Code zu trennen, der getestet werden soll. Ich schlage vor, dass unser Projekt die folgende Struktur haben sollte.
√── Quellen
│ √── code.py
│ ─ ── __init__.py
•── Tests
√── test_code.py
─ ── __init__.py
 

  • Im Quellpaket behalten wir die Projektlogik bei.
  • Im Testpaket werden wir Tests aufbewahren, die die Richtigkeit der Projektlogik überprüfen.

Denk dran! Wenn Sie möchten, dass Pytest Ihre Testdatei findet, ohne sie während der Ausführung aufzulisten, müssen Sie dem Dateinamen das Präfix oder Suffix „test“ hinzufügen. Schreiben wir eine einfache Funktion, die die Anzahl der A-Buchstaben (Groß- und Kleinbuchstaben) in einem bestimmten Wort zurückgibt. Wie Sie sehen können, ist die Funktion vor der Angabe eines 'Word'-Arguments geschützt (in eine Zeichenfolge umgewandelt), das einen anderen Datentyp als die Zeichenfolge ist.# project/sources/code.py

def count_a (Wort = Nichts):
return str (word) .lower () .count ('a') Als Nächstes schreiben wir einen Test, der bestätigt, dass die Funktion das richtige Ergebnis zurückgibt. Sie müssen wissen, dass die Testmethode eine 'test'-Teilzeichenfolge am Anfang oder am Ende des Namens haben sollte. Erst dann findet Pytest die Testmethode und führt sie aus. Zuerst müssen wir die Funktion count_a importieren. Um die Richtigkeit der Funktion zu überprüfen, verwenden wir eine Assert-Anweisung, die prüft, ob das Ergebnis der Funktion dem erwarteten Ergebnis entspricht. Wir möchten alle möglichen Fälle abdecken, in denen Fehler auftreten könnten. Schauen wir uns das folgende Beispiel an: # project/tests/test_code.py

aus sources.code import count_a

def test_count_a ():
bestätigen Sie count_a ('aA') == 3
bestätigen Sie count_a (2) == 0
bestätigen Sie count_a (3.14) == 0
assert count_a ('Wassermelone') == 1
assert count_a () == 0 Um Pytest auszuführen, musst du einfach 'pytest' in deine Konsole schreiben. Wir verwenden das Verbose-Flag, um eine detailliertere Ausgabe zu sehen: $ pytest -vRunning the test liefert das folgende Ergebnis:

Logos of Azure Data Factory and Apache Airflow, representing a comparison between the two data orchestration tools

Wie Sie sehen können, dass unser Test bestanden wurde, funktioniert die Funktion count_a ordnungsgemäß, Testgetriebene Entwicklung in Python.

Was ist, wenn wir den Schutz vor der Angabe von Argumenten in einem anderen Typ als einer Zeichenfolge löschen? Lassen Sie uns Cast aus der Funktion entfernen und den Test erneut ausführen.# project/sources/code.py
def count_a (Wort=Keine):
gib word.lower () .count ('a') zurück
$ pytest -v

Bar chart displaying the count of unique values in a categorical column, providing insights into the dataset.

Der Test ist aufgrund eines AttributeErrors fehlgeschlagen. Pytest hat markiert, welche Assert-Anweisung falsch zurückgegeben hat und wo in der getesteten Funktion eine Ausnahme auftrat.

TDD in Python mit Pytest

Ab jetzt weißt du, wie man mit Pytest einen einfachen Test schreibt. Es ist höchste Zeit, Ihnen vorzustellen, wie Sie das Pytest-Paket in der TDD-Technik verwenden. Stellen wir uns vor, wir möchten die UserDatabase-Klasse implementieren. Nur Informationen wie Name, Nachname, Alter und ID-Nummer konnten der Datenbank hinzugefügt werden. Alter kann kein negativer Wert sein und muss unter 120 liegen. Vor- und Nachname müssen natürlich eine Zeichenfolge sein und die ID-Nummer muss eindeutig sein. Der Benutzer kann nach Angabe der ID-Nummer aus der Datenbank entfernt werden. Darüber hinaus sollte die Klasse die Anzeige des Namens des ältesten Benutzers ermöglichen, der der Datenbank hinzugefügt wurde.

Schreiben Sie einen Test

Nach der TDD-Methode schreiben wir zunächst einen Test, der alle Anwendungsfälle und User Stories überprüft. Im folgenden Beispiel haben wir die Methode raise aus der Pytest-Bibliothek verwendet, um zu überprüfen, ob die erwartete Ausnahme auftreten wird. # project/tests/test_code.py
pytest importieren
aus sources.code importiere UsersDatabase

def test_user_database ():
# Benutzerdatenbankobjekt erstellen
Datenbank = UsersDatabase ()

# Neue Benutzer hinzufügen
database.add_user ('John', 'Smith', 29, 'e31sf')
database.add_user ('Emily', 'Taylor', 12, 'd24da')
database.add_user ('Lilie', 'Thomas', 66, 'd33fw')
Assert database.get_number_of_users () == 3

# Füge zwei Benutzer mit derselben ID hinzu
mit pytest.raise (ValueError):
database.add_user ('John', 'Smith', 29, 'e31sf')

# Benutzer entfernen
database.delete_user_by_id ('d24da')
assert database.get_number_of_users () == 2

# Was ist, wenn Alter eine Zeichenfolge ist
mit pytest.raise (TypeError):
database.add_user ('John', 'Thomas', 'Seite', 'dc33s')

# Was ist, wenn das Alter 200 entspricht
mit pytest.raise (ValueError):
database.add_user ('Ava', 'Braun', 200, 'dsd2f')

# Was ist, wenn das Alter ein negativer Wert ist
mit pytest.raise (ValueError):
database.add_user ('Ava', 'Braun', -10, 'dsdw3')

# Was ist, wenn der Name eine Ganzzahl ist
mit pytest.raise (TypeError):
database.add_user (2323, 'Smith', 23, 'd3ff2')

# Was ist, wenn der Nachname ein Float ist
mit pytest.raise (TypeError):
database.add_user ('John', 3.14, 19, 'd31xe')

# Was ist, wenn der neue Benutzer keine ID hat
mit pytest.raise (TypeError):
database.add_user (Name='John', Nachname='Wilson', Alter=19)

Schreiben Sie einen Code

Jetzt ist es an der Zeit, den Code zu schreiben und sich an den Test zu erinnern, der bestanden werden sollte, wenn wir fertig sind! Der endgültige Code könnte wie folgt aussehen: # project/sources/code.py

Klasse UsersDatabase:
def __init__ (selbst):
self.database = []

def add_user (selbst, Name, Nachname, Alter, ID_Nummer):
wenn nicht isinstance (age, int):
TypeError auslösen

wenn nicht isinstance (name, str):
TypeError auslösen

wenn nicht isinstance (Nachname, str):
TypeError auslösen

wenn das Alter nicht im Bereich (1, 120) liegt:
ValueError erhöhen

falls vorhanden (user.id_number == id_number für den Benutzer in self.database):
ValueError erhöhen

self.database.append (Benutzer (Name, Nachname, Alter, ID_Nummer))

def delete_user_by_id (self, id_number):
für Benutzer in self.database:
wenn user.id_number == id_number:
self.database.remove (Benutzer)

def get_oldest_user_name (self):
oldest_user = sortiert (self.database, key=lambda x: x.age, reverse=True) [0]
gib oldest_user.name zurück

def get_number_of_users (self):
return len (self.database)

Klasse Benutzer:
def __init__ (selbst, Name, Nachname, Alter, ID_Nummer):
self.name = Name
self.surname = Familienname
self.age = Alter
self.id_number = ID-Nummer

Führen Sie einen Test durch

Lass uns einen Pytest ausführen und das Testergebnis überprüfen.$ pytest -v

Pareto analysis chart illustrating the 80-20 rule, highlighting the most significant values in a dataset.

Der Test ist bestanden. Unser Code ist fertig.

Fazit

Codetests könnten helfen, viele Fehler zu vermeiden, die manchmal auf den ersten Blick nicht sichtbar sind, Test Driven Development. Das Schreiben von Tests erfordert ein wenig Arbeit und kann zeitaufwändig sein, aber es vermeidet Situationen, in denen wir den Code immer wieder verbessern müssen, wenn Benutzer mehr Fehler finden. TDD ist eine Technik, bei der zuerst Tests geschrieben werden, um alle möglichen Fehler und falsche Codeverwendung abzudecken. Dann wird der Code auf der Grundlage der Tests geschrieben und erst wenn alle Tests bestanden sind, kann der Code als abgeschlossen betrachtet werden. Diese Technik hilft Softwareentwicklern, sich stärker auf die Projektanforderungen und mögliche Fälle zu konzentrieren, in denen etwas falsch sein könnte. Pytest ist das beliebteste Framework zum Testen von Python-Code. Es hat viele Vorteile und das ist der Grund, warum Leute Pytest sehr oft benutzen. Die Verwendung der TDD-Technik mit dem Pytest-Framework bietet die Möglichkeit, die Qualität des Python-Codes und die Benutzerzufriedenheit zu verbessern.Kontaktiere uns wenn Sie Hilfe bei der Umsetzung auf Ihrer Seite benötigen.

Python code verbessern uberblick uber linters

Unterschiede zwischen airflow-1-10-x-und-2-0

Was ist visuelle suche und wie funktioniert sie

Share this post
Datenwissenschaft
MORE POSTS BY THIS AUTHOR

Curious how we can support your business?

TALK TO US