Direkt zum Inhalt

Unit Testing in Python Tutorial

Lerne, was Unit-Tests sind, warum sie wichtig sind und wie du sie mit Hilfe von Python implementieren kannst.
Aktualisierte 16. März 2025  · 10 Min. Lesezeit

Unit Testing ist eine Softwaretestmethode, bei der einzelne Einheiten des Quellcodes verschiedenen Tests unterzogen werden, um festzustellen, ob sie brauchbar sind. Sie bestimmt und prüft die Qualität deines Codes.

Wenn der Entwicklungsprozess abgeschlossen ist, kodiert der Entwickler in der Regel Kriterien oder Ergebnisse, von denen bekannt ist, dass sie potenziell praktisch und nützlich sind, in das Testskript, um die Korrektheit einer bestimmten Einheit zu überprüfen. Während der Ausführung von Testfällen protokollieren verschiedene Frameworks Tests, die ein Kriterium nicht erfüllen, und melden sie in einer Zusammenfassung.

Von den Entwicklern wird erwartet, dass sie automatisierte Testskripte schreiben, die sicherstellen, dass jeder einzelne Abschnitt oder jede Einheit ihrem Design entspricht und sich wie erwartet verhält.

Python Unit Testing

Obwohl das Schreiben von manuellen Tests für deinen Code definitiv eine mühsame und zeitaufwändige Aufgabe ist, hat das in Python eingebaute Unit-Testing-Framework das Leben um einiges einfacher gemacht.

Das Unit-Test-Framework in Python heißt unittest und wird mit Python mitgeliefert.

Unit-Tests machen deinen Code zukunftssicher, da du die Fälle vorhersiehst, in denen dein Code möglicherweise versagen oder einen Fehler produzieren könnte. Du kannst zwar nicht alle Fälle vorhersagen, aber die meisten davon kannst du trotzdem angehen.

Eine Einheit kann in verschiedene Kategorien eingeteilt werden:

  • Ein ganzes Modul,
  • Eine individuelle Funktion,
  • Eine vollständige Schnittstelle wie eine Klasse oder eine Methode.

Am besten schreibst du Unit-Tests für deinen Code, indem du mit der kleinsten testbaren Einheit beginnst, die dein Code haben könnte, und dann zu anderen Einheiten übergehst, um zu sehen, wie diese kleinste Einheit mit anderen Einheiten interagiert.

Pythons Unit-Testing-Framework wurde von Javas JUnit inspiriert und hat ähnliche Funktionen wie die wichtigsten Unit-Testing-Frameworks in anderen Sprachen. Das Python-Framework für Unit-Tests bietet verschiedene Funktionendarunter:

  • Testautomatisierung
  • Gemeinsame Nutzung von Einrichtungs- und Abschaltcode für Tests
  • Tests in Sammlungen zusammenfassen
  • Unabhängigkeit der Tests vom Berichtsrahmen

Nehmen wir nun ein Beispiel, um zu verstehen, warum du Unit-Tests für deinen Code brauchst.

Erste Schritte mit Python unittest

Im Folgenden haben wir die Schritte zusammengefasst, die du brauchst, um das Python-Framework unittest zu nutzen

Erstellen einer Würfelfunktion

Lass uns einen Code schreiben, um das Volumen eines Würfels in Python zu berechnen

def cuboid_volume(l):
    return (l*l*l)
length = [2,1.1, -2.5, 2j, 'two']
for i in range(len(length)):
    print ("The volume of cuboid:",cuboid_volume(length[i]))
The volume of cuboid: 8
The volume of cuboid: 1.3310000000000004
The volume of cuboid: -15.625
The volume of cuboid: (-0-8j)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-7-67e1c37a435f> in <module>
      1 for i in range(len(length)):
----> 2     print ("The volume of cuboid:",cuboid_volume(length[i]))
<ipython-input-2-f50464fd88da> in cuboid_volume(l)
      1 def cuboid_volume(l):
