Einführung in das Testen mit unittest
Testen ist ein fundamentaler Bestandteil der Softwareentwicklung, der die Zuverlässigkeit und Qualität des Codes sicherstellt. Im Python-Ökosystem ist das Modul unittest die Standardlösung zum Erstellen und Ausführen automatisierter Tests.
UnitTest ist eine integrierte Python-Bibliothek, die auf der xUnit-Architektur basiert. Sie bietet Entwicklern ein vollständiges Werkzeugset zum Erstellen von Modultests, zur Überprüfung der Geschäftslogik und zur Kontrolle von Funktionen und Klassen. Der größte Vorteil von unittest ist, dass es Teil der Python-Standardbibliothek ist und keine zusätzliche Installation erfordert.
Was ist unittest und warum wird es benötigt?
Unittest ist ein Framework zum Schreiben und Ausführen von Tests in Python, das den Prinzipien der testgetriebenen Entwicklung (TDD) folgt. Es ermöglicht die Erstellung wiederholbarer, isolierter und automatisierter Tests, die dabei helfen:
- Fehler frühzeitig im Entwicklungsprozess zu erkennen
- Die Stabilität des Codes bei Refactoring zu gewährleisten
- Das erwartete Verhalten von Funktionen zu dokumentieren
- Das Vertrauen in die Qualität des Softwareprodukts zu stärken
Grundlagen der Arbeit mit unittest
Grundlegende Teststruktur
Um mit unittest zu beginnen, muss das Modul importiert und eine Testklasse erstellt werden:
import unittest
class TestMath(unittest.TestCase):
def test_add(self):
self.assertEqual(2 + 3, 5)
def test_multiply(self):
self.assertEqual(4 * 5, 20)
if __name__ == '__main__':
unittest.main()
Wichtige Strukturprinzipien
Jede Testklasse muss von unittest.TestCase erben. Alle Testmethoden beginnen mit dem Präfix test_, damit das Framework die Tests automatisch erkennen und ausführen kann. Die Methode unittest.main() startet alle gefundenen Tests im aktuellen Modul.
Testlebenszyklus und Test-Fixuren
Setup- und Teardown-Methoden
Unittest bietet spezielle Methoden zur Vorbereitung und Bereinigung der Testumgebung:
class TestDatabase(unittest.TestCase):
@classmethod
def setUpClass(cls):
"""Wird einmal vor allen Tests der Klasse ausgeführt"""
cls.db_connection = create_test_database()
@classmethod
def tearDownClass(cls):
"""Wird einmal nach allen Tests der Klasse ausgeführt"""
cls.db_connection.close()
def setUp(self):
"""Wird vor jedem Test ausgeführt"""
self.test_data = ["item1", "item2", "item3"]
def tearDown(self):
"""Wird nach jedem Test ausgeführt"""
self.test_data.clear()
Fixuren-Ebenen
Fixuren in unittest arbeiten auf verschiedenen Ebenen:
setUp()undtearDown()– für jeden Test einzelnsetUpClass()undtearDownClass()– für die gesamte TestklassesetUpModule()undtearDownModule()– für das gesamte Modul
Assertions-Methoden
Wichtige Prüfmethoden
Unittest bietet eine Vielzahl von Methoden für verschiedene Prüfarten:
| Methode | Beschreibung | Anwendungsbeispiel |
|---|---|---|
assertEqual(a, b) |
Prüft Gleichheit von a und b | self.assertEqual(2+2, 4) |
assertNotEqual(a, b) |
Prüft Ungleichheit von a und b | self.assertNotEqual(2+2, 5) |
assertTrue(x) |
Prüft, ob x wahr ist | self.assertTrue(5 > 3) |
assertFalse(x) |
Prüft, ob x falsch ist | self.assertFalse(5 < 3) |
Auch in der Bibliothek
Bildverarbeitung und -bearbeitung mit TypeScript: Jimp, Sharp, Canvas
Arbeiten mit Daten in Rust: Überblick über Bibliotheken für Zeit und Kalender
Maschinelles Lernen mit PHP: Überblick über Bibliotheken und Werkzeuge
Internationalisierung (i18n) in Swift: NSLocalizedString und String Catalog
Observation Swift: Komplettleitfaden mit Beispielen