Testen von Software
Тематический план
-
- Bedeutung des Testens in der Softwareentwicklung
- Grundbegriffe: Fehler, Mängel, Fehlerursachen
- Testziele und Qualitätsmerkmale
- Lebenszyklus des Softwaretestens
-
Das Testen in der Softwareentwicklung spielt eine entscheidende Rolle für die Qualität, Zuverlässigkeit und Benutzerzufriedenheit von Softwareprodukten. Es ist ein systematischer Prozess, der darauf abzielt, Fehler und Probleme in der Software zu identifizieren, bevor sie an den Endbenutzer ausgeliefert wird. Die Bedeutung des Testens kann anhand verschiedener Aspekte beleuchtet werden:
-
Die Begriffe "Fehler", "Mängel" und "Fehlerursachen" sind zentrale Konzepte im Bereich des Softwaretestens und der Qualitätssicherung. Sie helfen dabei, die Art und Quelle von Problemen innerhalb eines Softwareprodukts zu identifizieren und zu klassifizieren.
-
Testziele und Qualitätsmerkmale sind grundlegende Konzepte in der Softwareeprüfung, die festlegen, was durch das Testen erreicht werden soll und welche Aspekte der Softwarequalität als wichtig erachtet werden.
Die Definition und Beschreibung dieser Elemente ist entscheidend für die Planung und Durchführung effektiver Testaktivitäten sowie für die Bewertung der Softwarequalität. -
Der Lebenszyklus von Testaktivitäten, oft als Software Test Life Cycle (STLC) bezeichnet, beschreibt die systematische Ausführung von Testprozessen in Phasen. Jede Phase hat spezifische Ziele und Aufgaben, die dazu beitragen, die Qualität der Software durch das Finden und Beheben von Fehlern zu verbessern.
Der STLC ermöglicht es Testteams, strukturiert und fokussiert vorzugehen, um die Softwarequalität zu sichern und die Entwicklungs- und Wartungskosten zu reduzieren.
-
- Einheitentests (Unit Testing): Testen von individuellen Funktionen oder Methoden.
- Integrationstests: Testen von Interaktionen zwischen Komponenten oder Systemen.
- Systemtests: Testen des gesamten Systems auf Übereinstimmung mit den Anforderungen.
- Akzeptanztests: Verifizierung, ob das Endprodukt die Erwartungen des Kunden oder Benutzers erfüllt.
-
Die verschiedenen Teststufen – Einheitentests (Unit Testing), Integrationstests, Systemtests und Akzeptanztests – bilden zusammen eine hierarchische Struktur, die die Qualität und Funktionalität einer Software sicherstellt. Jede Stufe hat spezifische Ziele und wird typischerweise von verschiedenen Mitgliedern des Entwicklungsteams oder von den Stakeholdern durchgeführt. Die Tests werden in der folgenden Reihenfolge durchgeführt:
1. Einheitentests (Unit Testing)
Wer: In der Regel von Softwareentwicklern durchgeführt.
Wann: Direkt nach der Entwicklung einer Komponente oder Funktion, typischerweise während der Implementierungsphase.
Wozu: Einheitentests zielen darauf ab, die korrekte Funktion einzelner Softwarekomponenten (z.B. Funktionen, Methoden, Klassen) zu verifizieren. Sie helfen dabei, Fehler früh im Entwicklungsprozess zu identifizieren und zu isolieren, was die Komplexität beim Debugging reduziert und die Qualität des Codes verbessert.
2. Integrationstests
Wer: Oft von einem spezialisierten Testteam oder den Entwicklern durchgeführt.
Wann: Nachdem einzelne Einheiten getestet und als funktionsfähig befunden wurden, typischerweise nach Abschluss mehrerer Einheitentests.
Wozu: Integrationstests überprüfen die Interaktionen und Schnittstellen zwischen verschiedenen Modulen oder Diensten in der Software. Das Hauptziel ist es, Datenflussprobleme, Schnittstellenfehler und andere Integrationsfehler zu identifizieren, die beim Zusammenspiel unterschiedlicher Komponenten auftreten können.
3. Systemtests
Wer: Meist von einem dedizierten Testteam, das unabhängig von den Entwicklern operiert.
Wann: Nachdem Integrationstests erfolgreich abgeschlossen wurden und alle Komponenten der Software integriert sind.
Wozu: Systemtests bewerten die Software als Ganzes, um sicherzustellen, dass sie den spezifizierten Anforderungen entspricht und korrekt funktioniert. Diese Tests decken eine breite Palette von Aspekten ab, einschließlich Funktionalität, Zuverlässigkeit, Leistung und Sicherheit der Anwendung.
4. Akzeptanztests
Wer: Oft von den Endbenutzern oder Kunden durchgeführt, manchmal mit Unterstützung des Qualitätssicherungsteams.
Wann: Nachdem die Systemtests erfolgreich durchgeführt wurden und die Software als bereit für den Einsatz betrachtet wird.
Wozu: Akzeptanztests dienen dazu, die Erfüllung der Geschäfts- und Benutzeranforderungen zu bestätigen. Sie fokussieren auf die Benutzerfreundlichkeit, die Erfüllung der Benutzererwartungen und die Eignung der Software für ihren beabsichtigten Zweck. Ziel ist es, die Entscheidung zu unterstützen, ob die Software ausgeliefert werden kann oder weitere Verbesserungen benötigt.
Zusammenfassung
Jede Teststufe baut auf den vorherigen auf und erhöht die Sicherheit, dass die Software ihre Anforderungen erfüllt und für die Endbenutzer zufriedenstellend funktioniert. Durch die schrittweise Erhöhung des Testumfangs von einzelnen Einheiten über integrierte Komponenten und das gesamte System bis hin zur finalen Benutzerakzeptanz kann das Entwicklungsteam sicherstellen, dass die Software gründlich getestet und bereit für die Produktion ist.
-
- Funktionale Tests: Überprüfung der Funktionalität und der sichtbaren Verhaltensaspekte der Software.
- Nicht-funktionale Tests: Beinhaltet Leistungstests, Sicherheitstests, Usability-Tests, Kompatibilitätstests und mehr.
- Regressionstests: Sicherstellung, dass neue Änderungen keine Auswirkungen auf die bestehende Funktionalität haben.
- Exploratives Testen: Unstrukturiertes Testen zur Entdeckung bisher unbekannter Fehler.
-
Funktionale Tests sind darauf ausgerichtet zu überprüfen, ob die verschiedenen Funktionen einer Software gemäß den spezifizierten Anforderungen und Bedingungen arbeiten. Sie konzentrieren sich auf das "Was" die Software tut, im Gegensatz zu nicht-funktionalen Tests, die das "Wie gut" die Software etwas tut (wie Performance, Skalierbarkeit usw.) untersuchen
-
Nicht-funktionale Tests beziehen sich auf das Überprüfen von Aspekten einer Software, die nicht direkt mit einer spezifischen Funktion oder Funktionalität verbunden sind, sondern vielmehr mit der Art und Weise, wie das System operiert. Diese Tests bewerten die Performance, Zuverlässigkeit, Sicherheit und andere wichtige Qualitätsattribute der Software. Im Gegensatz zu funktionalen Tests, die sich darauf konzentrieren, was die Software tut, konzentrieren sich nicht-funktionale Tests darauf, wie gut die Software ihre Aufgaben unter verschiedenen Bedingungen ausführt.
Nicht-funktionale Tests sind entscheidend für die Gewährleistung der Benutzerzufriedenheit und der allgemeinen Softwarequalität.
-
Regressionstests sind ein entscheidender Bestandteil des Software-Testprozesses, die sicherstellen, dass Änderungen am Code (wie Bugfixes oder neue Features) nicht zu neuen Fehlern in bereits getesteten Teilen der Software führen. Die Gestaltung effektiver Regressionstests erfordert eine strategische Planung und Durchführung, um die Softwarequalität durch den Entwicklungsprozess hindurch zu gewährleisten.
-
Exploratives Testen ist ein Ansatz beim Softwaretesten, der sich durch seine Unstrukturiertheit und seine Fokussierung auf die Erkundung und das Entdecken von Fehlern auszeichnet. Im Gegensatz zu traditionellen, skriptbasierten Testmethoden, bei denen Tests im Voraus geplant und spezifiziert werden, basiert das explorative Testen auf der Neugier, Erfahrung und Intuition des Testers. Es wird oft als Ergänzung zu strukturierten Testmethoden eingesetzt, um Bereiche zu erforschen, die möglicherweise übersehen wurden, und um ein tieferes Verständnis der Anwendung zu entwickeln.
-
- Statische Testtechniken: Code-Reviews, Walkthroughs, Inspektionen.
- Dynamische Testtechniken: Black-Box-Testen, White-Box-Testen, Grey-Box-Testen.
- Testfallentwurfsmethoden: Äquivalenzklassenbildung, Grenzwertanalyse, Entscheidungstabellentesten.
-
Code-Reviews, Walkthroughs und Inspektionen sind drei wichtige Techniken der statischen Codeanalyse in der Softwareentwicklung, die darauf abzielen, Fehler zu identifizieren, die Codequalität zu verbessern und Best Practices zu fördern, bevor der Code ausgeführt wird.
In allen drei Techniken ist eine konstruktive Atmosphäre entscheidend, in der Feedback und Kritik dazu dienen, die Codequalität zu verbessern und nicht die Leistung einzelner Entwickler zu bewerten -
Black-Box-Testen, White-Box-Testen, Grey-Box-Testen.
Black-Box-Testen, White-Box-Testen und Grey-Box-Testen sind drei grundlegende Ansätze im Softwaretesten, die sich in ihrem Zugang zum Testobjekt und in der Menge der verwendeten Informationen über die interne Funktionsweise der Software unterscheiden. Jeder Ansatz hat seine spezifischen Anwendungen, Vorzüge und Einschränkungen.
Black-Box-Testen
Definition:
- Beim Black-Box-Testen kennt der Tester die interne Struktur, den Code oder die Implementierungsdetails der Software nicht. Tests werden auf der Grundlage der Anforderungen und Funktionalität der Software durchgeführt. Der Fokus liegt darauf, wie das System auf Eingaben reagiert und ob es die erwarteten Ausgaben produziert.
Einsatzgebiete und Vorteile:
- Anwendbar auf alle Testebenen (Einheit, Integration, System, Akzeptanz).
- Fördert objektive Tests, da der Tester nicht von Kenntnissen über die interne Implementierung beeinflusst wird.
- Geeignet für funktionale Tests, um die Erfüllung der Benutzeranforderungen zu überprüfen.
White-Box-Testen
Definition:
- White-Box-Testen, auch bekannt als strukturorientiertes oder gläsernes Testen, setzt voraus, dass der Tester vollständiges Wissen über die interne Logik, den Code und die Struktur der Software hat. Tests konzentrieren sich auf interne Pfade, Codestrukturen, die Verzweigungslogik und mögliche Ausführungspfade.
Einsatzgebiete und Vorteile:
- Häufig verwendet für Einheitentests und teilweise Integrationstests.
- Ermöglicht eine gründliche Überprüfung des Codes, einschließlich der Abdeckung aller möglichen Ausführungspfade.
- Hilfreich, um verborgene Fehler aufzudecken, die bei Black-Box-Tests möglicherweise nicht erkannt werden.
Grey-Box-Testen
Definition:
- Grey-Box-Testen ist eine Kombination aus Black-Box- und White-Box-Testansätzen. Tester haben teilweises Wissen über die interne Struktur der Anwendung, nutzen dieses Wissen jedoch hauptsächlich, um Black-Box-Tests effizienter zu gestalten. Dieser Ansatz versucht, die Stärken beider Methoden zu nutzen, indem ein gewisses Maß an internem Verständnis in die Testplanung einfließt.
Einsatzgebiete und Vorteile:
- Besonders geeignet für Integrationstests und Sicherheitstests.
- Erlaubt es Testern, fokussiertere Tests basierend auf ihrem Verständnis der Systemarchitektur zu entwerfen.
- Kann effektiv sein, um Schnittstellenfehler und sicherheitsrelevante Schwachstellen zu identifizieren.
Zusammenfassung und Unterscheidungen
- Black-Box-Testen: Konzentriert sich auf externe Funktionalität; keine Kenntnis der internen Implementierung erforderlich.
- White-Box-Testen: Nutzt detailliertes Wissen über den internen Code und die Struktur; fokussiert auf interne Arbeitsweisen.
- Grey-Box-Testen: Kombiniert Elemente beider Ansätze; erfordert teilweises Wissen über die interne Struktur, konzentriert sich aber hauptsächlich auf externe Testperspektiven.
-
Äquivalenzklassen
Äquivalenzklassenbildung ist eine Testdesign-Technik, die im Softwaretesten verwendet wird, um die Anzahl der Testfälle zu reduzieren, indem Eingabedaten in Klassen oder Gruppen eingeteilt werden, von denen angenommen wird, dass sie ähnliches Verhalten aufweisen. Das Ziel ist, für jede Klasse mindestens einen repräsentativen Wert zu testen, um die Effektivität des Testens zu maximieren, während die Anzahl der Testfälle minimiert wird.
Die Grundidee ist, dass, wenn ein Testfall in einer Äquivalenzklasse erfolgreich ist, alle anderen Fälle in derselben Klasse als erfolgreich betrachtet werden können, und wenn ein Testfall fehlschlägt, auch alle anderen Fälle in dieser Klasse wahrscheinlich fehlschlagen.
Beispiel 1: Eingabealter in einem Formular
Anforderung: Ein Online-Formular erlaubt die Eingabe eines Alters zwischen 1 und 100 Jahren.
Äquivalenzklassen:
- Gültige Äquivalenzklassen (Eingaben, die akzeptiert werden sollten):
- 1 bis 100 (z.B. könnte 25 als repräsentativer Wert gewählt werden)
- Ungültige Äquivalenzklassen (Eingaben, die abgelehnt werden sollten):
- Unter 1 (z.B. könnte -5 als repräsentativer Wert gewählt werden)
- Über 100 (z.B. könnte 101 als repräsentativer Wert gewählt werden)
Beispiel 2: Passwortstärke
Anforderung: Ein System erfordert, dass Passwörter mindestens 8 Zeichen lang sind und sowohl Buchstaben als auch Zahlen enthalten.
Äquivalenzklassen:
- Gültige Äquivalenzklassen:
- Passwörter mit 8 oder mehr Zeichen, die Buchstaben und Zahlen enthalten (z.B. „Password1“)
- Ungültige Äquivalenzklassen:
- Passwörter unter 8 Zeichen (z.B. „Pass1“)
- Passwörter ohne Zahlen (z.B. „Password“)
- Passwörter ohne Buchstaben (z.B. „12345678“)
Beispiel 3: Suchfunktion in einem Online-Shop
Anforderung: Eine Suchfunktion in einem Online-Shop akzeptiert Buchstaben und Zahlen für die Produktsuche und ignoriert Sonderzeichen.
Äquivalenzklassen:
- Gültige Äquivalenzklassen:
- Eingaben nur mit Buchstaben (z.B. „Tisch“)
- Eingaben nur mit Zahlen (z.B. „1234“)
- Eingaben mit Buchstaben und Zahlen (z.B. „Tisch123“)
- Ungültige Äquivalenzklassen:
- Eingaben nur mit Sonderzeichen (z.B. „@#!$%“)
- Gültige Äquivalenzklassen (Eingaben, die akzeptiert werden sollten):
-
Die Grenzwertanalyse ist eine Testdesign-Technik, die sich auf die Identifizierung und Überprüfung von Fehlern an den Rändern von Eingabebereichen konzentriert. Es basiert auf der Beobachtung, dass Fehler häufig an den "Grenzen" eines Eingabebereichs auftreten, wie z.B. an den minimalen und maximalen Werten. Die Grenzwertanalyse wird oft in Kombination mit der Äquivalenzklassenbildung eingesetzt, um eine umfassende Testabdeckung zu gewährleisten.
-
Das Entscheidungstabellentesten, auch bekannt als "Cause-Effect Testing", ist eine systematische Testdesign-Technik, die verwendet wird, um komplexe Geschäftslogiken oder Systemanforderungen effektiv zu testen. Diese Methode eignet sich besonders gut für Situationen, in denen das Verhalten eines Systems von einer Kombination verschiedener Bedingungen abhängt. Eine Entscheidungstabelle hilft dabei, alle möglichen Kombinationen dieser Bedingungen und die entsprechenden erwarteten Aktionen oder Ergebnisse darzustellen.
-
- Grundlagen und Vorteile der Testautomatisierung
- Auswahl von Testfällen für die Automatisierung
- Werkzeuge und Frameworks für die Testautomatisierung
-
Testautomatisierung bezieht sich auf die Verwendung spezieller Software (separate von der zu testenden Software), um die Ausführung von Tests zu steuern, die Vergleichung der tatsächlichen Ergebnisse mit den vorhergesagten Ergebnissen zu automatisieren und andere testbezogene Aufgaben (wie Testdaten-Setup) zu erleichtern.
Die Implementierung der Testautomatisierung erfordert eine sorgfältige Planung und kontinuierliche Wartung der Testskripts, um sicherzustellen, dass die Tests aktuell bleiben und relevante Aspekte der Anwendung abdecken. Eine erfolgreiche Testautomatisierungsstrategie berücksichtigt den Aufwand für die Erstellung und Wartung der Testautomatisierung im Vergleich zum erwarteten Nutzen. -
Die Auswahl von Testfällen für die Automatisierung ist ein kritischer Schritt in der Teststrategie eines Projekts, da sie die Effektivität der Testautomatisierung maßgeblich beeinflusst. Nicht jeder Testfall eignet sich für die Automatisierung; daher ist es wichtig, Kriterien zu definieren, die bei der Auswahl helfen.
-
Werkzeuge und Frameworks für die Testautomatisierung
Hier sind einige der bekanntesten und am häufigsten verwendeten Werkzeuge und Frameworks für verschiedene Arten der Testautomatisierung:Für Webanwendungen
- Selenium: Eines der populärsten Open-Source-Frameworks für die Automatisierung von Webbrowser-Aktionen. Selenium unterstützt mehrere Programmiersprachen, darunter Java, C#, Python und Ruby, und ermöglicht das Testen auf verschiedenen Browsern und Betriebssystemen.
- WebDriverIO: Ein Node.js-basiertes Framework, das eine einfache und leistungsstarke Möglichkeit bietet, Webanwendungen zu testen. Es unterstützt das Schreiben von Tests in JavaScript und bietet Integrationen mit verschiedenen Testrunnern wie Jasmine, Mocha und Cucumber.
- Cypress: Ein modernes, all-in-one Testing Framework für Webanwendungen, das komplett in JavaScript geschrieben ist. Cypress ist besonders bekannt für seine einfache Einrichtung, schnelle Testausführung und umfangreiche Debugging-Möglichkeiten.
Für Mobile Anwendungen
- Appium: Ein Open-Source-Tool für die Automatisierung von mobilen Apps auf iOS und Android. Appium ist ein Cross-Platform-Tool, das es ermöglicht, native, mobile Web und Hybrid-Anwendungen mit demselben API zu testen.
- Espresso (für Android): Ein Framework von Google, das speziell für die Automatisierung von UI-Tests für Android-Anwendungen entwickelt wurde. Espresso ist dafür bekannt, dass es eng mit dem Android SDK integriert ist, was schnelle und zuverlässige Testausführungen ermöglicht.
- XCTest/XCUITest (für iOS): Von Apple bereitgestellte Frameworks für das Testen von UI-Komponenten und die Automatisierung von UI-Tests auf iOS-Geräten.
Für API-Tests
- Postman: Eine beliebte Anwendung für die Entwicklung von APIs, die auch Funktionen für das automatisierte Testen von APIs bietet. Postman ermöglicht es, Tests für REST, SOAP oder GraphQL APIs einfach zu erstellen, auszuführen und zu organisieren.
- SoapUI: Ein Tool speziell für das Testen von SOAP- und REST-Webdiensten. SoapUI unterstützt umfangreiche Testfunktionen, einschließlich Funktions-, Last- und Sicherheitstests.
Für Unit-Testing
- QtTest-Bibliothek: QtTest ermöglicht es, einzelne Klassen und Methoden systematisch zu testen. Die Tests basieren auf der Struktur von Testfällen (Test Case) und Testmethoden (Test Functions) mit einem Signal- und Slot-System und der Möglichkeit die Testergebnisse in der Konsole oder als XML-Bericht auszugeben.
- JUnit (für Java): Eines der bekanntesten Frameworks für das Schreiben und Ausführen von Unit-Tests in Java. Es bietet Annotations-basierte Testdefinitionen und ist integrierbar mit den meisten IDEs und Build-Tools.
- NUnit (für .NET): Ähnlich wie JUnit, aber für .NET-Anwendungen. NUnit bietet eine reiche Sammlung von Assertions und ist mit verschiedenen .NET-Sprachen kompatibel.
- pytest (für Python): Ein flexibles und leistungsfähiges Tool für das Schreiben von einfachen Unit-Tests bis hin zu komplexen funktionalen Tests für Python-Anwendungen.
Continuous Integration / Continuous Deployment (CI/CD)
- Jenkins: Eine Open-Source-Automatisierungs-Server-Software, die die Automatisierung aller Arten von Aufgaben, einschließlich des Buildens, Testens und Deployens von Software, ermöglicht.
- GitLab CI/CD: Bietet eine integrierte Lösung zur Automatisierung des Build-, Test- und Deployment-Prozesses innerhalb der GitLab-Plattform.
-
Google Test (auch bekannt als gtest) ist ein umfangreiches Framework für das Unit-Testing von C++ Anwendungen. Es ist Open Source und von Google entwickelt, um Entwicklern ein effektives Werkzeug für das Schreiben von Tests in C++ zu bieten. Google Test ist für eine Vielzahl von Plattformen verfügbar, darunter Windows, Linux und MacOS. Es wird in zahlreichen Projekten innerhalb und außerhalb von Google verwendet und unterstützt die Entwicklung robuster, fehlerfreier C++ Software durch umfangreiche Testmöglichkeiten