----> 2     return (l*l*l)
TypeError: can't multiply sequence by non-int of type 'str'

Ergebnisanalyse

Die obige Ausgabe sollte dir ein Gefühl dafür geben, wie wichtig es ist, einen Unit-Test für deinen Code zu haben. Nun gibt es drei Dinge, die in dem obigen Code sicherlich falsch sind:

  • Erstens: Das Volumen des Quaders ist negativ,
  • Zweitens: Das Volumen des Quaders ist eine komplexe Zahl,
  • Schließlich führt der Code zu TypeError, da du eine Zeichenkette nicht multiplizieren kannst, da sie keine Inte ist.

Die dritte Aufgabe führte glücklicherweise zu einem Fehler, während die erste und zweite Aufgabe noch erfolgreich waren, obwohl das Volumen des Quaders nicht negativ und eine komplexe Zahl sein kann.

Unit-Tests werden in der Regel als separater Code in einer anderen Datei geschrieben, und es kann verschiedene Namenskonventionen geben, denen du folgen kannst. Du kannst den Namen der Unit-Test-Datei entweder als name of the code/unit + test, getrennt durch einen Unterstrich, oder als test + name of the code/unit, getrennt durch einen Unterstrich, schreiben.

Nehmen wir zum Beispiel an, der Name der obigen Codedatei lautet cuboid_volume.py, dann könnte der Name deines Unit-Test-Codes lauten cuboid_volume_test.py

Schreiben wir nun kurzerhand den Unit-Test für den obigen Code.

assertAlmostEqual verwenden

Zuerst erstellen wir eine Python-Datei mit dem Namen volume_cuboid.py, die den Code für die Berechnung des Volumens enthält, und eine zweite mit dem Namen test_volume_cuboid.py, die den Unit-Testing-Code enthält.

import unittest

Die Klasse TestCuboid erbt das Modul unittest, und in dieser Klasse würdest du verschiedene Methoden definieren, die dein Einheitstest mit deiner Funktion cuboid_volume überprüfen soll.

Die erste Funktion, die du definieren wirst, ist test_volume. Sie prüft, ob die Ausgabe deiner cuboid_volume mit dem übereinstimmt, was du erwartest. Um dies zu erreichen, nutzt du die Methode assertAlmostEqual.

Test 1

class TestCuboid(unittest.TestCase):
    def test_volume(self):
        self.assertAlmostEqual(cuboid_volume(2),8)
        self.assertAlmostEqual(cuboid_volume(1),1)
        self.assertAlmostEqual(cuboid_volume(0),0)
        self.assertAlmostEqual(cuboid_volume(5.5),166.375)

Code 1

code 2

Lass uns das obige Skript ausführen. Du führst das Modul unittest als Skript aus, indem du -m angibst , während du es ausführst.

!python -m unittest test_volume_cuboid.py

Ausgabe:

.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK

Toll! Du hast also deinen ersten Unit-Test-Code zum Laufen gebracht.

Der Test verlief erfolgreich und lieferte OK, was bedeutet, dass die Funktion cuboid_volume so funktioniert, wie du es erwartest.

Test 2

Mal sehen, was passiert, wenn eine der assertAlmostEqual Methoden fehlschlägt.

code 3

Beachte, dass die letzte Assert-Anweisung geändert wurde.

!python -m unittest test_volume_cuboid.py

Ausgabe:

F
======================================================================
FAIL: test_volume (test_volume_cuboid.TestCuboid)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Users\hda3kor\Documents\Unit_Testing_Python\test_volume_cuboid.py", line 15, in test_volume
    self.assertAlmostEqual(cuboid_volume(5.5),0)
AssertionError: 166.375 != 0 within 7 places (166.375 difference)
----------------------------------------------------------------------
Ran 1 test in 0.001s
FAILED (failures=1)

Aus der obigen Ausgabe kannst du ersehen, dass die letzte Assert-Anweisung zu einem AssertionError geführt hat, also ein Fehlschlag des Einheitstests. Pythons Unit-Test-Modul zeigt dir den Grund für den Fehler und die Anzahl der Fehler in deinem Code an.

