Als Software-Test bezeichnet man in der Informatik
ein mögliches Verfahren zur teilweisen Verifikation bzw.
Validierung eines Programms.
Ein Software-Test dient der Qualitätssicherung eines neu
erstellten oder geänderten Softwareprogramms. Dabei geht
es prinzipiell darum, das tatsächliche Verhalten mittels
Testfällen zu untersuchen und die Ergebnisse mit den erwarteten
Ergebnissen (Anforderungskatalog, Normen usw...) zu vergleichen.
Es handelt sich um eine Phase der Softwareentwicklung in der das
Computerprogramm auf seine Funktionalitäten hin getestet
wird. Der Test kann verschiedene Ausprägungen haben: So gibt
es den Code and Unit-Test (Komponententest), der vom Entwickler
durchgeführt wird und bei dem das Programm auf Syntax- und
Logikfehler überprüft wird. Beim Integrationstest testet
die Softwareproduktion in einer Testumgebung die Einbindung der
Software in die bereits vorhandene Softwarearchitektur.
In der Praxis werden Tests eingesetzt, um Programmfehler (Bugs)
oder deren Wiederauftreten (Regression) zu vermeiden.
Man kann Testmethoden folgendermaßen klassifizieren:
• Statische Tests
o Verifizierend
o Analysierend
• Dynamische Tests
o Strukturorientierte Tests
o Funktionsorientierte Tests
? Funktionale Äquivalenzklassenbildung
? Zustandsbasierter Test
? Ursache-Wirkungs-Analyse
• Black-Box-Test
• White-Box-Test
Abgrenzung
In ihrem Selbstverständnis sind Tests klar abzugrenzen von
• der klassischen Verifikation, welche einen Korrektheitsbeweis
verwendet,
• dem einfachen Experiment oder Ausprobieren, in der Fachsprache
des Software-Testens als "Try" (engl. für Versuch)
bezeichnet. Während in den Naturwissenschaften an ein Experiment
höhere Anforderungen gestellt werden als an die Tests, ist
dies in der Informatik umgekehrt.
Als Naturwissenschaftler kann man sich einen Test dabei als Experiment
vorstellen, das nicht nur mit den gleichen Bedingungen, sondern
auch unterschiedlichen Bedingungen, den Test-Parametern, genau
definiert wiederholbar sein muss.
Klassifikation nach Ablauf, Umfang
Es gibt unter anderem folgende Bezeichnungen für spezielle
Arten von Tests:
• Funktionale Tests, Abnahmetests, Akzeptanztests und Systemtests
dienen dazu, die vom Abnehmer des Programms erwartete Funktionalität
des Systems im normalen Gebrauch und somit die Akzeptanz beim
Abnehmer sicherzustellen.
o Beim Abnahmetest testet der Auftraggeber, ob das Programm den
vereinbarten Anforderungen entspricht.
• Destruktionstests sollen das korrekte (ein definiertes)
Verhalten bei unnormalem Gebrauch sicherstellen.
• Modultests, Unit-Tests und Component Tests testen die
Funktionalität einzelner kleiner Programmelemente.
• Schnittstellentests testen die Funktionalität bei
der Zusammenarbeit voneinander unabhängiger Komponenten unter
Einsatz einer einzelnen Komponente und einer Spezifikation, beispielsweise
mit Hilfe eines Mocks.
• Interoperabilitätstests testen die Funktionalität
bei der Zusammenarbeit voneinander unabhängiger Komponenten
unter Einsatz mehrerer Komponenten.
• Integrationstests bzw. Interaktionstests testen die Zusammenarbeit
voneinander abhängiger Komponenten.
• Regressionstests nennt man Tests, wenn man sie dazu einsetzt,
das Wiederauftreten bereits behobener Bugs zu entdecken.
• Installationstests testen die Funktionalität unter
verschiedenen Systemumgebungen.
• Oberflächentests testen die Benutzerschnittstelle
des Systems.
• Stresstests sind Tests, die das Verhalten eines Systems
unter Ausnahmesituationen analysieren. Im Engeren Sinne handelt
es sich bei Stresstests in der Praxis meist nicht um Tests, sondern
um mit Hilfe von Testwerkzeugen erstellte Tries.
• Crashtests sind Stresstests, die versuchen, das System
zum Absturz zu bringen.
• Lasttests sind Stresstests, die das Systemverhalten unter
besonders hohen Speicher- oder CPU-Anforderungen analysieren.
• Performance Tests sind Tests, die ein korrektes Systemverhalten
bei bestimmten Speicher- und CPU-Anforderungen sicherstellen sollen.
• Sicherheitstests testen ein System gegen potentielle Sicherheitslücken.
• Zufallstests sind Tests basierend auf Zufallsdaten.
Klassifikation nach Informationsstand
Neben dieser Einordnung anhand des Ablaufs und Umfangs des Tests
lassen sich Tests auch nach Wissen über die zu testende Komponente
einordnen:
• Black-Box-Tests werden von Programmierern und Testern
entwickelt, die keine Kenntnisse über den inneren Aufbau
des zu testenden Systems haben. In der Praxis werden Black-Box-Tests
meist von speziellen Test-Abteilungen oder Test-Teams entwickelt.
• White-Box-Tests werden von den gleichen Programmierern
entwickelt wie das zu testende System selbst. Der den Test entwickelnde
Programmierer hat also Kenntnisse über das zu testende System.
• Grey-Box-Tests werden von den gleichen Programmierern
entwickelt wie das zu testende System selbst, allerdings nach
der Testgesteuerten Programmierung, das heißt vor dem und
damit ohne Kenntnisse über das zu testende System.
White-Box-Tests sind kurzfristig kostengünstiger, zeigen
in der Praxis allerdings eine äußerst hohe Durchlässigkeit
für Fehler.
Black-Box-Tests decken besonders viele Fehler auf, erweisen sich
in der Praxis aber zum einen als organisatorisch aufwändig
und zum anderen manchmal auch als sozial unverträglich wegen
eventueller Spannungen zwischen den Test- und den Entwicklungsabteilungen.
Grey-Box-Tests (Testgesteuerte Programmierung) erweisen sich derzeit
in der Praxis als besonders erfolgreich, da sie die Kostengünstigkeit
von White-Box-Tests mit der Effizenz von Black-Box-Tests verbinden,
sind allerdings außerhalb ihres üblichen Kontext des
Extreme Programming oder zumindest der testgesteuerten Programmierung
nicht unkritisch zu betrachten, da Software-Entwickler sonst leicht
zu White-Box-Tests abdriften und so die Black-Box-Test-artigen
Vorteile der Grey-Box-Tests verlieren.
Automatisierte Tests
Für den Praxiseinsatz ist die Automatisierung von Tests besonders
wichtig. Tests werden im Idealfall nach jeder Änderung ausgeführt.
Bei nicht automatisierten Tests wäre dabei der für das
Durchführen der Tests notwendige Aufwand zu groß, sodass
man häufig auf die Tests verzichten würde, was wiederum
den Nutzen der Tests stark verringert.
|