Funktionstest
Was ist ein Funktionstest?
Funktionstests sind eine Art von Softwaretests, mit denen sichergestellt werden soll, dass sich die Software wie erwartet verhält und ihre Ergebnisse den Erwartungen der Endbenutzer oder des Unternehmens entsprechen. Bei Funktionstests wird jede Funktion (oder jedes Feature) der Software mit ihren Anforderungen und Spezifikationen verglichen, um zu überprüfen, ob das, was ist mit dem, wie es sein sollte übereinstimmt.
Softwareentwickler verwenden Funktionstests zur Qualitätssicherung (QS). Wenn ein System den Funktionstest besteht, kann es für die Freigabe an Kunden oder Endnutzer verifiziert werden. Funktionstests sind wichtig, da sie bestätigen, dass die Anwendung den Kundenanforderungen entspricht, da der Prozess versucht, die tatsächliche Erfahrung eines Nutzers genau widerzuspiegeln.
Zweck von Funktionstests
Funktionstests bestimmen, ob die Anwendung die erwartete Ausgabe erzeugt. Jede Funktion wird auf Übereinstimmung mit den dokumentierten Anforderungen, Spezifikationen und Geschäftsregeln getestet. Damit die Anwendung einen Wert oder eine wahrgenommene Qualität hat, muss sie die Erwartungen der Benutzer erfüllen und die Benutzererfahrung verbessern.
Funktionstests sind ein wichtiger Bestandteil des Testprozesses und des Softwareentwicklungslebenszyklus (SDLC). Wenn eine Anwendung den Funktionstest nicht besteht, wird sie in der Regel nicht für Endbenutzer bereitgestellt.
Um zu überprüfen, ob das System wie vorgesehen funktioniert, können einige oder alle der folgenden Aspekte während der Funktionstests geprüft werden:
- Ein- und Ausgabe (Eingabe- und Ausgabepunkte)
- für Benutzer zugängliche Funktionen
- Benutzeroberflächen (UIs) und Abläufe (Navigation)
- Datenbanken
- Interaktionen zwischen System und Benutzer
- Benutzerrollen und Berechtigungen
- Datenbank und Datenbearbeitung
- Programmierschnittstellen (APIs)
- Sicherheitsfunktionen
- Client/Server-Interaktionen
- Systemintegrationen
- Fehlerbehandlungsprozess
Vorteile von Funktionstests
Der Hauptvorteil von Funktionstests besteht darin, dass sie so gut wie möglich sicherstellen, dass die Anwendung den Endbenutzer zufriedenstellt. Die Tests bestätigen die Arbeitsabläufe und Interaktionen der Benutzer, um sicherzustellen, dass das Produkt ihren Anforderungen entspricht.
Funktionstests bewerten, wie das Produkt auf verschiedene Szenarien und Bedingungen reagiert. Außerdem überprüfen sie, wie verschiedene Komponenten interagieren, und validieren die verschiedenen Funktionen und Fähigkeiten der Anwendung. Die Tests beweisen, dass das Produkt wie erwartet funktioniert und die Ergebnisse den dokumentierten Funktionsspezifikationen und Anforderungen entsprechen.
Diese Art von Tests überprüft auch die Reaktion des Systems auf verschiedene Szenarien und Bedingungen. Dadurch wird sichergestellt, dass das Produkt bei Auftreten dieser Szenarien im realen Leben nicht ausfällt oder die Benutzererfahrung (User Experience, UX) beeinträchtigt.
Neben der Überprüfung, ob alle Anforderungen erfüllt sind, helfen Funktionstests dabei, funktionale Probleme frühzeitig im Softwareentwicklungslebenszyklus zu erkennen. Entwickler können dann Probleme beheben, bevor sie eskalieren und die Projektkosten erhöhen. Funktionstests dokumentieren, dass alle identifizierten Fehler behoben wurden. Dies verbessert die Gesamtqualität, Benutzerfreundlichkeit, Zuverlässigkeit und Stabilität der Anwendung.
Durch Funktionstests können Entwicklerteams sicherstellen, dass die Anwendung mit verschiedenen Plattformen kompatibel ist und nahtlos und fehlerfrei auf allen Plattformen funktioniert. Schließlich wird durch Tests sichergestellt, dass die Sicherheit des Produkts so hoch wie möglich ist und die Software alle relevanten Standards und Vorschriften erfüllt.
Beispiel für Funktionstests
Betrachten wir eine E-Commerce-Website.
So sieht der gesamte Kaufprozess auf der Website aus:
- Der Benutzer erstellt ein Konto, indem er eine E-Mail-Adresse angibt und ein Passwort wählt.
- Der Benutzer meldet sich auf der Website an.
- Der Benutzer durchsucht die Seiten der Website und navigiert zu einem bestimmten Bereich, um sein Produkt zu finden.
ODER
- Der Benutzer gibt einen Suchbegriff in das Suchfeld der Website ein.
- Der Benutzer wählt ein Produkt aus und legt es in seinen Warenkorb.
- Die Website wendet automatisch zum Beispiel geltende Rabatte und kostenlosen Versand auf das Produkt an.
- Der Benutzer überprüft den Endpreis und fährt mit der Zahlung fort.
- Nach erfolgreichem Kauf erhält der Benutzer eine Benachrichtigung.
Bevor die Website live geht, werden die Funktionen getestet, um zu bestätigen, dass dieser Prozess ordnungsgemäß und konsistent funktioniert. Die Tester prüfen alle Anforderungen:
- Die Website ermöglicht es Benutzern, sich mit gültigen Anmeldedaten anzumelden.
- Die Anmeldefunktion behandelt ungültige Anmeldedaten korrekt, indem sie beispielsweise eine Fehlermeldung auf dem Bildschirm anzeigt und den Zugriff verhindert.
- Benutzer können ihr Passwort zurücksetzen, um wieder Zugriff zu erhalten.
- Die Website gibt relevante Ergebnisse als Antwort auf die Suche des Benutzers zurück.
- Benutzer können Artikel in ihren Warenkorb legen.
- Die Website berechnet den Endpreis des Produkts korrekt und zeigt ihn an.
- Das Zahlungs-Gateway akzeptiert gültige Zahlungsmethoden und lehnt ungültige Methoden ab.
- Die Website verarbeitet die Zahlung des Benutzers und zeigt eine Benachrichtigung auf dem Bildschirm an und/oder sendet eine E-Mail an die registrierte E-Mail-Adresse des Benutzers, um den Kauf zu bestätigen.
Fehler in einer dieser Funktionen können die Gesamtfunktionalität, Verfügbarkeit oder Leistung der Website beeinträchtigen und die Benutzererfahrung beeinträchtigen. Funktionstests stellen sicher, dass diese Fehler nicht auftreten und alles korrekt funktioniert.
Wie laufen Funktionstests ab?
Um sinnvolle Funktionsprüfungen durchzuführen, identifizieren die Tester zunächst die Testeingaben (die zu testenden Funktionen). Außerdem erstellen sie Funktions-Testfälle. Ein Testfall ist ein Dokument, das klare Anweisungen zum Testen einer bestimmten Funktion enthält und überprüft, ob diese gemäß den Spezifikationen funktioniert.
Um einzelne Funktionen oder Merkmale zu testen, werden Eingaben in der Software gemacht und die Testfälle mit den identifizierten Eingaben ausgeführt. Die tatsächliche Ausgabe wird mit der erwarteten Ausgabe verglichen. Stimmen beide überein, funktioniert das System wie erwartet. Ist dies nicht der Fall, sind die Ergebnisse fehlerhaft und die Anwendung muss geändert werden.
Die Funktionsprüfung umfasst in der Regel folgende Schritte:
- Identifizieren der Funktionen, die die Software ausführen soll
- Erstellen von Eingabedaten auf der Grundlage der Spezifikationen der einzelnen Funktionen (Festlegen, welche Kernfunktionen getestet werden sollen)
- Festlegen der gewünschten Ausgabe auf der Grundlage der Funktionsspezifikationen
- Ausführen des Testfalls unter Verwendung der identifizierten Eingaben, um zu sehen, wie sich das System verhält
- Vergleichen der tatsächlichen Ausgabe mit der erwarteten Ausgabe
- Aufzeichnen des Fehlers/Fehlers
Nachdem diese Schritte abgeschlossen sind, behebt das Entwicklungsteam die dokumentierten Fehler.
Das Testteam führt dann die Testfälle erneut aus, um zu bestätigen, dass der Fehler behoben wurde. Anschließend markieren sie den Fehler als geschlossen.
Arten von Funktionstests
Zu den Funktionstestverfahren gehören:
- Unit-Test (Modul- oder Komponententest). Die einzelnen Komponenten oder Module der Quellcodebasis, wie Funktionen, Methoden oder Klassen, werden isoliert getestet, um festzustellen, ob sie den Anforderungen entsprechen. Das Ziel besteht darin, sicherzustellen, dass diese Komponenten unter verschiedenen Eingabebedingungen korrekt funktionieren. Unit-Tests sind die schnellste und kostengünstigste Art von Softwaretests und können dazu beitragen, die Codequalität, Zuverlässigkeit und Wartbarkeit zu verbessern.
- Smoke-Test. Eine Reihe von Testfällen dient dazu, zu überprüfen, ob die Hauptmerkmale und Kernfunktionen einer Anwendung einzeln ordnungsgemäß funktionieren, bevor sie kombiniert werden. Mit Smoke-Tests können Testteams feststellen, ob der Build fehlerhaft ist und ob er schwerwiegende Probleme enthält. Mit Smoke-Tests können größere Probleme frühzeitig entdeckt werden, sodass Entwicklungs- und QS-Teams Zeit haben, Korrekturen vorzunehmen und bei Bedarf strengere Tests durchzuführen.
- Sanity-Test. Dies erfolgt nach einem Smoke-Test, um zu überprüfen, ob alle wichtigen Funktionen sowohl einzeln als auch als Teil des Systems korrekt zusammenarbeiten. Es handelt sich um eine Untergruppe des Regressionstests und hat einen engen und tiefen Fokus. Nach einem Sanity-Test können Teams umfangreichere Tests initiieren, um die Softwarequalität weiter zu verbessern.
- Regressionstest. Diese Tests stellen sicher, dass Änderungen an der Codebasis – wie zum Beispiel das Hinzufügen einer neuen Funktion oder Funktionalität oder das Beheben eines Fehlers – die bestehende Funktionalität nicht beeinträchtigen. Regressionstests stellen sicher, dass die Software nach Updates, Leistungsverbesserungen und Fehlerbehebungen stabil bleibt.
- Black-Box-Test. Die Funktionalität der zu testenden Software wird untersucht, ohne ihre interne Funktionsweise, Codestruktur oder Implementierungsdetails zu betrachten. Bei Black-Box-Tests hat der Tester auch keine Kenntnis von internen Pfaden. Er konzentriert sich nur auf das externe Verhalten des Produkts. Diese Art von Funktionstests kann dazu beitragen, Probleme aus der Perspektive des Benutzers aufzudecken und die Benutzererfahrung zu verbessern.
- White-Box-Test. Der White-Box-Test untersucht die Codestruktur, die Anwendungspfade und die internen Pfade des Systems. Das Ziel besteht darin, den Code so zu optimieren, dass er den Qualitätsstandards entspricht, und die internen Funktionen des Systems zu validieren, um sicherzustellen, dass sie wie vorgesehen funktionieren.
- Gray-Box-Test. Dieser Test kombiniert Aspekte des Black-Box- und des White-Box-Tests. Der Tester verfügt über teilweise Kenntnisse über die internen Abläufe. Dadurch kann er gezieltere Testfälle entwerfen, um die Testabdeckung zu erhöhen und das externe Verhalten des Systems zu validieren, insbesondere in Bereichen mit hohem Risiko.
- Integrationstest. Integrationstests stellen fest, ob verschiedene Subsysteme oder Komponenten ordnungsgemäß kompatibel sind, um grundlegende Funktionen auszuführen. Die Tests überprüfen, ob die einzelnen Module des Systems gut zusammenarbeiten, um die erwarteten Ergebnisse zu erzielen. Auch APIs sollten getestet werden.
- Benutzerakzeptanztest. Benutzerakzeptanztests werden von tatsächlichen Benutzern durchgeführt, um sicherzustellen, dass die Software die erforderlichen Aufgaben in realen Szenarien gemäß den Spezifikationen ausführen kann. Tester führen Benutzerakzeptanztests vor der Inbetriebnahme durch, um zu bestätigen, dass die Software benutzerfreundlich ist, den Anforderungen der Benutzer entspricht und für den Einsatz bereit ist.

Funktionstests versus nicht-funktionale Tests
Funktionstests konzentrieren sich darauf, die Fähigkeit einer Anwendung zur Ausführung einer Aufgabe zu testen. Das Ziel besteht hauptsächlich darin, sicherzustellen, dass ihre Funktionen wie erwartet funktionieren und ihre operativen Aspekte den festgelegten funktionalen Anforderungen entsprechen.
Im Gegensatz dazu befassen sich nicht-funktionale Tests mit den nicht-funktionalen Aspekten der Anwendung, wie zum Beispiel ihrer Gesamtleistung, Skalierbarkeit, Zuverlässigkeit, Sicherheit und Kompatibilität. Anstatt zu überprüfen, ob die Software bestimmte Anforderungen erfüllt, bewerten die Tester ihre Leistung unter verschiedenen Bedingungen.
Bei funktionalen Tests geht es nicht darum, wie die Verarbeitung erfolgt, sondern vielmehr um die Ergebnisse der Verarbeitung. Obwohl funktionale Tests die tatsächliche Nutzung des Systems simulieren, werden dabei keine Annahmen zur Systemstruktur getroffen.
Tester können sowohl für funktionale als auch für nicht-funktionale Tests verschiedene Techniken anwenden.
Zu den gängigen Techniken für funktionale Tests gehören:
- Entscheidungsbasierte Tests. Der Tester überprüft mögliche Ergebnisse, wenn eine bestimmte Bedingung erfüllt ist, indem er die Wenn-Dann- oder Wenn-Dann-Sonst-Logik verwendet.
- Endbenutzerbasierte Tests. Tester prüfen, ob alle Komponenten des Systems korrekt zusammenarbeiten und keine Fehler verursachen.
- Äquivalenztests. Tester erstellen Äquivalenzdatenfälle, um zu überprüfen, ob sich zwei Versionen des Systems unter denselben Bedingungen gleich verhalten.
- Grenzwerttests. Diese Tests bewerten, wie sich das System verhält, wenn Datengrenzen – Minimum, Maximum, knapp darüber, knapp darunter – implementiert werden.
- Ad-hoc-Tests. Hierbei prüfen Tester das System ohne vordefinierte Testfälle, um Fehler aufzudecken, die zuvor möglicherweise übersehen wurden.
Zu den gängigen Techniken für nicht-funktionale Tests gehören Leistungstests, Lasttests, Tests der Benutzbarkeit und Stresstests.
Funktionale Test-Tools
Viele Tools unterstützen funktionale Tests. Dazu gehören:
- Selenium. Dieses Open-Source-Framework für funktionale Tests wird zur Automatisierung von Webanwendungen für Test- und webbasierte Verwaltungsaufgaben verwendet. Die Tests können in vielen verschiedenen Programmiersprachen erstellt und auf mehreren Browsern oder Plattformen ausgeführt werden.
- OpenText Unified Functional Testing. Dieses Tool automatisiert funktionale Tests über mehrere Anwendungsschichten hinweg für viele wichtige Anwendungsumgebungen und Entwicklungstechnologien. Neben mehrschichtigen Tests unterstützt es auch GUI-Tests und Regressionstests.
- TestingWhiz. Dies ist ein codeloses Testautomatisierungs-Tool zum Testen mehrerer Szenarien wie Web-, Datenbank-, Regressions- und Mobile-Tests innerhalb desselben Testfalls. Es enthält zahlreiche nützliche Funktionen, wie einen Selenium-Java-Editor, einen Job-Scheduler sowie die Aufzeichnung und Wiedergabe von Testfällen, um Funktionstests zu vereinfachen. Es lässt sich in viele Tools, Frameworks und Plattformen integrieren, um eine nahtlose Ausführung von Testfällen über mehrere Browser, Umgebungen und Bedingungen hinweg zu gewährleisten.
- JUnit. Hierbei handelt es sich um ein Framework zum Testen von Java-Anwendungen, das jedoch auch beim Testen von Anwendungen in vielen anderen Sprachen hilft. Es unterstützt mehrere Testfälle und kann Testergebnisse ausgeben.
- Watir (Web Application Testing in Ruby). Hierbei handelt es sich um ein Open Source Tool für Funktionstests, das aus Ruby-Skriptsprachenbibliotheken besteht.
Moderne Funktionstest-Tools optimieren den Prozess der Überprüfung der Softwarefunktionalität durch Automatisierung. Viele dieser Tools sind einfach zu bedienen und skalierbar, um Testläufe mit hohem Volumen zu bewältigen. Mit nützlichen Tools können Tester Testfälle in mehreren Programmiersprachen schreiben und die Fälle auf mehreren Plattformen und Browsern ausführen.
Die besten Tools lassen sich in CI/CD-Pipelines integrieren, sodass Teams bei Bedarf und während jedes Build-Zyklus eine beliebige Anzahl automatisierter Tests ausführen können. Mit diesen Tools können Benutzer Testfälle wiederverwenden und so Zeit und Aufwand sparen. Schließlich vereinfachen intelligente Tools die Pflege von Testfällen, sodass Entwicklungs- und Testteams die Fälle im Zuge der Weiterentwicklung der Anwendung leicht ändern oder aktualisieren können.