assertRaises verwenden

Jetzt wollen wir uns eine andere Assert-Methode ansehen, nämlich assertRaises, mit der du herausfinden kannst, ob deine Funktion cuboid_volume die Eingabewerte richtig verarbeitet.

Angenommen, du möchtest testen, ob deine Funktion cuboid_volume die Klasse oder den Typ der Eingabe behandelt. Wenn du zum Beispiel eine Zeichenkette als Eingabe übergibst, wird sie diese Eingabe entweder als Ausnahme oder mit einer Wenn-Bedingung behandeln, da die Länge des Quaders niemals eine Zeichenkette sein kann.

code 4

!python -m unittest test_volume_cuboid.py

Ausgabe:

F.
======================================================================
FAIL: test_input_value (test_volume_cuboid.TestCuboid)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Users\hda3kor\Documents\Unit_Testing_Python\test_volume_cuboid.py", line 17, in test_input_value
    self.assertRaises(TypeError, cuboid_volume, True)
AssertionError: TypeError not raised by cuboid_volume
----------------------------------------------------------------------
Ran 2 tests in 0.001s
FAILED (failures=1)

Toll! Aus der obigen Ausgabe geht also hervor, dass dein Code volume_cuboid.py die übergebenen Eingaben nicht richtig verarbeitet.

Ändern der Würfelfunktion

Fügen wir eine Bedingung in die volume_cuboid.py ein, um zu prüfen, ob die Eingabe oder die Länge des Quaders ein Boolean oder ein String ist und einen Fehler auszulösen.

code 5

!python -m unittest test_volume_cuboid.py

Ausgabe:

..
----------------------------------------------------------------------
Ran 2 tests in 0.001s
OK

Ausführen des Python-Prüfskripts im Jupyter-Labor

Lass uns nun das Testskript im Jupyter-Labor ausführen. Um dies zu erreichen, musst du zunächst das Testskript im Jupyter-Labor definieren, wie unten gezeigt.

# -*- coding: utf-8 -*-
"""
Created on Sat Apr 25 20:16:58 2020
@author: Aditya
"""
from volume_cuboid import *
import unittest
class TestCuboid(unittest.TestCase):
    def test_volume(self):
        self.assertAlmostEqual(cuboid_volume(2),8)
        self.assertAlmostEqual(cuboid_volume(1),1)
        self.assertAlmostEqual(cuboid_volume(0),1)
    def test_input_value(self):
        self.assertRaises(TypeError, cuboid_volume, True)

Dann verwendest du die Methode unittest.main(), um das Testskript auszuführen. Du kannst der folgenden Methode mehrere Argumente übergeben, von denen eines verbosity level ist.

Lass uns mit verschiedenen Ausführlichkeitsgraden experimentieren und sehen, wie sich die Beschreibung der Ausgabe verändert.

Ausführlichkeit 0

unittest.main(argv=[''],verbosity=0, exit=False)
Output:
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
<unittest.main.TestProgram at 0x1de02774348>

Mündlichkeit 1

unittest.main(argv=[''],verbosity=1, exit=False)
Output:
..
----------------------------------------------------------------------
Ran 2 tests in 0.002s
OK
<unittest.main.TestProgram at 0x1de027a1cc8>

Wortgewandtheit 2

unittest.main(argv=[''],verbosity=2, exit=False)
Output:
test_input_value (__main__.TestCuboid) ... ok
test_volume (__main__.TestCuboid) ... ok
----------------------------------------------------------------------
Ran 2 tests in 0.002s
OK
<unittest.main.TestProgram at 0x1de027a8308>

Visualisierung des AssertionError

Ändern wir zum Schluss die letzte assertAlmostEqual in der Methode test_volume und analysieren wir, wie die Ausführlichkeitsstufe 2 das Scheitern der Methode anzeigt.

