BlogWissenwertesDie Kunst der Softwaretests – Teil 2

Die Kunst der Softwaretests – Teil 2

Ein Beitrag von Markus Wege

Teil 2: Teststrategien im Detail – Unittests und Integrationstests erklärt

Einleitung

In unserem vorherigen Artikel haben wir die Testpyramide und die Bedeutung von Unittests und Integrationstests skizziert. In diesem Artikel werden wir uns ausführlicher mit diesen beiden Testebenen befassen, und zwar darauf, was genau getestet wird und wer für die Implementierung und Durchführung dieser Tests zuständig ist.

Unittests: Die Grundlage des Testens

Unittests, auch als Unit-Tests bezeichnet, bilden die grundlegendste Testebene in der Softwareentwicklung. Sie stellen sicher, dass die kleinste Codeeinheit korrekt funktioniert. Das bedeutet, dass sie prüfen, ob die erwarteten Ergebnisse erzielt werden, wenn bestimmte Eingaben oder Bedingungen auf die Codeeinheit angewendet werden. Dies dient dazu, die korrekte Funktionalität sicherzustellen und mögliche Fehler oder Abweichungen frühzeitig zu erkennen.

Unittests werden charakterisiert durch: 

  1. Isolation: Unittests sind in der Regel unabhängig voneinander und sollten die zu testende Codeeinheit isoliert betrachten. Dies bedeutet, dass externe Abhängigkeiten oder andere Teile des Systems entfernt oder simuliert werden, um die reine Funktionalität der Einheit zu überprüfen. 
  2. Wiederholbarkeit: Unittests sollten wiederholbar sein. Das bedeutet, dass sie bei jedem Durchlauf das gleiche Ergebnis liefern sollten. Dies gewährleistet, dass Änderungen im Code sofort erkannt werden, wenn die Unittests erneut ausgeführt werden.
  3. Automatisierung: Unittests werden normalerweise automatisiert, was bedeutet, dass sie regelmäßig und ohne manuelle Eingriffe ausgeführt werden können. Dies unterstützt die Integration in den Entwicklungsprozess, insbesondere bei kontinuierlicher Integration (CI) und kontinuierlicher Bereitstellung (CD).
  4. Schnelligkeit: Unittests sollten schnell ausgeführt werden, da sie bei jedem Build oder bei jeder Änderung im Code ausgeführt werden. Ihre Geschwindigkeit ist entscheidend für eine effiziente Entwicklung und Fehlererkennung.

Beispiel für einen Unittest

Angenommen, du hast eine Funktion, die zwei Zahlen addiert. Ein zugehöriger Unittest würde sicherstellen, dass die Funktion korrekt funktioniert, indem sie verschiedene Testfälle mit verschiedenen Eingabewerten überprüft und die Ausgabe mit den erwarteten Ergebnissen vergleicht.

Unittests sind das Fundament der Qualitätssicherung in der Softwareentwicklung und ermöglichen es, Fehler frühzeitig zu erkennen, die Wartbarkeit des Codes zu verbessern und das Vertrauen in die Software zu stärken. Sie sind ein entscheidender Bestandteil des Entwicklungsprozesses und sollten sorgfältig und umfassend durchgeführt werden.

Integrationstests: Das Zusammenspiel der Komponenten

Integrationstests bilden die nächste Ebene der Testpyramide. Sie überprüfen, ob die verschiedenen Teile der Software nahtlos zusammenarbeiten und ihre Schnittstellen korrekt funktionieren. Dies umfasst die Validierung von Datenflüssen und Interaktionen zwischen den Komponenten, z.B. externen System oder Datenbanken.

Merkmale von Integrationstests:

  1. Interaktion: Integrationstests berücksichtigen die Interaktion zwischen den verschiedenen Teilen der Software. Sie prüfen, ob Daten und Steuerungen korrekt von einer Komponente zur anderen übertragen werden.
  2. Schnittstellen: Ein Schwerpunkt liegt auf den Schnittstellen, da Fehler an diesen Stellen häufig auftreten. Integrationstests stellen sicher, dass die Schnittstellen korrekt implementiert sind und dass die Kommunikation zwischen den Komponenten reibungslos verläuft.
  3. Realistische Umgebung: Integrationstests werden oft in einer Umgebung durchgeführt, die der realen Produktionsumgebung nahekommt. Dies kann dazu beitragen, Probleme zu identifizieren, die nur unter realen Bedingungen auftreten.
  4. End-to-End-Tests: In einigen Fällen werden Integrationstests als End-to-End-Tests durchgeführt, um sicherzustellen, dass alle Komponenten und Module der Software in ihrer Gesamtheit korrekt zusammenarbeiten.

Beispiel für einen Integrationstests

Angenommen, du entwickelst eine E-Commerce-Anwendung. Integrationstests würden sicherstellen, dass die Benutzerregistrierung nahtlos mit dem Warenkorb und der Bezahlung interagiert. Sie überprüfen, ob die Benutzerdaten korrekt an den Warenkorb übergeben werden und ob die Bezahlung ohne Probleme durchgeführt wird.

Exkurs: Mocks

Oft ist es Aufgabe von Integrationstests, sicherzustellen, dass eine Komponente korrekt mit ihrer Umwelt kommunizieren kann. Allerdings sind dabei oft externe Systeme nicht, oder nur eingeschränkt verfügbar.

Hier kommen Mocks ins Spiel: Ein Mock ist eine künstliche Implementierung einer Komponente oder Schnittstelle, die während des Integrationstests anstelle der realen Implementierung verwendet wird. Der Mock simuliert hierbei das angeschlossene System. 

Dadurch steht die zu testende Komponente im Fokus und Tests sind unabhängig von der Verfügbarkeit anderer Systeme möglich.

Die Rolle der Automatisierung

Sowohl Unittests als auch Integrationstests können automatisiert werden, um die Effizienz zu steigern und sicherzustellen, dass Tests regelmäßig durchgeführt werden. Die Automatisierung von Tests erleichtert auch die Identifizierung von Problemen in einem frühen Stadium und ermöglicht eine schnellere Fehlerkorrektur.

Hierzu werden diese Tests in den CI/CD Pipelines regelmäßig bei jeder Codeänderung oder aber z.B. nachts ausgeführt.

Fazit

Unittests und Integrationstests sind entscheidende Schritte in der Qualitätssicherung von Software. Während Unittests die Funktionalität von einzelnen Codeeinheiten gewährleisten, überprüfen Integrationstests das reibungslose Zusammenspiel der verschiedenen Komponenten. Entwickler und Tester arbeiten in der Regel eng zusammen, um sicherzustellen, dass diese Tests erfolgreich durchgeführt werden. Die Automatisierung von Tests trägt dazu bei, die Effizienz zu steigern und die Qualität der Software sicherzustellen.



Schreiben Sie einen Kommentar

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert