Software-Tests

Was sind Software-Tests?

Software-Tests, bei denen ein Programm auf seine Eignung für einen bestimmten Zweck geprüft wird, unterliegen häufig Missverständnissen. Handelt es sich dabei nur um eine Ablenkung von der Entwicklung neuer Funktionen? Eine Produktivitätsbremse? Oder vielleicht ein unnötiger Schritt, da auf Ihrem lokalen Computer alles einwandfrei zu funktionieren scheint? Stellen Sie sich folgendes Szenario vor: Sie sind Ingenieur und haben jahrelang die Regelungssoftware für eine Rakete der nächsten Generation entwickelt und gebaut. Am Starttag läuft alles nach Plan, bis die Rakete wenige Sekunden nach dem Start vom Kurs abweicht und aufgrund eines einfachen Ganzzahlüberlaufs explodiert. So erging es dem Jungfernflug der Ariane-5-Rakete – und das ist nur ein Beispiel dafür, wie katastrophal Softwarefehler enden können.

Darstellung einer Rakete am Himmel mit einer blauen geraden gepunkteten Linie und einer roten geschwungenen gepunkteten Linie. Die Rakete folgt der roten geschwungenen Linie und explodiert.

Selbst kleine Fehler in der Software können zu unbeabsichtigten Folgen führen, wie z. B. Raketen, die vom Kurs abweichen.

Die Bedeutung von Software-Tests

Softwarefehler haben Konsequenzen. So haben Fehler schon dazu geführt, dass Strahlentherapiegeräte falsche Dosierungen produzierten, Handelsalgorithmen Millionen von Dollar verloren und sogar ein Mars-Satellit aufgrund falscher Einheitenumrechnungen verloren ging. Diese echten Beispiele unterstreichen die enorme Bedeutung von Software-Tests, um potenzielle Fehler zu erkennen, bevor sie Schaden anrichten können. In ihrem Berufsalltag ist es das Ziel von Ingenieuren, Code zu schreiben, der funktioniert – und auch langfristig zuverlässig funktioniert. Durch Software-Tests wird sichergestellt, dass wichtige Entscheidungen, die auf Ihrer Software basieren, fundiert sind.

Darstellung eines Mannes, der an einem Computer-Schreibtisch sitzt und Code und verschiedene Farben auf dem Bildschirm sieht.

Software-Tests stellen sicher, dass Ihr Code langfristig zuverlässig funktioniert.

Durch frühzeitige Tests im Entwicklungsprozess können die Kosten erheblich gesenkt werden: Die Kosten für die Behebung eines Fehlers steigen, je weiter er sich im Entwicklungszyklus befindet. Das frühzeitige Erkennen von Problemen spart nicht nur Zeit und Geld, sondern minimiert gleichzeitig das Risiko von Projektverzögerungen und sorgt für einen reibungsloseren Entwicklungsprozess. Durch die Integration von Software-Tests in frühe Entwicklungsphasen können Teams potenzielle Probleme erkennen und beheben, bevor sie eskalieren, was zu einer fehlerresistenteren und zuverlässigeren Software führt.

Manuelle und automatisierte Software-Tests

Wenn Sie schon einmal Code geschrieben haben, haben Sie ihn getestet, auch wenn Sie sich dessen nicht bewusst waren. Unter dem Testen von Software versteht man den Evaluierungsprozess einer Software-Anwendung, um Bugs, Fehler und Lücken in den Anforderungen zu identifizieren. Das Ausführen eines Skripts, um zu sehen, ob es das richtige Ergebnis liefert, ist eine Form des manuellen Testens. Bei manuellen Tests müssen sich die Tester jedoch die Verfahren merken und beurteilen, ob das Ergebnis korrekt ist, was von den individuellen Kenntnissen der jeweiligen Person über die Anwendung abhängt. Wenn diese Person das Unternehmen verlässt, geht damit auch ihr Wissen – und die Fähigkeit, den Code zu testen – verloren.

Darstellung verschiedener Arten von Software-Tests: ein Werkzeugkasten mit der Aufschrift „manuelle Tests“ und Zahnräder mit der Aufschrift „automatisierte Tests“.

Manuelle Tests werden bei wiederholbaren Prozessen schnell schwierig. Automatisierte Software-Tests bieten mit zunehmender Komplexität des Codes immer mehr Vorteile.

Moderne Software-Tests haben sich von manuellen zu automatisierten Tests weiterentwickelt und bieten eine systematische Möglichkeit, Software zu evaluieren. Durch die Dokumentation des erwarteten Verhaltens und der Testschritte wird wichtiges Wissen von Einzelpersonen in den Testcode übertragen, wodurch die Tester-Basis erweitert wird, was letztendlich zu einem konsistenteren und zuverlässigeren Code führt. Automatisierte Software-Tests ermöglichen es, das tatsächliche Systemverhalten mit den erwarteten Ergebnissen zu vergleichen und Diskrepanzen hervorzuheben, die möglicherweise eine Überprüfung erfordern (oder Tests, die aktualisiert werden müssen).

Ziele von Software-Tests

  • Fehler frühzeitig erkennen: Es ist von entscheidender Bedeutung, Fehler frühzeitig im Entwicklungsprozess zu erkennen, da die Kosten für ihre Behebung mit fortschreitendem Projekt exponentiell steigen. Fehler, die bis zur Bereitstellung gelangen, können zu finanziellen Verlusten und zu Rufschädigung führen.
  • Verlässlichkeits- und Performance-Probleme ermitteln: Es ist von entscheidender Bedeutung, den Code unter allen Bedingungen zu testen, auch in Grenzfällen. Performance-Probleme wie langsame Reaktionszeiten können ebenso kritisch sein wie falsche Ergebnisse.

Varianten von Software-Tests

Es gibt eine Vielzahl von Software-Tests, und es kann schwierig sein, den richtigen Ansatz zu finden. Hier sind einige Grundtypen von Software-Tests, die jeder Ingenieur kennen sollte:

  • Unit-Tests: Konzentriert sich auf die Überprüfung der Funktionalität einzelner Komponenten oder Code-Einheiten in Isolation. Unit-Tests tragen dazu bei, Fehler frühzeitig zu isolieren und zu identifizieren, und können vergleichsweise schnell und einfach geschrieben und ausgeführt werden.
  • Integrationstests: Überprüft die Schnittstellen zwischen Code-Einheiten, um sicherzustellen, dass sie wie erwartet interagieren. Dabei werden Probleme wie Inkonsistenzen bei Datenformaten und Inkompatibilitäten bei Code-Schnittstellen erkannt.
  • Systemtests: Umfasst das Testen des gesamten integrierten Systems, um sicherzustellen, dass es die festgelegten Anforderungen erfüllt. Hierbei werden reale Szenarien simuliert, um zu überprüfen, ob sich die Software unter den erwarteten Bedingungen korrekt verhält.
  • Smoke Testing: Verifiziert, dass die wichtigsten Funktionen funktionieren und die Software für weitere Tests bereit ist. So können einfach und schnell die grundlegenden Funktionen einer Software überprüft werden. 
  • Regressionstests: Kontrolliert, ob Änderungen am Code unerwartete Verhaltensänderungen verursachen. Es stellt sicher, dass die Software nach Änderungen weiterhin wie vorgesehen funktioniert.
  • Performance-Tests: Bewertet die Performance der Software unter verschiedenen Bedingungen. Mithilfe von Kriterien wie Reaktionszeiten und Ressourcennutzung werden Engpässe identifiziert und die Leistung optimiert.

Das Mocking ist zwar keine eigenständige Testart, aber ein Mechanismus, um Komponenten isoliert zu testen, indem Abhängigkeiten simuliert werden. Es hilft dabei, bestimmte Teile des Systems zu isolieren und zu testen, ohne auf tatsächliche Komponenten angewiesen zu sein.

Diese Arten von Tests können kombiniert werden, um den spezifischen Anforderungen eines Projekts gerecht zu werden. Zum Beispiel könnten Sie einen Unit-Test haben, der auf Mocking zurückgreift, oder einen Integrationstest, der ein Regressionstest ist.

Varianten von Softwaretests

Entdecken Sie sieben grundlegende Arten von Softwaretests, die jeder Ingenieur kennen muss, darunter Unit-, Smoke- und Regressionstests und mehr.

Beispiel: Unit-Tests mit MATLAB