# -*- coding: utf-8 -*-
"""
Created on Sat Apr 25 20:16:58 2020
@author: Aditya
"""
from volume_cuboid import *
import unittest
class TestCuboid(unittest.TestCase):
    def test_volume(self):
        self.assertAlmostEqual(cuboid_volume(2),8)
        self.assertAlmostEqual(cuboid_volume(1),1)
        self.assertAlmostEqual(cuboid_volume(0),1)
    def test_input_value(self):
        self.assertRaises(TypeError, cuboid_volume, True)
unittest.main(argv=[''],verbosity=2, exit=False)

Ausgabe:

test_input_value (__main__.TestCuboid) ... ok
test_volume (__main__.TestCuboid) ... FAIL
======================================================================
FAIL: test_volume (__main__.TestCuboid)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "<ipython-input-28-46ad33b909ee>", line 14, in test_volume
    self.assertAlmostEqual(cuboid_volume(0),1)
AssertionError: 0 != 1 within 7 places (1 difference)
----------------------------------------------------------------------
Ran 2 tests in 0.003s
FAILED (failures=1)
<unittest.main.TestProgram at 0x1de027b5448>

Zusammenfassung

Aus den oben genannten Ergebnissen lassen sich die folgenden Schlussfolgerungen ziehen:

  • Die Ausführlichkeitsstufe 0 zeigt nur an, wie viele Tests durchgeführt wurden, z. B. 2 Tests und die Zeit, die für die Durchführung benötigt wurde,
  • Verbositätsstufe 1 zwei Punkte hinzufügen .. was bedeutet, dass zwei Tests durchgeführt wurden,
  • Verbosity Level 2 zeigt die detaillierten Methodennamen, die zusammen mit ihrem Status ausgeführt wurden OK oder FAIL.

Verfügbare unittest Assert-Methoden

Es gibt eine Menge Assert-Methoden im Unit-Test-Modul von Python, die du für deine Tests nutzen kannst.

Häufig verwendete Durchsetzungsmethoden

Häufig verwendete Durchsetzungsmethoden

Quelle: Unittest-Dokumentation

 Produktionskontrollen

Mit den folgenden Methoden kannst du die Produktion von Ausnahmen, Warnungen und Protokollmeldungen überprüfen.

Produktionskontrollen

Quelle: Unittest-Dokumentation

 Aufgabenspezifische Methoden

Aufgabenspezifische Methoden

Quelle: Unittest-Dokumentation

 

Detaillierte Informationen über die Methoden von assert findest du in der Python offiziellen Dokumentation.

Du kannst sie auch mit Hilfe des Moduls Pydoc kennenlernen, das einer help Funktion in Python ähnelt. Im Folgenden wird gezeigt, wie du das Modul Pydoc verwenden kannst, um die Dokumentation der Methode assertCountEqual zu lesen.

!python -m pydoc unittest.TestCase.assertCountEqual

Ausgabe:

Help on function assertCountEqual in unittest.TestCase:
unittest.TestCase.assertCountEqual = assertCountEqual(self, first, second, msg=None)
    An unordered sequence comparison asserting that the same elements,
    regardless of order.  If the same element occurs more than once,
    it verifies that the elements occur the same number of times.
        self.assertEqual(Counter(list(first)),
                         Counter(list(second)))
     Example:
        - [0, 1, 1] and [1, 0, 1] compare equal.
        - [0, 0, 1] and [0, 1] compare unequal.

Fazit

Dieses Tutorial war eine grundlegende Einführung in das Unit Testing in Python und seine Bedeutung als Entwickler. Eine gute Übung für dich wäre es, ein Unit-Test-Modul für eines deiner früheren Projekte zu schreiben. So bekommst du eine gute praktische Erfahrung mit dem Schreiben von Unit-Tests. Versuche auch, die anderen Assert-Methoden zu erkunden. Mehr über Unit-Tests kannst du in unserem Pytest-Anleitung.

Wenn du gerade erst mit Python anfängst und mehr erfahren möchtest, besuche unsere Einführung in die Datenwissenschaft in Python Kurs.

Werde ein Python-Entwickler

Erwerbe die Programmierkenntnisse, die alle Python-Entwickler/innen brauchen.
Kostenloses Lernen beginnen

Abid Ali Awan's photo
Author
Abid Ali Awan
LinkedIn
Twitter

Als zertifizierter Data Scientist ist es meine Leidenschaft, modernste Technologien zu nutzen, um innovative Machine Learning-Anwendungen zu entwickeln. Mit meinem fundierten Hintergrund in den Bereichen Spracherkennung, Datenanalyse und Reporting, MLOps, KI und NLP habe ich meine Fähigkeiten bei der Entwicklung intelligenter Systeme verfeinert, die wirklich etwas bewirken können. Neben meinem technischen Fachwissen bin ich auch ein geschickter Kommunikator mit dem Talent, komplexe Konzepte in eine klare und prägnante Sprache zu fassen. Das hat dazu geführt, dass ich ein gefragter Blogger zum Thema Datenwissenschaft geworden bin und meine Erkenntnisse und Erfahrungen mit einer wachsenden Gemeinschaft von Datenexperten teile. Zurzeit konzentriere ich mich auf die Erstellung und Bearbeitung von Inhalten und arbeite mit großen Sprachmodellen, um aussagekräftige und ansprechende Inhalte zu entwickeln, die sowohl Unternehmen als auch Privatpersonen helfen, das Beste aus ihren Daten zu machen.

Themen

Lerne mehr über Python mit diesen Kursen!

Kurs

Introduction to Python

4 hr
6.3M
Master the basics of data analysis with Python in just four hours. This online course will introduce the Python interface and explore popular packages.
Siehe DetailsRight Arrow
Kurs starten
Mehr anzeigenRight Arrow
Verwandt

Der Blog

Lehrer/innen und Schüler/innen erhalten das Premium DataCamp kostenlos für ihre gesamte akademische Laufbahn

Keine Hacks, keine Tricks. Schüler/innen und Lehrer/innen, lest weiter, um zu erfahren, wie ihr die Datenerziehung, die euch zusteht, kostenlos bekommen könnt.
Nathaniel Taylor-Leach's photo

Nathaniel Taylor-Leach

4 Min.

Der Blog

Die 20 besten Snowflake-Interview-Fragen für alle Niveaus

Bist du gerade auf der Suche nach einem Job, der Snowflake nutzt? Bereite dich mit diesen 20 besten Snowflake-Interview-Fragen vor, damit du den Job bekommst!
Nisha Arya Ahmed's photo

Nisha Arya Ahmed

15 Min.

Der Blog

Q2 2023 DataCamp Donates Digest

DataCamp Donates hat im zweiten Quartal 2023 über 20.000 Stipendien an unsere gemeinnützigen Partner vergeben. Erfahre, wie fleißige benachteiligte Lernende diese Chancen in lebensverändernde berufliche Erfolge verwandelt haben.
Nathaniel Taylor-Leach's photo

Nathaniel Taylor-Leach

Der Blog

2022-2023 DataCamp Classrooms Jahresbericht

Zu Beginn des neuen Schuljahres ist DataCamp Classrooms motivierter denn je, das Lernen mit Daten zu demokratisieren. In den letzten 12 Monaten sind über 7.650 neue Klassenzimmer hinzugekommen.
Nathaniel Taylor-Leach's photo

Nathaniel Taylor-Leach

8 Min.

Der Blog

Top 30 Generative KI Interview Fragen und Antworten für 2024

Dieser Blog bietet eine umfassende Sammlung von Fragen und Antworten zu generativen KI-Interviews, die von grundlegenden Konzepten bis hin zu fortgeschrittenen Themen reichen.
Hesam Sheikh Hassani's photo

Hesam Sheikh Hassani

15 Min.

Mehr anzeigenMehr anzeigen