Der grundlegendste Test, den wir durchführen können, ist ein manueller Test, den wir in der Befehlszeile ausführen und prüfen können, ob die Ausgabe wie erwartet funktioniert. Allerdings hat das manuelle Testen von Software seine Grenzen und ist fehleranfällig.

Anstelle manueller Tests können Sie das Framework für Unit-Tests von MATLAB verwenden, um wiederholbare Tests zu schreiben.

Sehen wir uns ein einfaches Beispiel für Unit-Tests mit der fibonacci-Funktion an.

Screenshot eines Software-Tests in MATLAB, der das Kontextmenü für die Erstellung eines Unit-Tests hervorhebt.

Mit einem Rechtsklick auf eine Funktion in MATLAB wird ein Test erstellt.

Screenshot des MATLAB Programmcodes für Software-Tests mit orangefarbenen Kästchen, die die Werte angeben, die für die Unit-Test-Klasse bereitgestellt werden müssen.

MATLAB für Software-Tests: Wenn Sie die richtigen Werte eingeben, wird eine Testklasse für Sie erstellt, und der Test kann ausgeführt werden, um die Funktion zu überprüfen.

Die Erstellung eines Unit-Tests ist mit dem MATLAB Test Browser ganz einfach, da dieser die erstellte Funktion auswertet und die tatsächliche Ausgabe mit der erwarteten Ausgabe vergleicht, um Fehler zu erkennen.

Einführung in den Test Browser in MATLAB

Erfahren Sie, wie Sie mithilfe des Test-Browsers iterative Code-Tests durchführen können. Diese Oberfläche ermöglicht einen effizienteren Test- und Debugging-Prozess von der Skripterstellung bis zur Veröffentlichung.

Dieses einfache Beispiel für einen Software-Test stellt sicher, dass Ihre Funktion die erwarteten Ergebnisse liefert und die Ausgabe automatisch überprüft. 

Bewährte Praktiken für Software-Tests

Maximale Automatisierung

Durch Automatisierung können Sie Ihren Testprozess beschleunigen und mehr Bereiche abdecken, indem Sie Tests automatisch durchführen. Indem Sie sich wiederholende und zeitaufwendige Tests automatisieren, können Sie die freigewordenen Ressourcen für komplexere Szenarien nutzen. Automatisierte Tests können regelmäßig und einheitlich durchgeführt werden, um sicherzustellen, dass durch Codeänderungen keine neuen Fehler entstehen. Erwägen Sie die Verwendung von Frameworks und Tools, die sich nahtlos in Ihre Entwicklungsumgebung integrieren lassen, um den Prozess der Software-Tests zu optimieren.

Gleichzeitige Erstellung von Tests und Code

Wenn Sie Tests im Verlauf der Entwicklung des Codes schreiben, anstatt bis zum Ende des Projekts zu warten, können Sie Probleme frühzeitig erkennen und sicherstellen, dass jeder Codeabschnitt während der Entwicklung durch Tests abgedeckt ist. Diese Vorgehensweise hält Entwickler dazu an, die Anforderungen und das Design zu durchdenken, bevor sie Funktionen implementieren, was zu fehlerresistenterem und wartbarerem Code führt.

Drei Reihen mit Symbolen, die den Code in der linken Spalte und die entsprechenden Tests in der rechten Spalte darstellen.

Eine bewährte Methode beim Testen von Software besteht darin, Tests und Code gleichzeitig zu schreiben.

Priorisieren der Testabdeckung

Nicht jeder Code ist gleich – und das gilt auch für Tests. Testen Sie vorrangig Bereiche, von denen andere Komponenten abhängen, die eine komplexe Logik aufweisen oder die in der Vergangenheit fehleranfällig waren. Streben Sie einen Mittelweg an, bei dem Sie eine ausreichende Abdeckung erreichen, ohne den Testprozess zu überlasten. Verwenden Sie Tools zur Code-Abdeckung, um ungetestete Teile Ihrer Code-Basis zu identifizieren und Ihre Bemühungen auf diese Bereiche zu konzentrieren.

Durch die Integration dieser bewährten Praktiken beim Testen von Software können Teams die Qualität und Zuverlässigkeit ihrer Software verbessern, was letztlich zu erfolgreicheren Projekten und zufriedeneren Benutzern führt.


Beispiele und Erläuterungen


Siehe auch: Kontinuierliche Integration